su_ud_reap *ud = (su_ud_reap *) ud_;
#if SU_HAS_PERL(5, 9, 5)
PERL_CONTEXT saved_cx;
- I32 dieing = PL_op->op_type == OP_DIE;
I32 cxix;
#endif
* the sub scope from call_sv, although it's still needed in our caller. */
#if SU_HAS_PERL(5, 9, 5)
- if (dieing) {
- if (cxstack_ix < cxstack_max)
- cxix = cxstack_ix + 1;
- else
- cxix = Perl_cxinc(aTHX);
- saved_cx = cxstack[cxix];
- }
+ if (cxstack_ix < cxstack_max)
+ cxix = cxstack_ix + 1;
+ else
+ cxix = Perl_cxinc(aTHX);
+ saved_cx = cxstack[cxix];
#endif
call_sv(ud->cb, G_VOID);
#if SU_HAS_PERL(5, 9, 5)
- if (dieing)
- cxstack[cxix] = saved_cx;
+ cxstack[cxix] = saved_cx;
#endif
PUTBACK;
case SVt_PVCV:
case SVt_PVGV:
deref = 0;
+ default:
break;
}
/* When deref is set, val isn't NULL */
#define SU_SKIP_DB(C) \
STMT_START { \
- I32 i = 1; \
- PERL_CONTEXT *cx = cxstack + (C); \
- do { \
- if (CxTYPE(cx) == CXt_BLOCK && (C) >= i) { \
- --cx; \
- if (CxTYPE(cx) == CXt_SUB && cx->blk_sub.cv == GvCV(PL_DBsub)) { \
- (C) -= i + 1; \
- break; \
- } \
- } else \
- break; \
- } while (++i <= SU_SKIP_DB_MAX); \
+ I32 skipped = 0; \
+ PERL_CONTEXT *base = cxstack; \
+ PERL_CONTEXT *cx = base + (C); \
+ while (cx >= base && (C) > skipped && CxTYPE(cx) == CXt_BLOCK) \
+ --cx, ++skipped; \
+ if (cx >= base && (C) > skipped) { \
+ switch (CxTYPE(cx)) { \
+ case CXt_SUB: \
+ if (skipped <= SU_SKIP_DB_MAX && cx->blk_sub.cv == GvCV(PL_DBsub)) \
+ (C) -= skipped + 1; \
+ break; \
+ default: \
+ break; \
+ } \
+ } \
} STMT_END
#define SU_GET_CONTEXT(A, B) \