Change 20631 by [EMAIL PROTECTED] on 2003/08/12 08:09:43

        A new try from Dave Mitchell for [perl #23265].

Affected files ...

... //depot/perl/pad.c#27 edit
... //depot/perl/t/op/closure.t#21 edit

Differences ...

==== //depot/perl/pad.c#27 (text) ====
Index: perl/pad.c
--- perl/pad.c#26~20602~        Sun Aug 10 12:45:45 2003
+++ perl/pad.c  Tue Aug 12 01:09:43 2003
@@ -257,11 +257,19 @@
                    && 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;
+                   }
+
                }
+
            }
        }
     }

==== //depot/perl/t/op/closure.t#21 (xtext) ====
Index: perl/t/op/closure.t
--- perl/t/op/closure.t#20~20602~       Sun Aug 10 12:45:45 2003
+++ perl/t/op/closure.t Tue Aug 12 01:09:43 2003
@@ -13,7 +13,7 @@
 
 use Config;
 
-print "1..184\n";
+print "1..185\n";
 
 my $test = 1;
 sub test (&) {
@@ -641,4 +641,27 @@
     test { $a{7}->()->() + $a{11}->()->() == 18 };
 }
 
+# bugid #23265 - this used to coredump during destruction of PL_maincv
+# and its children
+
+require './test.pl';
+
+my $got = runperl(
+    prog => q[
+       print
+           sub {$_[0]->(@_)} -> (
+               sub {
+                   $_[1]
+                       ?  $_[0]->($_[0], $_[1] - 1) .  sub {"x"}->()
+                       : "y"
+               },   
+               2
+           )
+           , "\n"
+       ;            
+    
+    ],
+    stderr => 1
+);
+test { $got eq "yxx\n" };
 
End of Patch.

Reply via email to