X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pad.c;h=06f0417f16cf77489c019625613ff6987fa59ff7;hb=ad517f75025ba4de08890f9694f2e535efc32ab4;hp=dff9a7f947f7e1eece49229537c315e0b3918a3c;hpb=929a0744021ffa24a9c2c65030b2f147d2412c41;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pad.c b/pad.c index dff9a7f..06f0417 100644 --- a/pad.c +++ b/pad.c @@ -257,11 +257,19 @@ Perl_pad_undef(pTHX_ CV* cv) && CvOUTSIDE(innercv) == cv) { assert(CvWEAKOUTSIDE(innercv)); - CvWEAKOUTSIDE_off(innercv); - CvOUTSIDE(innercv) = outercv; - CvOUTSIDE_SEQ(innercv) = seq; - SvREFCNT_inc(outercv); + /* don't relink to grandfather if he's being freed */ + if (outercv && SvREFCNT(outercv)) { + CvWEAKOUTSIDE_off(innercv); + CvOUTSIDE(innercv) = outercv; + CvOUTSIDE_SEQ(innercv) = seq; + SvREFCNT_inc(outercv); + } + else { + CvOUTSIDE(innercv) = Nullcv; + } + } + } } } @@ -558,7 +566,7 @@ Perl_pad_findmy(pTHX_ char *name) && !SvFAKE(namesv) && (SvFLAGS(namesv) & SVpad_OUR) && strEQ(SvPVX(namesv), name) - && (U32)I_32(SvNVX(namesv)) == PAD_MAX /* min */ + && U_32(SvNVX(namesv)) == PAD_MAX /* min */ ) return offset; } @@ -631,8 +639,8 @@ S_pad_findlex(pTHX_ char *name, CV* cv, U32 seq, int warn, { if (SvFAKE(namesv)) fake_offset = offset; /* in case we don't find a real one */ - else if ( seq > (U32)I_32(SvNVX(namesv)) /* min */ - && seq <= (U32)SvIVX(namesv)) /* max */ + else if ( seq > U_32(SvNVX(namesv)) /* min */ + && seq <= (U32)SvIVX(namesv)) /* max */ break; } } @@ -656,7 +664,7 @@ S_pad_findlex(pTHX_ char *name, CV* cv, U32 seq, int warn, DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad findlex cv=0x%"UVxf" matched: offset=%ld (%ld,%ld)\n", - PTR2UV(cv), (long)offset, (long)I_32(SvNVX(*out_name_sv)), + PTR2UV(cv), (long)offset, (long)U_32(SvNVX(*out_name_sv)), (long)SvIVX(*out_name_sv))); } else { /* fake match */ @@ -664,7 +672,7 @@ S_pad_findlex(pTHX_ char *name, CV* cv, U32 seq, int warn, *out_name_sv = name_svp[offset]; /* return the namesv */ *out_flags = SvIVX(*out_name_sv); DEBUG_Xv(PerlIO_printf(Perl_debug_log, - "Pad findlex cv=0x%"UVxf" matched: offset=%ld flags=0x%x index=%lu\n", + "Pad findlex cv=0x%"UVxf" matched: offset=%ld flags=0x%lx index=%lu\n", PTR2UV(cv), (long)offset, (unsigned long)*out_flags, (unsigned long)SvNVX(*out_name_sv) )); @@ -720,7 +728,7 @@ S_pad_findlex(pTHX_ char *name, CV* cv, U32 seq, int warn, CvDEPTH(cv) ? CvDEPTH(cv) : 1])[offset]; DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad findlex cv=0x%"UVxf" found lex=0x%"UVxf"\n", - PTR2UV(cv), *out_capture)); + PTR2UV(cv), PTR2UV(*out_capture))); if (SvPADSTALE(*out_capture)) { if (ckWARN(WARN_CLOSURE)) @@ -925,7 +933,7 @@ Perl_intro_my(pTHX) DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad intromy: %ld \"%s\", (%ld,%ld)\n", (long)i, SvPVX(sv), - (long)I_32(SvNVX(sv)), (long)SvIVX(sv)) + (long)U_32(SvNVX(sv)), (long)SvIVX(sv)) ); } } @@ -973,7 +981,7 @@ Perl_pad_leavemy(pTHX) DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad leavemy: %ld \"%s\", (%ld,%ld)\n", (long)off, SvPVX(sv), - (long)I_32(SvNVX(sv)), (long)SvIVX(sv)) + (long)U_32(SvNVX(sv)), (long)SvIVX(sv)) ); } } @@ -1258,7 +1266,7 @@ Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full) (int) ix, PTR2UV(ppad[ix]), (unsigned long) (ppad[ix] ? SvREFCNT(ppad[ix]) : 0), - (long)I_32(SvNVX(namesv)), + (long)U_32(SvNVX(namesv)), (long)SvIVX(namesv), SvPVX(namesv) );