From: Jarkko Hietaniemi Date: Fri, 19 Oct 2001 14:20:15 +0000 (+0000) Subject: Retract the #10451 which seems to be the cause X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=afa38808e08264de7bcd3b2241ab41424d64d0d4;p=p5sagit%2Fp5-mst-13.2.git Retract the #10451 which seems to be the cause of the major leakage from while(){eval"sub{}"} p4raw-id: //depot/perl@12506 --- diff --git a/op.c b/op.c index ea5d922..282b3b4 100644 --- a/op.c +++ b/op.c @@ -4249,15 +4249,9 @@ Perl_cv_undef(pTHX_ CV *cv) * CV, they don't hold a refcount on the outside CV. This avoids * the refcount loop between the outer CV (which keeps a refcount to * the closure prototype in the pad entry for pp_anoncode()) and the - * closure prototype, and the ensuing memory leak. This does not - * apply to closures generated within eval"", since eval"" CVs are - * ephemeral. --GSAR */ - if (!CvANON(cv) || CvCLONED(cv) - || (CvOUTSIDE(cv) && SvTYPE(CvOUTSIDE(cv)) == SVt_PVCV - && CvEVAL(CvOUTSIDE(cv)) && !CvGV(CvOUTSIDE(cv)))) - { + * closure prototype, and the ensuing memory leak. --GSAR */ + if (!CvANON(cv) || CvCLONED(cv)) SvREFCNT_dec(CvOUTSIDE(cv)); - } CvOUTSIDE(cv) = Nullcv; if (CvCONST(cv)) { SvREFCNT_dec((SV*)CvXSUBANY(cv).any_ptr); @@ -4904,17 +4898,12 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block) } } - /* If a potential closure prototype, don't keep a refcount on - * outer CV, unless the latter happens to be a passing eval"". + /* If a potential closure prototype, don't keep a refcount on outer CV. * This is okay as the lifetime of the prototype is tied to the * lifetime of the outer CV. Avoids memory leak due to reference * loop. --GSAR */ - if (!name && CvOUTSIDE(cv) - && !(SvTYPE(CvOUTSIDE(cv)) == SVt_PVCV - && CvEVAL(CvOUTSIDE(cv)) && !CvGV(CvOUTSIDE(cv)))) - { + if (!name) SvREFCNT_dec(CvOUTSIDE(cv)); - } if (name || aname) { char *s; diff --git a/t/run/kill_perl.t b/t/run/kill_perl.t index ce98e01..7e4f3a8 100644 --- a/t/run/kill_perl.t +++ b/t/run/kill_perl.t @@ -629,16 +629,6 @@ EOT EXPECT ok ######## -# test that closures generated by eval"" hold on to the CV of the eval"" -# for their entire lifetime -$code = eval q[ - sub { eval '$x = "ok 1\n"'; } -]; -&{$code}(); -print $x; -EXPECT -ok 1 -######## # This test is here instead of pragma/locale.t because # the bug depends on in the internal state of the locale # settings and pragma/locale messes up that state pretty badly.