Math-Pari

 view release on metacpan or  search on metacpan

Pari.xs  view on Meta::CPAN

	) : (							\
	    (level) = SvCUR(sv),				\
	    (stack) = SvPVX(sv), (void)0			\
	))

#define SV_OAVMA_switch(next, sv, newval)			\
    ( NEED_SLOW_ARRAY_ACCESS(sv) ? (				\
	(next) = (SV *)AvARRAY(sv),				\
	AV_SET_LEVEL(sv, newval), (void)0			\
    ) : (							\
	next = (SV *) SvPVX(sv),				\
	SvPVX(sv) = newval, (void)0					\
    ))

#define SV_Stack_find_next(sv)			\
    ( NEED_SLOW_ARRAY_ACCESS(sv) ? (				\
	(SV *)AvARRAY(sv)					\
    ) : (							\
	(SV *) SvPVX(sv)					\
    ))

#define GENmovedOffStack ((char*) 1) /* Just an atom. */
#define GENfirstOnStack ((char*) 2) /* Just an atom. */
#define GENheap NULL
#define ifact mpfact

#if PARI_VERSION_EXP >= 2004002
typedef SV	* PariVar;		/* For loop variables. */
#else
typedef entree	* PariVar;		/* For loop variables. */
#endif

typedef entree	* PariName;		/* For changevalue.  */
#if PARI_VERSION_EXP >= 2004002
typedef GEN PariExpr, PariExpr2, PariExprV;
#else
typedef char * PariExpr, *PariExpr2, *PariExprV;
#endif
typedef GEN * GEN_Ptr;

#if PARI_VERSION_EXP >= 2004002			/* Undocumented when it appeared; present in 2.5.0 */
#  define AssignPariExprR(var,arg,is_void,sv)					\
	((SvROK(arg) && (SvTYPE(SvRV(arg)) == SVt_PVCV)) ?		\
	  (var = make_trampolinecv(SvRV(arg),is_void,sv))		\
	 : (warn("Argument-types E,I of string type not supported yet, substituting x->1"), var = code_return_1))
#  define AssignPariExpr2R(var,arg,is_void,sv1,sv2)	(warn("Argument-types E,I not supported yet, substituting (x,y)->1"), var = code2_return_1)
#else	/* PARI_VERSION_EXP < 2004002 */	/* Undocumented when it appeared; present in 2.5.0 */
#  define AssignPariExprR(var,arg,is_void,sv)					\
	((SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVCV) ?		\
	  (var = ((char*)&(SvRV(arg)->sv_flags)) + LSB_in_U32)		\
	 : (var = (char *)SvPV(arg,na)))
#  define AssignPariExpr2R(var,arg,is_void,sv1,sv2)	AssignPariExprR(var,arg,is_void,sv1)
#endif	/* PARI_VERSION_EXP < 2004002 */	/* Undocumented when it appeared; present in 2.5.0 */

#define MAYBE_NOTVOID	0			/* Used in 'typemap' - but only for Expr2 now */
#define AssignPariExpr2(var,arg)	AssignPariExpr2R(var,arg,MAYBE_NOTVOID, 0, 0)
#define AssignPariExprR0(var,arg,is_void)	AssignPariExprR(var,arg,is_void,0)

XS((*math_pari_subaddr));		/* On CygWin XS() has attribute conflicting with static */

#if defined(MYMALLOC) && defined(EMBEDMYMALLOC) && defined(UNEMBEDMYMALLOC)

Malloc_t
malloc(register size_t nbytes)
{
    return Perl_malloc(nbytes);
}

Free_t
free(void *mp)
{
    Perl_mfree(mp);			/* What to return? */
}

Malloc_t
realloc(void *mp, size_t nbytes)
{
    return Perl_realloc(mp, nbytes);
}

#endif

/* We make a "fake" PVAV, not enough entries.  */

/* This macro resets avma *immediately* if IN is a global
   static GEN (such as gnil, gen_1 etc).  So it should be called near
   the end of stack-manipulating scope */
#define setSVpari(sv, in, oldavma)	\
		setSVpari_or_do(sv, in, oldavma, avma = oldavma)

#define setSVpari_keep_avma(sv, in, oldavma)	\
		setSVpari_or_do(sv, in, oldavma, ((void)0))

#define setSVpari_or_do(sv, in, oldavma, action) do {		\
    sv_setref_pv(sv, "Math::Pari", (void*)in);			\
    morphSVpari(sv, in, oldavma, action);			\
} while (0)

#define morphSVpari(sv, in, oldavma, action) do {		\
    if (is_matvec_t(typ(in)) && SvTYPE(SvRV(sv)) != SVt_PVAV) {	\
	make_PariAV(sv);					\
    }								\
    if (isonstack(in)) {					\
	SV* g = SvRV(sv);					\
	SV_OAVMA_PARISTACK_set(g, oldavma - myPARI_bot, PariStack);	\
	PariStack = g;						\
	perlavma = avma;					\
	onStack_inc;						\
    } else {							\
	action;							\
    }								\
    SVnum_inc;							\
} while (0)

#if PARI_VERSION_EXP < 2002005
typedef long pari_sp;
#endif

SV* PariStack;			/* PariStack keeps the latest SV that
				 * keeps a GEN on stack. */
pari_sp perlavma;			/* How much stack is needed



( run in 1.207 second using v1.01-cache-2.11-cpan-71847e10f99 )