X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pad.c;h=de6100287ec3a6583b47c094c2509bb518c0198d;hb=0c5a913da36d66becd2cf3a592f69c87a3e9b51b;hp=0473f9af4ec386c34a3d16fee32b7a9f223ca150;hpb=37442d52629699d89ef62d315d35efbc0facec21;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pad.c b/pad.c index 0473f9a..de61002 100644 --- a/pad.c +++ b/pad.c @@ -176,7 +176,7 @@ Perl_pad_new(pTHX_ int flags) AV * const a0 = newAV(); /* will be @_ */ av_extend(a0, 0); av_store(pad, 0, (SV*)a0); - AvFLAGS(a0) = AVf_REIFY; + AvREIFY_only(a0); } else { av_store(pad, 0, Nullsv); @@ -248,16 +248,16 @@ Perl_pad_undef(pTHX_ CV* cv) * children, or integrate this loop with general cleanup */ if (!PL_dirty) { /* don't bother during global destruction */ - CV *outercv = CvOUTSIDE(cv); + CV * const outercv = CvOUTSIDE(cv); const U32 seq = CvOUTSIDE_SEQ(cv); - AV *comppad_name = (AV*)AvARRAY(padlist)[0]; - SV **namepad = AvARRAY(comppad_name); - AV *comppad = (AV*)AvARRAY(padlist)[1]; - SV **curpad = AvARRAY(comppad); + AV * const comppad_name = (AV*)AvARRAY(padlist)[0]; + SV ** const namepad = AvARRAY(comppad_name); + AV * const comppad = (AV*)AvARRAY(padlist)[1]; + SV ** const curpad = AvARRAY(comppad); for (ix = AvFILLp(comppad_name); ix > 0; ix--) { - SV *namesv = namepad[ix]; + SV * const namesv = namepad[ix]; if (namesv && namesv != &PL_sv_undef - && *SvPVX(namesv) == '&') + && *SvPVX_const(namesv) == '&') { CV * const innercv = (CV*)curpad[ix]; U32 inner_rc = SvREFCNT(innercv); @@ -293,7 +293,7 @@ Perl_pad_undef(pTHX_ CV* cv) ix = AvFILLp(padlist); while (ix >= 0) { - SV* sv = AvARRAY(padlist)[ix--]; + SV* const sv = AvARRAY(padlist)[ix--]; if (!sv) continue; if (sv == (SV*)PL_comppad_name) @@ -329,8 +329,8 @@ If fake, it means we're cloning an existing entry PADOFFSET Perl_pad_add_name(pTHX_ const char *name, HV* typestash, HV* ourstash, bool fake) { - PADOFFSET offset = pad_alloc(OP_PADSV, SVs_PADMY); - SV* namesv = NEWSV(1102, 0); + const PADOFFSET offset = pad_alloc(OP_PADSV, SVs_PADMY); + SV* const namesv = NEWSV(1102, 0); ASSERT_CURPAD_ACTIVE("pad_add_name"); @@ -344,7 +344,8 @@ Perl_pad_add_name(pTHX_ const char *name, HV* typestash, HV* ourstash, bool fake } if (ourstash) { SvFLAGS(namesv) |= SVpad_OUR; - GvSTASH(namesv) = (HV*)SvREFCNT_inc((SV*) ourstash); + GvSTASH(namesv) = ourstash; + Perl_sv_add_backref(aTHX_ (SV*)ourstash, namesv); } av_store(PL_comppad_name, offset, namesv); @@ -411,7 +412,7 @@ Perl_pad_alloc(pTHX_ I32 optype, U32 tmptype) retval = AvFILLp(PL_comppad); } else { - SV **names = AvARRAY(PL_comppad_name); + SV ** const names = AvARRAY(PL_comppad_name); const SSize_t names_fill = AvFILLp(PL_comppad_name); for (;;) { /* @@ -498,7 +499,7 @@ C indicates that the name to check is an 'our' declaration void Perl_pad_check_dup(pTHX_ const char *name, bool is_our, const HV *ourstash) { - SV **svp, *sv; + SV **svp; PADOFFSET top, off; ASSERT_CURPAD_ACTIVE("pad_check_dup"); @@ -511,13 +512,14 @@ Perl_pad_check_dup(pTHX_ const char *name, bool is_our, const HV *ourstash) /* XXX DAPM - why the (I32) cast - shouldn't we ensure they're the same * type ? */ for (off = top; (I32)off > PL_comppad_name_floor; off--) { - if ((sv = svp[off]) + SV * const sv = svp[off]; + if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0) && (!is_our || ((SvFLAGS(sv) & SVpad_OUR) && GvSTASH(sv) == ourstash)) - && strEQ(name, SvPVX(sv))) + && strEQ(name, SvPVX_const(sv))) { Perl_warner(aTHX_ packWARN(WARN_MISC), "\"%s\" variable %s masks earlier declaration in same %s", @@ -531,12 +533,13 @@ Perl_pad_check_dup(pTHX_ const char *name, bool is_our, const HV *ourstash) /* check the rest of the pad */ if (is_our) { do { - if ((sv = svp[off]) + SV * const sv = svp[off]; + if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && (SvIVX(sv) == PAD_MAX || SvIVX(sv) == 0) && ((SvFLAGS(sv) & SVpad_OUR) && GvSTASH(sv) == ourstash) - && strEQ(name, SvPVX(sv))) + && strEQ(name, SvPVX_const(sv))) { Perl_warner(aTHX_ packWARN(WARN_MISC), "\"our\" variable %s redeclared", name); @@ -586,7 +589,7 @@ Perl_pad_findmy(pTHX_ const char *name) if (namesv && namesv != &PL_sv_undef && !SvFAKE(namesv) && (SvFLAGS(namesv) & SVpad_OUR) - && strEQ(SvPVX(namesv), name) + && strEQ(SvPVX_const(namesv), name) && U_32(SvNVX(namesv)) == PAD_MAX /* min */ ) return offset; @@ -669,7 +672,7 @@ S_pad_findlex(pTHX_ const char *name, const CV* cv, U32 seq, int warn, for (offset = AvFILLp(nameav); offset > 0; offset--) { const SV *namesv = name_svp[offset]; if (namesv && namesv != &PL_sv_undef - && strEQ(SvPVX(namesv), name)) + && strEQ(SvPVX_const(namesv), name)) { if (SvFAKE(namesv)) fake_offset = offset; /* in case we don't find a real one */ @@ -809,14 +812,14 @@ S_pad_findlex(pTHX_ const char *name, const CV* cv, U32 seq, int warn, { SV *new_namesv; - AV *ocomppad_name = PL_comppad_name; - PAD *ocomppad = PL_comppad; + AV * const ocomppad_name = PL_comppad_name; + PAD * const ocomppad = PL_comppad; PL_comppad_name = (AV*)AvARRAY(padlist)[0]; PL_comppad = (AV*)AvARRAY(padlist)[1]; PL_curpad = AvARRAY(PL_comppad); new_offset = pad_add_name( - SvPVX(*out_name_sv), + SvPVX_const(*out_name_sv), (SvFLAGS(*out_name_sv) & SVpad_TYPED) ? SvSTASH(*out_name_sv) : Nullhv, (SvFLAGS(*out_name_sv) & SVpad_OUR) @@ -950,7 +953,6 @@ U32 Perl_intro_my(pTHX) { SV **svp; - SV *sv; I32 i; ASSERT_CURPAD_ACTIVE("intro_my"); @@ -959,14 +961,14 @@ Perl_intro_my(pTHX) svp = AvARRAY(PL_comppad_name); for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) { - if ((sv = svp[i]) && sv != &PL_sv_undef - && !SvFAKE(sv) && !SvIVX(sv)) - { + SV * const sv = svp[i]; + + if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && !SvIVX(sv)) { SvIV_set(sv, PAD_MAX); /* Don't know scope end yet. */ SvNV_set(sv, (NV)PL_cop_seqmax); DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad intromy: %ld \"%s\", (%ld,%ld)\n", - (long)i, SvPVX(sv), + (long)i, SvPVX_const(sv), (long)U_32(SvNVX(sv)), (long)SvIVX(sv)) ); } @@ -992,15 +994,15 @@ void Perl_pad_leavemy(pTHX) { I32 off; - SV **svp = AvARRAY(PL_comppad_name); + SV ** const svp = AvARRAY(PL_comppad_name); PL_pad_reset_pending = FALSE; ASSERT_CURPAD_ACTIVE("pad_leavemy"); if (PL_min_intro_pending && PL_comppad_name_fill < PL_min_intro_pending) { for (off = PL_max_intro_pending; off >= PL_min_intro_pending; off--) { - const SV *sv; - if ((sv = svp[off]) && sv != &PL_sv_undef + const SV * const sv = svp[off]; + if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && ckWARN_d(WARN_INTERNAL)) Perl_warner(aTHX_ packWARN(WARN_INTERNAL), "%"SVf" never introduced", sv); @@ -1008,14 +1010,12 @@ Perl_pad_leavemy(pTHX) } /* "Deintroduce" my variables that are leaving with this scope. */ for (off = AvFILLp(PL_comppad_name); off > PL_comppad_name_fill; off--) { - const SV *sv; - if ((sv = svp[off]) && sv != &PL_sv_undef - && !SvFAKE(sv) && SvIVX(sv) == PAD_MAX) - { + const SV * const sv = svp[off]; + if (sv && sv != &PL_sv_undef && !SvFAKE(sv) && SvIVX(sv) == PAD_MAX) { SvIV_set(sv, PL_cop_seqmax); DEBUG_Xv(PerlIO_printf(Perl_debug_log, "Pad leavemy: %ld \"%s\", (%ld,%ld)\n", - (long)off, SvPVX(sv), + (long)off, SvPVX_const(sv), (long)U_32(SvNVX(sv)), (long)SvIVX(sv)) ); } @@ -1055,8 +1055,15 @@ Perl_pad_swipe(pTHX_ PADOFFSET po, bool refadjust) if (refadjust) SvREFCNT_dec(PL_curpad[po]); + + /* if pad tmps aren't shared between ops, then there's no need to + * create a new tmp when an existing op is freed */ +#ifdef USE_BROKEN_PAD_RESET PL_curpad[po] = NEWSV(1107,0); SvPADTMP_on(PL_curpad[po]); +#else + PL_curpad[po] = &PL_sv_undef; +#endif if ((I32)po < PL_padix) PL_padix = po - 1; } @@ -1123,7 +1130,6 @@ void Perl_pad_tidy(pTHX_ padtidy_type type) { dVAR; - PADOFFSET ix; ASSERT_CURPAD_ACTIVE("pad_tidy"); @@ -1154,7 +1160,8 @@ Perl_pad_tidy(pTHX_ padtidy_type type) av_store(PL_comppad_name, AvFILLp(PL_comppad), Nullsv); if (type == padtidy_SUBCLONE) { - SV **namep = AvARRAY(PL_comppad_name); + SV ** const namep = AvARRAY(PL_comppad_name); + PADOFFSET ix; for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { SV *namesv; @@ -1168,7 +1175,7 @@ Perl_pad_tidy(pTHX_ padtidy_type type) */ if (!((namesv = namep[ix]) != Nullsv && namesv != &PL_sv_undef && - *SvPVX(namesv) == '&')) + *SvPVX_const(namesv) == '&')) { SvREFCNT_dec(PL_curpad[ix]); PL_curpad[ix] = Nullsv; @@ -1177,15 +1184,16 @@ Perl_pad_tidy(pTHX_ padtidy_type type) } else if (type == padtidy_SUB) { /* XXX DAPM this same bit of code keeps appearing !!! Rationalise? */ - AV *av = newAV(); /* Will be @_ */ + AV * const av = newAV(); /* Will be @_ */ av_extend(av, 0); av_store(PL_comppad, 0, (SV*)av); - AvFLAGS(av) = AVf_REIFY; + AvREIFY_only(av); } /* XXX DAPM rationalise these two similar branches */ if (type == padtidy_SUB) { + PADOFFSET ix; for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { if (SvIMMORTAL(PL_curpad[ix]) || IS_PADGV(PL_curpad[ix]) || IS_PADCONST(PL_curpad[ix])) continue; @@ -1194,6 +1202,7 @@ Perl_pad_tidy(pTHX_ padtidy_type type) } } else if (type == padtidy_FORMAT) { + PADOFFSET ix; for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { if (!SvPADMY(PL_curpad[ix]) && !SvIMMORTAL(PL_curpad[ix])) SvPADTMP_on(PL_curpad[ix]); @@ -1233,7 +1242,7 @@ Perl_pad_free(pTHX_ PADOFFSET po) #ifdef USE_ITHREADS /* SV could be a shared hash key (eg bugid #19022) */ if ( -#ifdef PERL_COPY_ON_WRITE +#ifdef PERL_OLD_COPY_ON_WRITE !SvIsCOW(PL_curpad[po]) #else !SvFAKE(PL_curpad[po]) @@ -1289,7 +1298,7 @@ Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full) (int) ix, PTR2UV(ppad[ix]), (unsigned long) (ppad[ix] ? SvREFCNT(ppad[ix]) : 0), - SvPVX(namesv), + SvPVX_const(namesv), (unsigned long)SvIVX(namesv), (unsigned long)SvNVX(namesv) @@ -1302,7 +1311,7 @@ Perl_do_dump_pad(pTHX_ I32 level, PerlIO *file, PADLIST *padlist, int full) (unsigned long) (ppad[ix] ? SvREFCNT(ppad[ix]) : 0), (long)U_32(SvNVX(namesv)), (long)SvIVX(namesv), - SvPVX(namesv) + SvPVX_const(namesv) ); } else if (full) { @@ -1330,8 +1339,8 @@ dump the contents of a CV STATIC void S_cv_dump(pTHX_ const CV *cv, const char *title) { - const CV *outside = CvOUTSIDE(cv); - AV* padlist = CvPADLIST(cv); + const CV * const outside = CvOUTSIDE(cv); + AV* const padlist = CvPADLIST(cv); PerlIO_printf(Perl_debug_log, " %s: CV=0x%"UVxf" (%s), OUTSIDE=0x%"UVxf" (%s)\n", @@ -1374,11 +1383,11 @@ Perl_cv_clone(pTHX_ CV *proto) { dVAR; I32 ix; - AV* protopadlist = CvPADLIST(proto); - const AV* protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE); - const AV* protopad = (AV*)*av_fetch(protopadlist, 1, FALSE); - SV** pname = AvARRAY(protopad_name); - SV** ppad = AvARRAY(protopad); + AV* const protopadlist = CvPADLIST(proto); + const AV* const protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE); + const AV* const protopad = (AV*)*av_fetch(protopadlist, 1, FALSE); + SV** const pname = AvARRAY(protopad_name); + SV** const ppad = AvARRAY(protopad); const I32 fname = AvFILLp(protopad_name); const I32 fpad = AvFILLp(protopad); CV* cv; @@ -1425,7 +1434,7 @@ Perl_cv_clone(pTHX_ CV *proto) CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(proto); if (SvPOK(proto)) - sv_setpvn((SV*)cv, SvPVX(proto), SvCUR(proto)); + sv_setpvn((SV*)cv, SvPVX_const(proto), SvCUR(proto)); CvPADLIST(cv) = pad_new(padnew_CLONE|padnew_SAVE); @@ -1438,7 +1447,7 @@ Perl_cv_clone(pTHX_ CV *proto) outpad = AvARRAY(AvARRAY(CvPADLIST(outside))[depth]); for (ix = fpad; ix > 0; ix--) { - SV* namesv = (ix <= fname) ? pname[ix] : Nullsv; + SV* const namesv = (ix <= fname) ? pname[ix] : Nullsv; SV *sv = Nullsv; if (namesv && namesv != &PL_sv_undef) { /* lexical */ if (SvFAKE(namesv)) { /* lexical from outside? */ @@ -1448,7 +1457,7 @@ Perl_cv_clone(pTHX_ CV *proto) if (SvTYPE(proto) == SVt_PVFM && SvPADSTALE(sv)) { if (ckWARN(WARN_CLOSURE)) Perl_warner(aTHX_ packWARN(WARN_CLOSURE), - "Variable \"%s\" is not available", SvPVX(namesv)); + "Variable \"%s\" is not available", SvPVX_const(namesv)); sv = Nullsv; } else { @@ -1457,7 +1466,7 @@ Perl_cv_clone(pTHX_ CV *proto) } } if (!sv) { - const char sigil = SvPVX(namesv)[0]; + const char sigil = SvPVX_const(namesv)[0]; if (sigil == '&') sv = SvREFCNT_inc(ppad[ix]); else if (sigil == '@') @@ -1522,14 +1531,14 @@ void Perl_pad_fixup_inner_anons(pTHX_ PADLIST *padlist, CV *old_cv, CV *new_cv) { I32 ix; - AV *comppad_name = (AV*)AvARRAY(padlist)[0]; - AV *comppad = (AV*)AvARRAY(padlist)[1]; - SV **namepad = AvARRAY(comppad_name); - SV **curpad = AvARRAY(comppad); + AV * const comppad_name = (AV*)AvARRAY(padlist)[0]; + AV * const comppad = (AV*)AvARRAY(padlist)[1]; + SV ** const namepad = AvARRAY(comppad_name); + SV ** const curpad = AvARRAY(comppad); for (ix = AvFILLp(comppad_name); ix > 0; ix--) { const SV *namesv = namepad[ix]; if (namesv && namesv != &PL_sv_undef - && *SvPVX(namesv) == '&') + && *SvPVX_const(namesv) == '&') { CV *innercv = (CV*)curpad[ix]; assert(CvWEAKOUTSIDE(innercv)); @@ -1567,7 +1576,7 @@ Perl_pad_push(pTHX_ PADLIST *padlist, int depth) for ( ;ix > 0; ix--) { if (names_fill >= ix && names[ix] != &PL_sv_undef) { - const char sigil = SvPVX(names[ix])[0]; + const char sigil = SvPVX_const(names[ix])[0]; if ((SvFLAGS(names[ix]) & SVf_FAKE) || sigil == '&') { /* outer lexical or anon code */ av_store(newpad, ix, SvREFCNT_inc(oldpad[ix])); @@ -1597,7 +1606,7 @@ Perl_pad_push(pTHX_ PADLIST *padlist, int depth) av = newAV(); av_extend(av, 0); av_store(newpad, 0, (SV*)av); - AvFLAGS(av) = AVf_REIFY; + AvREIFY_only(av); av_store(padlist, depth, (SV*)newpad); AvFILLp(padlist) = depth;