X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FFunction-Parameters.git;a=blobdiff_plain;f=padop_on_crack.c.inc;h=6677059d516262fa3bfe4bd3ba22948b6f4ce3fc;hp=4f143b02f2dea539cc08ee53abbdf75e7be31cce;hb=5424bb4a885554829b311cceb8a44822d7bab1c0;hpb=63915d2641ec4983bb6b54e1ff7d30cd0032c40d diff --git a/padop_on_crack.c.inc b/padop_on_crack.c.inc index 4f143b0..6677059 100644 --- a/padop_on_crack.c.inc +++ b/padop_on_crack.c.inc @@ -684,6 +684,10 @@ static PADOFFSET S_pad_alloc(pTHX_ I32 optype, U32 tmptype) { #endif +#ifndef pad_add_name_pvs +#define pad_add_name_pvs(NAME, FLAGS, TYPESTASH, OURSTASH) S_pad_add_name_pvn(aTHX_ "" NAME "", sizeof NAME - 1, FLAGS, TYPESTASH, OURSTASH) +#endif + #ifndef pad_add_name_sv #define pad_add_name_sv(NAMESV, FLAGS, TYPESTASH, OURSTASH) \ @@ -712,7 +716,7 @@ static PADOFFSET S_pad_alloc_name(pTHX_ SV *namesv, U32 flags, HV *typestash, HV return offset; } -PADOFFSET static S_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash) { +static PADOFFSET S_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen, U32 flags, HV *typestash, HV *ourstash) { dVAR; PADOFFSET offset; SV *namesv; @@ -1047,3 +1051,59 @@ static PADOFFSET S_pad_findmy(pTHX_ const char *name, U32 flags) { } #endif + +#ifndef pad_findmy_pvs + #define pad_findmy_pvs(S, FLAGS) S_pad_findmy(aTHX_ "" S "", FLAGS) +#endif + +static OP *S_newDEFSVOP(pTHX) { + dVAR; + const PADOFFSET offset = pad_findmy_pvs("$_", 0); + if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) { + return newSVREF(newGVOP(OP_GV, 0, PL_defgv)); + } + else { + OP * const o = newOP(OP_PADSV, 0); + o->op_targ = offset; + return o; + } +} + +static U32 S_intro_my(pTHX) { + dVAR; + SV **svp; + I32 i; + U32 seq; + + ASSERT_CURPAD_ACTIVE("intro_my"); + if (!PL_min_intro_pending) + return PL_cop_seqmax; + + svp = AvARRAY(PL_comppad_name); + for (i = PL_min_intro_pending; i <= PL_max_intro_pending; i++) { + SV *const sv = svp[i]; + + if (sv && sv != &PL_sv_undef && !SvFAKE(sv) + && COP_SEQ_RANGE_LOW(sv) == PERL_PADSEQ_INTRO) + { + COP_SEQ_RANGE_HIGH_set(sv, PERL_PADSEQ_INTRO); /* Don't know scope end yet. */ + COP_SEQ_RANGE_LOW_set(sv, PL_cop_seqmax); + DEBUG_Xv(PerlIO_printf(Perl_debug_log, + "Pad intromy: %ld \"%s\", (%lu,%lu)\n", + (long)i, SvPVX_const(sv), + (unsigned long)COP_SEQ_RANGE_LOW(sv), + (unsigned long)COP_SEQ_RANGE_HIGH(sv)) + ); + } + } + seq = PL_cop_seqmax; + PL_cop_seqmax++; + if (PL_cop_seqmax == PERL_PADSEQ_INTRO) /* not a legal value */ + PL_cop_seqmax++; + PL_min_intro_pending = 0; + PL_comppad_name_fill = PL_max_intro_pending; /* Needn't search higher */ + DEBUG_Xv(PerlIO_printf(Perl_debug_log, + "Pad intromy: seq -> %ld\n", (long)(PL_cop_seqmax))); + + return seq; +}