X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pad.c;h=e4ec019ff7c1788ab00136e46f40de60f8182be5;hb=c0e1089ae3d29de8c9817373e1b7f36eaf9a9cd8;hp=9a63e3e83f0e1a0da2b7ac59afe5e3e06acb179b;hpb=b162af07ec759e1ba6b84569e4963bc5c289d75f;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pad.c b/pad.c index 9a63e3e..e4ec019 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); @@ -255,19 +255,22 @@ Perl_pad_undef(pTHX_ CV* cv) AV *comppad = (AV*)AvARRAY(padlist)[1]; SV **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); + assert(inner_rc); namepad[ix] = Nullsv; SvREFCNT_dec(namesv); if (SvREFCNT(comppad) < 2) { /* allow for /(?{ sub{} })/ */ curpad[ix] = Nullsv; SvREFCNT_dec(innercv); + inner_rc--; } - if (SvREFCNT(innercv) /* in use, not just a prototype */ + if (inner_rc /* in use, not just a prototype */ && CvOUTSIDE(innercv) == cv) { assert(CvWEAKOUTSIDE(innercv)); @@ -326,7 +329,7 @@ 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); + const PADOFFSET offset = pad_alloc(OP_PADSV, SVs_PADMY); SV* namesv = NEWSV(1102, 0); ASSERT_CURPAD_ACTIVE("pad_add_name"); @@ -514,7 +517,7 @@ Perl_pad_check_dup(pTHX_ const char *name, bool is_our, const HV *ourstash) && (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", @@ -533,7 +536,7 @@ Perl_pad_check_dup(pTHX_ const char *name, bool is_our, const HV *ourstash) && !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); @@ -583,7 +586,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; @@ -666,7 +669,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 */ @@ -813,7 +816,7 @@ S_pad_findlex(pTHX_ const char *name, const CV* cv, U32 seq, int warn, 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) @@ -963,7 +966,7 @@ Perl_intro_my(pTHX) 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)) ); } @@ -1012,7 +1015,7 @@ Perl_pad_leavemy(pTHX) 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)) ); } @@ -1119,7 +1122,7 @@ Tidy up a pad after we've finished compiling it: void Perl_pad_tidy(pTHX_ padtidy_type type) { - PADOFFSET ix; + dVAR; ASSERT_CURPAD_ACTIVE("pad_tidy"); @@ -1151,6 +1154,7 @@ Perl_pad_tidy(pTHX_ padtidy_type type) if (type == padtidy_SUBCLONE) { SV **namep = AvARRAY(PL_comppad_name); + PADOFFSET ix; for (ix = AvFILLp(PL_comppad); ix > 0; ix--) { SV *namesv; @@ -1164,7 +1168,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; @@ -1176,12 +1180,13 @@ Perl_pad_tidy(pTHX_ padtidy_type type) AV *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; @@ -1190,6 +1195,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]); @@ -1285,7 +1291,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) @@ -1298,7 +1304,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) { @@ -1368,6 +1374,7 @@ any outer lexicals. CV * Perl_cv_clone(pTHX_ CV *proto) { + dVAR; I32 ix; AV* protopadlist = CvPADLIST(proto); const AV* protopad_name = (AV*)*av_fetch(protopadlist, 0, FALSE); @@ -1376,7 +1383,6 @@ Perl_cv_clone(pTHX_ CV *proto) SV** ppad = AvARRAY(protopad); const I32 fname = AvFILLp(protopad_name); const I32 fpad = AvFILLp(protopad); - AV* comppadlist; CV* cv; SV** outpad; CV* outside; @@ -1421,9 +1427,9 @@ 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) = comppadlist = pad_new(padnew_CLONE|padnew_SAVE); + CvPADLIST(cv) = pad_new(padnew_CLONE|padnew_SAVE); av_fill(PL_comppad, fpad); for (ix = fname; ix >= 0; ix--) @@ -1444,7 +1450,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 { @@ -1453,7 +1459,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 == '@') @@ -1518,14 +1524,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]; + AV * const comppad_name = (AV*)AvARRAY(padlist)[0]; + AV * const comppad = (AV*)AvARRAY(padlist)[1]; SV **namepad = AvARRAY(comppad_name); SV **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)); @@ -1563,7 +1569,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])); @@ -1593,9 +1599,30 @@ 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; } } + + +HV * +Perl_pad_compname_type(pTHX_ const PADOFFSET po) +{ + SV** const av = av_fetch(PL_comppad_name, po, FALSE); + if ( SvFLAGS(*av) & SVpad_TYPED ) { + return SvSTASH(*av); + } + return Nullhv; +} + +/* + * Local variables: + * c-indentation-style: bsd + * c-basic-offset: 4 + * indent-tabs-mode: t + * End: + * + * ex: set ts=8 sts=4 sw=4 noet: + */