Change 34210 by [EMAIL PROTECTED] on 2008/08/20 23:43:01

        Assert that backreferences array is not freed rather than handling it
        
        In several places where the weakrefs backreferences array is used
        or freed, the code checks whether the array has already been freed
        and if so skips. Since the array already being freed is a bad bug,
        lets instead assert that this never happens, based on the
        assumptions that (a) such premature freeing bugs are likely ironed
        out by now, (b) if they aren't then we want to know about them and
        fix them rather than silently skip.

Affected files ...

... //depot/perl/sv.c#1550 edit

Differences ...

==== //depot/perl/sv.c#1550 (text) ====
Index: perl/sv.c
--- perl/sv.c#1549~34209~       2008-08-20 16:15:36.000000000 -0700
+++ perl/sv.c   2008-08-20 16:43:01.000000000 -0700
@@ -5086,14 +5086,11 @@
        if (mg)
            av = (AV *)mg->mg_obj;
     }
-    if (!av) {
-       if (PL_in_clean_all)
-           return;
+
+    if (!av)
        Perl_croak(aTHX_ "panic: del_backref");
-    }
 
-    if (SvIS_FREED(av))
-       return;
+    assert(!SvIS_FREED(av));
 
     svp = AvARRAY(av);
     /* We shouldn't be in here more than once, but for paranoia reasons lets
@@ -5123,9 +5120,8 @@
     PERL_ARGS_ASSERT_SV_KILL_BACKREFS;
     PERL_UNUSED_ARG(sv);
 
-    /* Not sure why the av can get freed ahead of its sv, but somehow it does
-       in ext/B/t/bytecode.t test 15 (involving print <DATA>)  */
-    if (svp && !SvIS_FREED(av)) {
+    assert(!svp || !SvIS_FREED(av));
+    if (svp) {
        SV *const *const last = svp + AvFILLp(av);
 
        while (svp <= last) {
End of Patch.

Reply via email to