1 Math::Pari doesn't work properly with Data::Dumper[1], so try at least to
2 avoid crash when trying to DESTROY something restored from dump
3 (most likely to happen on 64-bit machines, when Data::Dumper uses string
4 instead of int for pointer values which don't fit in 32 bits).
6 [1] Data::Dumper returns something like
7 bless( do{\(my $o = POINTER_VAL)}, 'Math::Pari' );
8 where POINTER_VAL is just value of pointer to already existing Pari
9 object (which may be destroyed later!).
11 --- Math-Pari-2.01080605/Pari.xs.orig 2004-01-31 10:06:08.000000000 +0100
12 +++ Math-Pari-2.01080605/Pari.xs 2004-05-15 21:11:38.894463600 +0200
13 @@ -1285,6 +1285,13 @@
17 + /* check if it exists on stack to avoid crash */
18 + for (sv1 = PariStack; sv1 != sv; sv1 = nextsv) {
19 + nextsv = (SV *) SvPVX(sv1);
20 + if((char*)nextsv == GENfirstOnStack)
21 + return -1; /* not on stack! */
24 for (sv1 = PariStack; sv1 != sv; sv1 = nextsv) {
26 SV_OAVMA_switch(nextsv, sv1, GENmovedOffStack); /* Mark as moved off stack. */
28 long oldavma; /* The value of avma on the entry
29 * to function having the SV as
33 SV_OAVMA_PARISTACK_get(sv, oldavma, ostack);
37 /* Now fall through: */
38 /* case (IV)GENfirstOnStack: */
39 /* Now sv is the newest one on stack. */
43 if (oldavma > sentinel) {
45 avma = oldavma; /* Mark the space on stack as free. */
47 PariStack = (SV*)ostack; /* The same on the Perl/PARI side. */