From: Vincent Pit Date: Mon, 18 Jan 2010 22:50:25 +0000 (+0100) Subject: A somewhat more robust handling of debugging frames X-Git-Tag: v0.10~2 X-Git-Url: http://git.vpit.fr/?a=commitdiff_plain;h=939954e5645f79398208b529b5e3ed189224a07a;p=perl%2Fmodules%2FScope-Upper.git A somewhat more robust handling of debugging frames --- diff --git a/Upper.xs b/Upper.xs index 61f8560..42f457e 100644 --- a/Upper.xs +++ b/Upper.xs @@ -706,18 +706,21 @@ STATIC void su_unwind(pTHX_ void *ud_) { #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) \