diff options
Diffstat (limited to 'scope.c')
-rw-r--r-- | scope.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -548,6 +548,7 @@ Perl_save_clearsv(pTHX_ SV **svp) SSCHECK(2); SSPUSHLONG((long)(svp-PL_curpad)); SSPUSHINT(SAVEt_CLEARSV); + SvPADSTALE_off(*svp); /* mark lexical as active */ } void @@ -918,6 +919,7 @@ Perl_leave_scope(pTHX_ I32 base) (void)SvOOK_off(sv); break; } + SvPADSTALE_on(sv); /* mark as no longer live */ } else { /* Someone has a claim on this, so abandon it. */ U32 padflags = SvFLAGS(sv) & (SVs_PADMY|SVs_PADTMP); @@ -927,7 +929,9 @@ Perl_leave_scope(pTHX_ I32 base) default: *(SV**)ptr = NEWSV(0,0); break; } SvREFCNT_dec(sv); /* Cast current value to the winds. */ - SvFLAGS(*(SV**)ptr) |= padflags; /* preserve pad nature */ + /* preserve pad nature, but also mark as not live + * for any closure capturing */ + SvFLAGS(*(SV**)ptr) |= padflags & SVs_PADSTALE; } break; case SAVEt_DELETE: |