[asperl] integrate latest win32 branch
[p5sagit/p5-mst-13.2.git] / scope.c
diff --git a/scope.c b/scope.c
index 4382072..56387e8 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -19,8 +19,16 @@ SV**
 stack_grow(SV **sp, SV **p, int n)
 {
     dTHR;
+#if defined(DEBUGGING) && !defined(USE_THREADS)
+    static int growing = 0;
+    if (growing++)
+      abort();
+#endif
     stack_sp = sp;
     av_extend(curstack, (p - stack_base) + (n) + 128);
+#if defined(DEBUGGING) && !defined(USE_THREADS)
+    growing--;
+#endif
     return stack_sp;
 }
 
@@ -112,7 +120,7 @@ free_tmps(void)
     }
 }
 
-static SV *
+STATIC SV *
 save_scalar_at(SV **sptr)
 {
     dTHR;
@@ -197,11 +205,14 @@ AV *
 save_ary(GV *gv)
 {
     dTHR;
-    AV *oav, *av;
+    AV *oav = GvAVn(gv);
+    AV *av;
 
+    if (!AvREAL(oav) && AvREIFY(oav))
+       av_reify(oav);
     SSCHECK(3);
     SSPUSHPTR(gv);
-    SSPUSHPTR(oav = GvAVn(gv));
+    SSPUSHPTR(oav);
     SSPUSHINT(SAVEt_AV);
 
     GvAV(gv) = Null(AV*);
@@ -247,12 +258,11 @@ void
 save_item(register SV *item)
 {
     dTHR;
-    register SV *sv;
+    register SV *sv = NEWSV(0,0);
 
+    sv_setsv(sv,item);
     SSCHECK(3);
     SSPUSHPTR(item);           /* remember the pointer */
-    sv = NEWSV(0,0);
-    sv_setsv(sv,item);
     SSPUSHPTR(sv);             /* remember the value */
     SSPUSHINT(SAVEt_ITEM);
 }
@@ -335,7 +345,7 @@ save_threadsv(PADOFFSET i)
 {
 #ifdef USE_THREADS
     dTHR;
-    SV **svp = av_fetch(thr->threadsv, i, FALSE);
+    SV **svp = &THREADSV(i);   /* XXX Change to save by offset */
     DEBUG_L(PerlIO_printf(PerlIO_stderr(), "save_threadsv %u: %p %p:%s\n",
                          i, svp, *svp, SvPEEK(*svp)));
     save_svref(svp);
@@ -429,18 +439,22 @@ save_list(register SV **sarg, I32 maxsarg)
     register SV *sv;
     register I32 i;
 
-    SSCHECK(3 * maxsarg);
     for (i = 1; i <= maxsarg; i++) {
-       SSPUSHPTR(sarg[i]);             /* remember the pointer */
        sv = NEWSV(0,0);
        sv_setsv(sv,sarg[i]);
+       SSCHECK(3);
+       SSPUSHPTR(sarg[i]);             /* remember the pointer */
        SSPUSHPTR(sv);                  /* remember the value */
        SSPUSHINT(SAVEt_ITEM);
     }
 }
 
 void
+#ifdef PERL_OBJECT
+save_destructor(DESTRUCTORFUNC f, void* p)
+#else
 save_destructor(void (*f) (void *), void *p)
+#endif
 {
     dTHR;
     SSCHECK(3);
@@ -596,14 +610,14 @@ leave_scope(I32 base)
        case SAVEt_GP:                          /* scalar reference */
            ptr = SSPOPPTR;
            gv = (GV*)SSPOPPTR;
-            gp_free(gv);
-            GvGP(gv) = (GP*)ptr;
             if (SvPOK(gv) && SvLEN(gv) > 0) {
                 Safefree(SvPVX(gv));
             }
             SvPVX(gv) = (char *)SSPOPPTR;
             SvCUR(gv) = (STRLEN)SSPOPIV;
             SvLEN(gv) = (STRLEN)SSPOPIV;
+            gp_free(gv);
+            GvGP(gv) = (GP*)ptr;
            SvREFCNT_dec(gv);
             break;
        case SAVEt_FREESV:
@@ -658,12 +672,12 @@ leave_scope(I32 base)
            }
            else {      /* Someone has a claim on this, so abandon it. */
                U32 padflags = SvFLAGS(sv) & (SVs_PADBUSY|SVs_PADMY|SVs_PADTMP);
-               SvREFCNT_dec(sv);       /* Cast current value to the winds. */
                switch (SvTYPE(sv)) {   /* Console ourselves with a new value */
                case SVt_PVAV:  *(SV**)ptr = (SV*)newAV();      break;
                case SVt_PVHV:  *(SV**)ptr = (SV*)newHV();      break;
                default:        *(SV**)ptr = NEWSV(0,0);        break;
                }
+               SvREFCNT_dec(sv);       /* Cast current value to the winds. */
                SvFLAGS(*(SV**)ptr) |= padflags; /* preserve pad nature */
            }
            break;
@@ -676,7 +690,7 @@ leave_scope(I32 base)
            break;
        case SAVEt_DESTRUCTOR:
            ptr = SSPOPPTR;
-           (*SSPOPDPTR)(ptr);
+           (CALLDESTRUCTOR)(ptr);
            break;
        case SAVEt_REGCONTEXT:
            {