From: Jarkko Hietaniemi Date: Thu, 21 Aug 2003 04:42:56 +0000 (+0000) Subject: Retract #19064, broke mod_perl flushing (localisation of $|). X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ed08b2c61bbd3fcbc9931b185a9cf6a0a56f9acf;p=p5sagit%2Fp5-mst-13.2.git Retract #19064, broke mod_perl flushing (localisation of $|). http://public.activestate.com/cgi-bin/perlbrowse?patch=19064 http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2003-08/msg01466.html p4raw-id: //depot/perl@20795 --- diff --git a/pp_ctl.c b/pp_ctl.c index 3c2223a..3c08f22 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -1942,7 +1942,6 @@ PP(pp_return) } PL_stack_sp = newsp; - LEAVE; /* Stack values are safe: */ if (popsub2) { POPSUB(cx,sv); /* release CV and @_ ... */ @@ -1951,6 +1950,7 @@ PP(pp_return) sv = Nullsv; PL_curpm = newpm; /* ... and pop $1 et al */ + LEAVE; LEAVESUB(sv); if (clear_errsv) sv_setpv(ERRSV,""); @@ -2026,7 +2026,6 @@ PP(pp_last) SP = newsp; PUTBACK; - LEAVE; /* Stack values are safe: */ switch (pop2) { case CXt_LOOP: @@ -2039,6 +2038,7 @@ PP(pp_last) } PL_curpm = newpm; /* ... and pop $1 et al */ + LEAVE; LEAVESUB(sv); return nextop; } diff --git a/pp_hot.c b/pp_hot.c index 04442c9..8b31f0b 100644 --- a/pp_hot.c +++ b/pp_hot.c @@ -2328,10 +2328,10 @@ PP(pp_leavesub) } PUTBACK; - LEAVE; POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */ PL_curpm = newpm; /* ... and pop $1 et al */ + LEAVE; LEAVESUB(sv); return pop_return(); } @@ -2384,9 +2384,9 @@ PP(pp_leavesublv) * the refcounts so the caller gets a live guy. Cannot set * TEMP, so sv_2mortal is out of question. */ if (!CvLVALUE(cx->blk_sub.cv)) { - LEAVE; POPSUB(cx,sv); PL_curpm = newpm; + LEAVE; LEAVESUB(sv); DIE(aTHX_ "Can't modify non-lvalue subroutine call"); } @@ -2395,9 +2395,9 @@ PP(pp_leavesublv) EXTEND_MORTAL(1); if (MARK == SP) { if (SvFLAGS(TOPs) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) { - LEAVE; POPSUB(cx,sv); PL_curpm = newpm; + LEAVE; LEAVESUB(sv); DIE(aTHX_ "Can't return %s from lvalue subroutine", SvREADONLY(TOPs) ? (TOPs == &PL_sv_undef) ? "undef" @@ -2410,9 +2410,9 @@ PP(pp_leavesublv) } } else { /* Should not happen? */ - LEAVE; POPSUB(cx,sv); PL_curpm = newpm; + LEAVE; LEAVESUB(sv); DIE(aTHX_ "%s returned from lvalue subroutine in scalar context", (MARK > SP ? "Empty array" : "Array")); @@ -2426,9 +2426,9 @@ PP(pp_leavesublv) && SvFLAGS(*mark) & (SVs_TEMP | SVs_PADTMP | SVf_READONLY)) { /* Might be flattened array after $#array = */ PUTBACK; - LEAVE; POPSUB(cx,sv); PL_curpm = newpm; + LEAVE; LEAVESUB(sv); DIE(aTHX_ "Can't return a %s from lvalue subroutine", SvREADONLY(TOPs) ? "readonly value" : "temporary"); @@ -2480,10 +2480,10 @@ PP(pp_leavesublv) } PUTBACK; - LEAVE; POPSUB(cx,sv); /* Stack values are safe: release CV and @_ ... */ PL_curpm = newpm; /* ... and pop $1 et al */ + LEAVE; LEAVESUB(sv); return pop_return(); } diff --git a/scope.c b/scope.c index 33d891e..75f59cf 100644 --- a/scope.c +++ b/scope.c @@ -624,9 +624,6 @@ Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr) SSPUSHINT(idx); SSPUSHPTR(SvREFCNT_inc(*sptr)); SSPUSHINT(SAVEt_AELEM); - /* if it gets reified later, the restore will have the wrong refcnt */ - if (!AvREAL(av) && AvREIFY(av)) - SvREFCNT_inc(*sptr); save_scalar_at(sptr); sv = *sptr; /* If we're localizing a tied array element, this new sv @@ -709,7 +706,7 @@ Perl_leave_scope(pTHX_ I32 base) value = (SV*)SSPOPPTR; gv = (GV*)SSPOPPTR; ptr = &GvSV(gv); - av = (AV*)gv; /* what to refcnt_dec */ + SvREFCNT_dec(gv); goto restore_sv; case SAVEt_GENERIC_PVREF: /* generic pv */ str = (char*)SSPOPPTR; @@ -742,7 +739,6 @@ Perl_leave_scope(pTHX_ I32 base) case SAVEt_SVREF: /* scalar reference */ value = (SV*)SSPOPPTR; ptr = SSPOPPTR; - av = Nullav; /* what to refcnt_dec */ restore_sv: sv = *(SV**)ptr; DEBUG_S(PerlIO_printf(Perl_debug_log, @@ -778,8 +774,6 @@ Perl_leave_scope(pTHX_ I32 base) SvSETMAGIC(value); PL_localizing = 0; SvREFCNT_dec(value); - if (av) /* actually an av, hv or gv */ - SvREFCNT_dec(av); break; case SAVEt_AV: /* array reference */ av = (AV*)SSPOPPTR; @@ -989,14 +983,13 @@ Perl_leave_scope(pTHX_ I32 base) value = (SV*)SSPOPPTR; i = SSPOPINT; av = (AV*)SSPOPPTR; - if (!AvREAL(av) && AvREIFY(av)) /* undo reify guard */ - SvREFCNT_dec(value); ptr = av_fetch(av,i,1); if (ptr) { sv = *(SV**)ptr; if (sv && sv != &PL_sv_undef) { if (SvTIED_mg((SV*)av, PERL_MAGIC_tied)) (void)SvREFCNT_inc(sv); + SvREFCNT_dec(av); goto restore_sv; } } @@ -1014,8 +1007,8 @@ Perl_leave_scope(pTHX_ I32 base) ptr = &HeVAL((HE*)ptr); if (SvTIED_mg((SV*)hv, PERL_MAGIC_tied)) (void)SvREFCNT_inc(*(SV**)ptr); + SvREFCNT_dec(hv); SvREFCNT_dec(sv); - av = (AV*)hv; /* what to refcnt_dec */ goto restore_sv; } } diff --git a/t/op/args.t b/t/op/args.t index 90a7d25..c30b70d 100755 --- a/t/op/args.t +++ b/t/op/args.t @@ -1,6 +1,6 @@ #!./perl -print "1..11\n"; +print "1..9\n"; # test various operations on @_ @@ -74,15 +74,3 @@ for (1..5) { try() } ++$ord; print "ok $ord\n"; -# bug #21542 local $_[0] causes reify problems and coredumps - -sub local1 { local $_[0] } -my $foo = 'foo'; local1($foo); local1($foo); -print "got [$foo], expected [foo]\nnot " if $foo ne 'foo'; -$ord++; -print "ok $ord\n"; - -sub local2 { local $_[0]; last L } -L: { local2 } -$ord++; -print "ok $ord\n";