add begin.t from Method::Signatures
[p5sagit/Function-Parameters.git] / padop_on_crack.c.inc
index 4f143b0..6677059 100644 (file)
@@ -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;
+}