Minor OS/2 fixes
[p5sagit/p5-mst-13.2.git] / op.c
diff --git a/op.c b/op.c
index 56624e3..eecde67 100644 (file)
--- a/op.c
+++ b/op.c
@@ -186,7 +186,7 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
            if ((sv = svp[off]) &&
                sv != &sv_undef &&
                seq <= SvIVX(sv) &&
-               seq > (I32)SvNVX(sv) &&
+               seq > I_32(SvNVX(sv)) &&
                strEQ(SvPVX(sv), name))
            {
                I32 depth;
@@ -195,8 +195,8 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
 
                depth = CvDEPTH(cv);
                if (!depth) {
-                   if (newoff)
-                       return 0; /* don't clone inactive stack frame */
+                   if (newoff && !CvUNIQUE(cv))
+                       return 0; /* don't clone inactive sub's stack frame */
                    depth = 1;
                }
                oldpad = (AV*)*av_fetch(curlist, depth, FALSE);
@@ -210,14 +210,16 @@ pad_findlex(char *name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix)
                    SvNVX(sv) = (double)curcop->cop_seq;
                    SvIVX(sv) = 999999999;      /* A ref, intro immediately */
                    SvFLAGS(sv) |= SVf_FAKE;
-                   /* "It's closures all the way down." */
-                   CvCLONE_on(compcv);
-                   if (cv != startcv) {
-                       CV *bcv;
-                       for (bcv = startcv;
-                            bcv && bcv != cv && !CvCLONE(bcv);
-                            bcv = CvOUTSIDE(bcv))
-                           CvCLONE_on(bcv);
+                   if (!CvUNIQUE(cv)) {
+                       /* "It's closures all the way down." */
+                       CvCLONE_on(compcv);
+                       if (cv != startcv) {
+                           CV *bcv;
+                           for (bcv = startcv;
+                                bcv && bcv != cv && !CvCLONE(bcv);
+                                bcv = CvOUTSIDE(bcv))
+                               CvCLONE_on(bcv);
+                       }
                    }
                }
                av_store(comppad, newoff, SvREFCNT_inc(oldsv));
@@ -277,7 +279,7 @@ char *name;
        if ((sv = svp[off]) &&
            sv != &sv_undef &&
            seq <= SvIVX(sv) &&
-           seq > (I32)SvNVX(sv) &&
+           seq > I_32(SvNVX(sv)) &&
            strEQ(SvPVX(sv), name))
        {
            return (PADOFFSET)off;
@@ -2795,13 +2797,24 @@ CV* cv;
     I32 ix;
 
     PerlIO_printf(Perl_debug_log, "\tCV=0x%p (%s), OUTSIDE=0x%p (%s)\n",
-                 cv, CvANON(cv) ? "ANON" : GvNAME(CvGV(cv)),
-                 outside, CvANON(outside) ? "ANON" : GvNAME(CvGV(outside)));
+                 cv,
+                 (CvANON(cv) ? "ANON"
+                  : (cv == main_cv) ? "MAIN"
+                  : CvUNIQUE(outside) ? "UNIQUE"
+                  : CvGV(cv) ? GvNAME(CvGV(cv)) : "?mystery?"),
+                 outside,
+                 (!outside ? "null"
+                  : CvANON(outside) ? "ANON"
+                  : (outside == main_cv) ? "MAIN"
+                  : CvUNIQUE(outside) ? "UNIQUE"
+                  : CvGV(outside) ? GvNAME(CvGV(outside)) : "?mystery?"));
 
     for (ix = 1; ix <= AvFILL(pad); ix++) {
        if (SvPOK(pname[ix]))
-           PerlIO_printf(Perl_debug_log, "\t%4d. 0x%p (\"%s\")\n",
-                         ix, ppad[ix], SvPVX(pname[ix]))
+           PerlIO_printf(Perl_debug_log, "\t%4d. 0x%p (\"%s\" %ld-%ld)\n",
+                         ix, ppad[ix], SvPVX(pname[ix]),
+                         (long)I_32(SvNVX(pname[ix])),
+                         (long)SvIVX(pname[ix]));
     }
 }
 #endif /* DEBUG_CLOSURES */
@@ -2821,6 +2834,8 @@ CV* outside;
     AV* comppadlist;
     CV* cv;
 
+    assert(!CvUNIQUE(proto));
+
     ENTER;
     SAVESPTR(curpad);
     SAVESPTR(comppad);
@@ -2907,9 +2922,11 @@ CV* outside;
     }
 
 #ifdef DEBUG_CLOSURES
-    PerlIO_printf(Perl_debug_log, "Cloned from:\n");
+    PerlIO_printf(Perl_debug_log, "Cloned inside:\n");
+    cv_dump(outside);
+    PerlIO_printf(Perl_debug_log, "  from:\n");
     cv_dump(proto);
-    PerlIO_printf(Perl_debug_log, "  to:\n");
+    PerlIO_printf(Perl_debug_log, "   to:\n");
     cv_dump(cv);
 #endif