/* --- Pop a context back -------------------------------------------------- */
-#if SU_DEBUG && defined(DEBUGGING)
+#ifdef DEBUGGING
# define SU_CXNAME(C) PL_block_type[CxTYPE(C)]
#else
-# define SU_CXNAME(C) "XXX"
+# if SU_HAS_PERL(5, 11, 0)
+static const char *su_block_type[] = {
+ "NULL",
+ "WHEN",
+ "BLOCK",
+ "GIVEN",
+ "LOOP_FOR",
+ "LOOP_PLAIN",
+ "LOOP_LAZYSV",
+ "LOOP_LAZYIV",
+ "SUB",
+ "FORMAT",
+ "EVAL",
+ "SUBST"
+};
+# elif SU_HAS_PERL(5, 9, 3)
+static const char *su_block_type[] = {
+ "NULL",
+ "SUB",
+ "EVAL",
+ "WHEN",
+ "SUBST",
+ "BLOCK",
+ "FORMAT",
+ "GIVEN",
+ "LOOP_FOR",
+ "LOOP_PLAIN",
+ "LOOP_LAZYSV",
+ "LOOP_LAZYIV"
+};
+# else
+static const char *su_block_type[] = {
+ "NULL",
+ "SUB",
+ "EVAL",
+ "LOOP",
+ "SUBST",
+ "BLOCK"
+};
+# endif
+# define SU_CXNAME(C) su_block_type[CxTYPE(C)]
#endif
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, pad, offset, base, *origin;
SU_D(PerlIO_printf(Perl_debug_log, "%p: ### init for cx %d\n", ud, cxix));
SU_D(PerlIO_printf(Perl_debug_log, "%p: size=%d pad=%d offset=%d\n",
ud, size, pad, offset));
- for (i = cxstack_ix; i > cxix; --i) {
- PERL_CONTEXT *cx = cxstack + i;
- switch (CxTYPE(cx)) {
-#if SU_HAS_PERL(5, 11, 0)
- case CXt_LOOP_FOR:
- case CXt_LOOP_PLAIN:
- case CXt_LOOP_LAZYSV:
- case CXt_LOOP_LAZYIV:
-#else
- case CXt_LOOP:
-#endif
- SU_D(PerlIO_printf(Perl_debug_log, "%p: cx %d is loop\n", ud, i));
- depth += 2;
- break;
- default:
- SU_D(PerlIO_printf(Perl_debug_log, "%p: cx %d is other\n", ud, i));
- depth++;
- break;
- }
- }
+ depth = PL_scopestack_ix - cxstack[cxix].blk_oldscopesp;
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;
#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;