more valgrinding: select problem?
[p5sagit/p5-mst-13.2.git] / pad.c
diff --git a/pad.c b/pad.c
index dff9a7f..06f0417 100644 (file)
--- 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)
                );