]> git.vpit.fr Git - perl/modules/Scope-Upper.git/blobdiff - Upper.xs
Rewrite the origin initialization loop in su_init()
[perl/modules/Scope-Upper.git] / Upper.xs
index 702481594747b6e41c6753b5f9304e1fecae3cf7..728cfecd663bfca78f00c7cd3161f51f8a758673 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -1010,7 +1010,7 @@ static void su_pop(pTHX_ void *ud) {
 
 #if SU_HAS_PERL(5, 19, 4)
   cx = cxstack + cxstack_ix;
-  if (CxTYPE(cx) == CXt_SUB)
+  if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
    save = PL_scopestack[cx->blk_oldscopesp - 1];
 #endif
 
@@ -1018,7 +1018,7 @@ static void su_pop(pTHX_ void *ud) {
   leave_scope(base);
 
 #if SU_HAS_PERL(5, 19, 4)
-  if (CxTYPE(cx) == CXt_SUB)
+  if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT)
    PL_scopestack[cx->blk_oldscopesp - 1] = save;
 #endif
  }
@@ -1056,7 +1056,7 @@ static void su_pop(pTHX_ void *ud) {
 
 static I32 su_init(pTHX_ void *ud, I32 cxix, I32 size) {
 #define su_init(U, C, S) su_init(aTHX_ (U), (C), (S))
- I32 i, depth = 1, pad, offset, *origin;
+ I32 i, depth = 1, pad, offset, base, *origin;
 
  SU_D(PerlIO_printf(Perl_debug_log, "%p: ### init for cx %d\n", ud, cxix));
 
@@ -1096,11 +1096,12 @@ static I32 su_init(pTHX_ void *ud, I32 cxix, I32 size) {
  SU_D(PerlIO_printf(Perl_debug_log, "%p: going down to depth %d\n", ud, depth));
 
  Newx(origin, depth + 1, I32);
- origin[0] = PL_scopestack[PL_scopestack_ix - depth];
- PL_scopestack[PL_scopestack_ix - depth] += size;
- for (i = depth - 1; i >= 1; --i) {
-  I32 j = PL_scopestack_ix - i;
-  origin[depth - i] = PL_scopestack[j];
+ base = PL_scopestack_ix - depth;
+ origin[0] = PL_scopestack[base];
+ PL_scopestack[base] += size;
+ for (i = 1; i < depth; ++i) {
+  I32 j = i + base;
+  origin[i] = PL_scopestack[j];
   PL_scopestack[j] += offset;
  }
  origin[depth] = PL_savestack_ix;
@@ -1220,12 +1221,12 @@ static void su_yield(pTHX_ void *ud_) {
 #if SU_HAS_PERL(5, 10, 0)
    if (cxix > 0) {
     PERL_CONTEXT *prev = cx - 1;
-    U8 type = CxTYPE(prev);
-    if ((type == CXt_GIVEN || type == CXt_WHEN)
+    U8       prev_type = CxTYPE(prev);
+    if ((prev_type == CXt_GIVEN || prev_type == CXt_WHEN)
         && (prev->blk_oldcop == cx->blk_oldcop)) {
      cxix--;
      cx = prev;
-     if (type == CXt_GIVEN)
+     if (prev_type == CXt_GIVEN)
       goto cxt_given;
      else
       goto cxt_when;
@@ -2221,7 +2222,7 @@ static I32 su_context_gimme(pTHX_ I32 cxix) {
 
 /* --- Global setup/teardown ----------------------------------------------- */
 
-static U32 su_initialized = 0;
+static VOL U32 su_initialized = 0;
 
 static void su_global_teardown(pTHX_ void *root) {
  if (!su_initialized)