Add missing syms to global.sym; update magic doc
[p5sagit/p5-mst-13.2.git] / pp_hot.c
index 41ad9f4..f957deb 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -725,8 +725,9 @@ PP(pp_aassign)
            SP = lastrelem;
        else
            SP = firstrelem + (lastlelem - firstlelem);
+       lelem = firstlelem + (relem - firstrelem);
        while (relem <= SP)
-           *relem++ = &sv_undef;
+           *relem++ = (lelem <= lastlelem) ? *lelem++ : &sv_undef;
        RETURN;
     }
     else {
@@ -1682,7 +1683,8 @@ PP(pp_entersub)
     register CV *cv;
     register CONTEXT *cx;
     I32 gimme;
-    I32 hasargs = (op->op_flags & OPf_STACKED) != 0;
+    bool hasargs = (op->op_flags & OPf_STACKED) != 0;
+    bool may_clone = TRUE;
 
     if (!sv)
        DIE("Not a CODE reference");
@@ -1702,14 +1704,17 @@ PP(pp_entersub)
            break;
        }
        cv = (CV*)SvRV(sv);
-       if (SvTYPE(cv) == SVt_PVCV)
+       if (SvTYPE(cv) == SVt_PVCV) {
+           may_clone = FALSE;
            break;
+       }
        /* FALL THROUGH */
     case SVt_PVHV:
     case SVt_PVAV:
        DIE("Not a CODE reference");
     case SVt_PVCV:
        cv = (CV*)sv;
+       may_clone = FALSE;
        break;
     case SVt_PVGV:
        if (!(cv = GvCV((GV*)sv)))
@@ -1720,6 +1725,9 @@ PP(pp_entersub)
     ENTER;
     SAVETMPS;
 
+    if (may_clone && cv && CvCLONE(cv))
+       cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
+
   retry:
     if (!cv)
        DIE("Not a CODE reference");
@@ -1898,7 +1906,7 @@ PP(pp_entersub)
            }
            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) {