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.