[shell changes from patch from perl5.003_23 to perl5.003_24]
[p5sagit/p5-mst-13.2.git] / pp_ctl.c
index 1350de4..58ab34c 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -612,10 +612,9 @@ PP(pp_sort)
     while (MARK < SP) {        /* This may or may not shift down one here. */
        /*SUPPRESS 560*/
        if (*up = *++MARK) {                    /* Weed out nulls. */
-           if (!SvPOK(*up))
+           SvTEMP_off(*up);
+           if (!sortcop && !SvPOK(*up))
                (void)sv_2pv(*up, &na);
-           else
-               SvTEMP_off(*up);
            up++;
        }
     }
@@ -1254,11 +1253,8 @@ PP(pp_enteriter)
 
     PUSHBLOCK(cx, CXt_LOOP, SP);
     PUSHLOOP(cx, svp, MARK);
-    if (op->op_flags & OPf_STACKED) {
-       AV* av = (AV*)POPs;
-       cx->blk_loop.iterary = av;
-       cx->blk_loop.iterix = -1;
-    }
+    if (op->op_flags & OPf_STACKED)
+       cx->blk_loop.iterary = (AV*)SvREFCNT_inc(POPs);
     else {
        cx->blk_loop.iterary = curstack;
        AvFILL(curstack) = sp - stack_base;
@@ -1590,6 +1586,7 @@ PP(pp_goto)
                EXTEND(stack_sp, items); /* @_ could have been extended. */
                Copy(AvARRAY(av), stack_sp, items, SV*);
                stack_sp += items;
+               SvREFCNT_dec(GvAV(defgv));
                GvAV(defgv) = cx->blk_sub.savearray;
                AvREAL_off(av);
                av_clear(av);
@@ -1631,8 +1628,7 @@ PP(pp_goto)
                    (void)SvREFCNT_inc(cv);
                else {  /* save temporaries on recursion? */
                    if (CvDEPTH(cv) == 100 && dowarn)
-                       warn("Deep recursion on subroutine \"%s\"",
-                           GvENAME(CvGV(cv)));
+                       sub_crush_depth(cv);
                    if (CvDEPTH(cv) > AvFILL(padlist)) {
                        AV *newpad = newAV();
                        SV **oldpad = AvARRAY(svp[CvDEPTH(cv)-1]);
@@ -1682,7 +1678,7 @@ PP(pp_goto)
 
                    cx->blk_sub.savearray = GvAV(defgv);
                    cx->blk_sub.argarray = av;
-                   GvAV(defgv) = cx->blk_sub.argarray;
+                   GvAV(defgv) = (AV*)SvREFCNT_inc(av);
                    ++mark;
 
                    if (items >= AvMAX(av) + 1) {
@@ -1708,12 +1704,13 @@ PP(pp_goto)
                    }
                }
                if (perldb && curstash != debstash) {
-                   /* &xsub is not copying @_ */
+                   /*
+                    * We do not care about using sv to call CV;
+                    * it's for informational purposes only.
+                    */
                    SV *sv = GvSV(DBsub);
                    save_item(sv);
                    gv_efullname3(sv, CvGV(cv), Nullch);
-                   /* We do not care about using sv to call CV,
-                    * just for info. */
                }
                RETURNOP(CvSTART(cv));
            }
@@ -1941,7 +1938,9 @@ int gimme;
     av_store(comppadlist, 0, (SV*)comppad_name);
     av_store(comppadlist, 1, (SV*)comppad);
     CvPADLIST(compcv) = comppadlist;
-    CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(caller);
+
+    if (saveop->op_type != OP_REQUIRE)
+       CvOUTSIDE(compcv) = (CV*)SvREFCNT_inc(caller);
 
     SAVEFREESV(compcv);