From: Dave Mitchell Date: Thu, 19 Dec 2002 19:00:21 +0000 (+0000) Subject: new flag SvPADSTALE X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d9d18af660f47fb8e7eedfe8204daab3270e514f;p=p5sagit%2Fp5-mst-13.2.git new flag SvPADSTALE Message-ID: <20021219190021.D9530@fdgroup.com> p4raw-id: //depot/perl@18410 --- diff --git a/dump.c b/dump.c index ddd5ae5..1053f87 100644 --- a/dump.c +++ b/dump.c @@ -942,6 +942,7 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo (int)(PL_dumpindent*level), "", (IV)SvREFCNT(sv), (int)(PL_dumpindent*level), ""); + if (flags & SVs_PADSTALE) sv_catpv(d, "PADSTALE,"); if (flags & SVs_PADTMP) sv_catpv(d, "PADTMP,"); if (flags & SVs_PADMY) sv_catpv(d, "PADMY,"); if (flags & SVs_TEMP) sv_catpv(d, "TEMP,"); diff --git a/scope.c b/scope.c index d3a4c36..bfd2969 100644 --- a/scope.c +++ b/scope.c @@ -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: diff --git a/sv.h b/sv.h index 19d8bb3..d87ba11 100644 --- a/sv.h +++ b/sv.h @@ -148,7 +148,7 @@ perform the upgrade if necessary. See C. #define SvUPGRADE(sv, mt) (SvTYPE(sv) >= mt || sv_upgrade(sv, mt)) -/* XXX spare */ +#define SVs_PADSTALE 0x00000100 /* lexical has gone out of scope */ #define SVs_PADTMP 0x00000200 /* in use as tmp */ #define SVs_PADMY 0x00000400 /* in use a "my" variable */ #define SVs_TEMP 0x00000800 /* string is stealable? */ @@ -637,6 +637,10 @@ and leaves the UTF8 status as it was. #define SvTHINKFIRST(sv) (SvFLAGS(sv) & SVf_THINKFIRST) +#define SvPADSTALE(sv) (SvFLAGS(sv) & SVs_PADSTALE) +#define SvPADSTALE_on(sv) (SvFLAGS(sv) |= SVs_PADSTALE) +#define SvPADSTALE_off(sv) (SvFLAGS(sv) &= ~SVs_PADSTALE) + #define SvPADTMP(sv) (SvFLAGS(sv) & SVs_PADTMP) #define SvPADTMP_on(sv) (SvFLAGS(sv) |= SVs_PADTMP) #define SvPADTMP_off(sv) (SvFLAGS(sv) &= ~SVs_PADTMP)