Change the context type of for ($a .. $b) to CXt_LOOP_LAZYIV, and
[p5sagit/p5-mst-13.2.git] / scope.c
diff --git a/scope.c b/scope.c
index 68aa8c2..c8f190f 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -165,12 +165,6 @@ S_save_scalar_at(pTHX_ SV **sptr)
     SV * const osv = *sptr;
     register SV * const sv = *sptr = newSV(0);
 
-#ifdef PERL_MAD
-    /* FIXME for MAD - this is causing ext/Safe/t/safeops.t to abort.  */
-    if (PL_formfeed && sv == PL_formfeed)
-       abort();
-#endif
-
     if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
        if (SvGMAGICAL(osv)) {
            const bool oldtainted = PL_tainted;
@@ -188,10 +182,6 @@ Perl_save_scalar(pTHX_ GV *gv)
 {
     dVAR;
     SV ** const sptr = &GvSVn(gv);
-#ifdef PERL_MAD
-    if (PL_formfeed && *sptr == PL_formfeed)
-       abort();
-#endif
     PL_localizing = 1;
     SvGETMAGIC(*sptr);
     PL_localizing = 0;
@@ -208,10 +198,6 @@ void
 Perl_save_generic_svref(pTHX_ SV **sptr)
 {
     dVAR;
-#ifdef PERL_MAD
-    if (PL_formfeed && *sptr == PL_formfeed)
-       abort();
-#endif
     SSCHECK(3);
     SSPUSHPTR(sptr);
     SSPUSHPTR(SvREFCNT_inc(*sptr));
@@ -270,11 +256,19 @@ Perl_save_gp(pTHX_ GV *gv, I32 empty)
        GP *gp = Perl_newGP(aTHX_ gv);
 
        if (GvCVu(gv))
-           PL_sub_generation++;        /* taking a method out of circulation */
+            mro_method_changed_in(GvSTASH(gv)); /* taking a method out of circulation ("local")*/
        if (GvIOp(gv) && (IoFLAGS(GvIOp(gv)) & IOf_ARGV)) {
            gp->gp_io = newIO();
            IoFLAGS(gp->gp_io) |= IOf_ARGV|IOf_START;
        }
+#ifdef PERL_DONT_CREATE_GVSV
+       if (gv == PL_errgv) {
+           /* We could scatter this logic everywhere by changing the
+              definition of ERRSV from GvSV() to GvSVn(), but it seems more
+              efficient to do this check once here.  */
+           gp->gp_sv = newSV(0);
+       }
+#endif
        GvGP(gv) = gp;
     }
     else {
@@ -328,11 +322,6 @@ Perl_save_item(pTHX_ register SV *item)
     dVAR;
     register SV * const sv = newSVsv(item);
 
-#ifdef PERL_MAD
-    if (PL_formfeed && item == PL_formfeed)
-       abort();
-#endif
-
     SSCHECK(3);
     SSPUSHPTR(item);           /* remember the pointer */
     SSPUSHPTR(sv);             /* remember the value */
@@ -370,6 +359,16 @@ Perl_save_I8(pTHX_ I8 *bytep)
 }
 
 void
+Perl_save_I16(pTHX_ I16 *intp)
+{
+    dVAR;
+    SSCHECK(3);
+    SSPUSHINT(*intp);
+    SSPUSHPTR(intp);
+    SSPUSHINT(SAVEt_I16);
+}
+
+void
 Perl_save_I32(pTHX_ I32 *intp)
 {
     dVAR;
@@ -554,7 +553,7 @@ Perl_save_helem(pTHX_ HV *hv, SV *key, SV **sptr)
     SvGETMAGIC(*sptr);
     SSCHECK(4);
     SSPUSHPTR(SvREFCNT_inc_simple(hv));
-    SSPUSHPTR(SvREFCNT_inc_simple(key));
+    SSPUSHPTR(newSVsv(key));
     SSPUSHPTR(SvREFCNT_inc(*sptr));
     SSPUSHINT(SAVEt_HELEM);
     save_scalar_at(sptr);
@@ -571,10 +570,6 @@ SV*
 Perl_save_svref(pTHX_ SV **sptr)
 {
     dVAR;
-#ifdef PERL_MAD
-    if (PL_formfeed && *sptr == PL_formfeed)
-       abort();
-#endif
     SvGETMAGIC(*sptr);
     SSCHECK(3);
     SSPUSHPTR(sptr);
@@ -685,15 +680,7 @@ Perl_leave_scope(pTHX_ I32 base)
            av = (AV*)SSPOPPTR;
            gv = (GV*)SSPOPPTR;
            if (GvAV(gv)) {
-               AV * const goner = GvAV(gv);
-               /* FIXME - this is a temporary hack until we work out what
-                  the correct behaviour for magic should be.  */
-               sv_unmagic((SV*)goner, PERL_MAGIC_arylen_p);
-               SvMAGIC_set(av, SvMAGIC(goner));
-               SvFLAGS((SV*)av) |= SvMAGICAL(goner);
-               SvMAGICAL_off(goner);
-               SvMAGIC_set(goner, NULL);
-               SvREFCNT_dec(goner);
+               SvREFCNT_dec(GvAV(gv));
            }
            GvAV(gv) = av;
            if (SvMAGICAL(av)) {
@@ -706,12 +693,7 @@ Perl_leave_scope(pTHX_ I32 base)
            hv = (HV*)SSPOPPTR;
            gv = (GV*)SSPOPPTR;
            if (GvHV(gv)) {
-               HV * const goner = GvHV(gv);
-               SvMAGIC_set(hv, SvMAGIC(goner));
-               SvFLAGS(hv) |= SvMAGICAL(goner);
-               SvMAGICAL_off(goner);
-               SvMAGIC_set(goner, NULL);
-               SvREFCNT_dec(goner);
+               SvREFCNT_dec(GvHV(gv));
            }
            GvHV(gv) = hv;
            if (SvMAGICAL(hv)) {
@@ -730,7 +712,15 @@ Perl_leave_scope(pTHX_ I32 base)
            break;
        case SAVEt_I32:                         /* I32 reference */
            ptr = SSPOPPTR;
+#ifdef PERL_DEBUG_READONLY_OPS
+           {
+               const I32 val = SSPOPINT;
+               if (*(I32*)ptr != val)
+                   *(I32*)ptr = val;
+           }
+#else
            *(I32*)ptr = (I32)SSPOPINT;
+#endif
            break;
        case SAVEt_SPTR:                        /* SV* reference */
            ptr = SSPOPPTR;
@@ -754,8 +744,9 @@ Perl_leave_scope(pTHX_ I32 base)
            gv = (GV*)SSPOPPTR;
            gp_free(gv);
            GvGP(gv) = (GP*)ptr;
-           if (GvCVu(gv))
-               PL_sub_generation++;  /* putting a method back into circulation */
+            /* putting a method back into circulation ("local")*/
+           if (GvCVu(gv) && (hv=GvSTASH(gv)) && HvNAME_get(hv))
+                mro_method_changed_in(hv);
            SvREFCNT_dec(gv);
            break;
        case SAVEt_FREESV:
@@ -1055,16 +1046,16 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
     case CXt_BLOCK:
        break;
     case CXt_FORMAT:
-       PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_sub.cv));
-       PerlIO_printf(Perl_debug_log, "BLK_SUB.GV = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_sub.gv));
-       PerlIO_printf(Perl_debug_log, "BLK_SUB.DFOUTGV = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_sub.dfoutgv));
-       PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
-               (int)cx->blk_sub.hasargs);
-       PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_sub.retop));
+       PerlIO_printf(Perl_debug_log, "BLK_FORMAT.CV = 0x%"UVxf"\n",
+               PTR2UV(cx->blk_format.cv));
+       PerlIO_printf(Perl_debug_log, "BLK_FORMAT.GV = 0x%"UVxf"\n",
+               PTR2UV(cx->blk_format.gv));
+       PerlIO_printf(Perl_debug_log, "BLK_FORMAT.DFOUTGV = 0x%"UVxf"\n",
+               PTR2UV(cx->blk_format.dfoutgv));
+       PerlIO_printf(Perl_debug_log, "BLK_FORMAT.HASARGS = %d\n",
+                     (int)CxHASARGS(cx));
+       PerlIO_printf(Perl_debug_log, "BLK_FORMAT.RETOP = 0x%"UVxf"\n",
+               PTR2UV(cx->blk_format.retop));
        break;
     case CXt_SUB:
        PerlIO_printf(Perl_debug_log, "BLK_SUB.CV = 0x%"UVxf"\n",
@@ -1072,18 +1063,17 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
        PerlIO_printf(Perl_debug_log, "BLK_SUB.OLDDEPTH = %ld\n",
                (long)cx->blk_sub.olddepth);
        PerlIO_printf(Perl_debug_log, "BLK_SUB.HASARGS = %d\n",
-               (int)cx->blk_sub.hasargs);
-       PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n",
-               (int)cx->blk_sub.lval);
+               (int)CxHASARGS(cx));
+       PerlIO_printf(Perl_debug_log, "BLK_SUB.LVAL = %d\n", (int)CxLVAL(cx));
        PerlIO_printf(Perl_debug_log, "BLK_SUB.RETOP = 0x%"UVxf"\n",
                PTR2UV(cx->blk_sub.retop));
        break;
     case CXt_EVAL:
        PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_IN_EVAL = %ld\n",
-               (long)cx->blk_eval.old_in_eval);
+               (long)CxOLD_IN_EVAL(cx));
        PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_OP_TYPE = %s (%s)\n",
