Math-Pari
view release on metacpan or search on metacpan
) : ( \
(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 )