[asperl] various tweaks
[p5sagit/p5-mst-13.2.git] / scope.c
diff --git a/scope.c b/scope.c
index cc5c9c8..0705922 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*);
@@ -330,6 +341,22 @@ save_sptr(SV **sptr)
     SSPUSHINT(SAVEt_SPTR);
 }
 
+SV **
+save_threadsv(PADOFFSET i)
+{
+#ifdef USE_THREADS
+    dTHR;
+    SV **svp = av_fetch(thr->threadsv, i, FALSE);
+    DEBUG_L(PerlIO_printf(PerlIO_stderr(), "save_threadsv %u: %p %p:%s\n",
+                         i, svp, *svp, SvPEEK(*svp)));
+    save_svref(svp);
+    return svp;
+#else
+    croak("panic: save_threadsv called in non-threaded perl");
+    return 0;
+#endif /* USE_THREADS */
+}
+
 void
 save_nogv(GV *gv)
 {
@@ -424,7 +451,11 @@ save_list(register SV **sarg, I32 maxsarg)
 }
 
 void
+#ifdef PERL_OBJECT
+save_destructor(void (*f) (void*, void*), void* p)
+#else
 save_destructor(void (*f) (void *), void *p)
+#endif
 {
     dTHR;
     SSCHECK(3);
@@ -475,6 +506,9 @@ leave_scope(I32 base)
            ptr = SSPOPPTR;
        restore_sv:
            sv = *(SV**)ptr;
+           DEBUG_L(PerlIO_printf(PerlIO_stderr(),
+                                 "restore svref: %p %p:%s -> %p:%s\n",
+                                 ptr, sv, SvPEEK(sv), value, SvPEEK(value)));
            if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv) &&
                SvTYPE(sv) != SVt_PVGV)
            {
@@ -639,12 +673,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;
@@ -657,7 +691,7 @@ leave_scope(I32 base)
            break;
        case SAVEt_DESTRUCTOR:
            ptr = SSPOPPTR;
-           (*SSPOPDPTR)(ptr);
+           (*SSPOPDPTR)(THIS_ ptr);
            break;
        case SAVEt_REGCONTEXT:
            {