-               PL_op_name[cx->blk_eval.old_op_type],
-               PL_op_desc[cx->blk_eval.old_op_type]);
+               PL_op_name[CxOLD_OP_TYPE(cx)],
+               PL_op_desc[CxOLD_OP_TYPE(cx)]);
        if (cx->blk_eval.old_namesv)
            PerlIO_printf(Perl_debug_log, "BLK_EVAL.OLD_NAME = %s\n",
                          SvPVX_const(cx->blk_eval.old_namesv));
@@ -1093,9 +1083,11 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
                PTR2UV(cx->blk_eval.retop));
        break;
 
-    case CXt_LOOP:
-       PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n",
-               cx->blk_loop.label);
+    case CXt_LOOP_LAZYIV:
+    case CXt_LOOP_STACK:
+    case CXt_LOOP_FOR:
+    case CXt_LOOP_PLAIN:
+       PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n", CxLABEL(cx));
        PerlIO_printf(Perl_debug_log, "BLK_LOOP.RESETSP = %ld\n",
                (long)cx->blk_loop.resetsp);
        PerlIO_printf(Perl_debug_log, "BLK_LOOP.MY_OP = 0x%"UVxf"\n",
@@ -1123,7 +1115,7 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
        PerlIO_printf(Perl_debug_log, "SB_RFLAGS = %ld\n",
                (long)cx->sb_rflags);
        PerlIO_printf(Perl_debug_log, "SB_ONCE = %ld\n",
-               (long)cx->sb_once);
+               (long)CxONCE(cx));
        PerlIO_printf(Perl_debug_log, "SB_ORIG = %s\n",
                cx->sb_orig);
        PerlIO_printf(Perl_debug_log, "SB_DSTR = 0x%"UVxf"\n",