This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In Perl_ck_lengthconst, "XXX length optimization goes here" is TODO.
[perl5.git] / scope.c
diff --git a/scope.c b/scope.c
index c8f190f..fae4892 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -412,15 +412,15 @@ Perl_save_sptr(pTHX_ SV **sptr)
 }
 
 void
-Perl_save_padsv(pTHX_ PADOFFSET off)
+Perl_save_padsv_and_mortalize(pTHX_ PADOFFSET off)
 {
     dVAR;
     SSCHECK(4);
     ASSERT_CURPAD_ACTIVE("save_padsv");
-    SSPUSHPTR(PL_curpad[off]);
+    SSPUSHPTR(SvREFCNT_inc_simple_NN(PL_curpad[off]));
     SSPUSHPTR(PL_comppad);
     SSPUSHLONG((long)off);
-    SSPUSHINT(SAVEt_PADSV);
+    SSPUSHINT(SAVEt_PADSV_AND_MORTALIZE);
 }
 
 void
@@ -929,12 +929,18 @@ Perl_leave_scope(pTHX_ I32 base)
            else
                PL_curpad = NULL;
            break;
-       case SAVEt_PADSV:
+       case SAVEt_PADSV_AND_MORTALIZE:
            {
                const PADOFFSET off = (PADOFFSET)SSPOPLONG;
+               SV **svp;
                ptr = SSPOPPTR;
-               if (ptr)
-                   AvARRAY((PAD*)ptr)[off] = (SV*)SSPOPPTR;
+               assert (ptr);
+               svp = AvARRAY((PAD*)ptr) + off;
+               /* This mortalizing used to be done by POPLOOP() via itersave.
+                  But as we have all the information here, we can do it here,
+                  save even having to have itersave in the struct.  */
+               sv_2mortal(*svp);
+               *svp = (SV*)SSPOPPTR;
            }
            break;
        case SAVEt_SAVESWITCHSTACK:
@@ -1084,7 +1090,7 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
        break;
 
     case CXt_LOOP_LAZYIV:
-    case CXt_LOOP_STACK:
+    case CXt_LOOP_LAZYSV:
     case CXt_LOOP_FOR:
     case CXt_LOOP_PLAIN:
        PerlIO_printf(Perl_debug_log, "BLK_LOOP.LABEL = %s\n", CxLABEL(cx));
@@ -1094,17 +1100,13 @@ Perl_cx_dump(pTHX_ PERL_CONTEXT *cx)
                PTR2UV(cx->blk_loop.my_op));
        PerlIO_printf(Perl_debug_log, "BLK_LOOP.NEXT_OP = 0x%"UVxf"\n",
                PTR2UV(CX_LOOP_NEXTOP_GET(cx)));
-       PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
-               (long)cx->blk_loop.iterix);
+       /* XXX: not accurate for LAZYSV/IV */
        PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERARY = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_loop.iterary));
+               PTR2UV(cx->blk_loop.state_u.ary.ary));
+       PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERIX = %ld\n",
+               (long)cx->blk_loop.state_u.ary.ix);
        PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERVAR = 0x%"UVxf"\n",
                PTR2UV(CxITERVAR(cx)));
-       if (CxITERVAR(cx))
-           PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERSAVE = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_loop.itersave));
-       PerlIO_printf(Perl_debug_log, "BLK_LOOP.ITERLVAL = 0x%"UVxf"\n",
-               PTR2UV(cx->blk_loop.iterlval));
        break;
 
     case CXt_SUBST: