X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=Upper.xs;h=42f457e4302a5f46294c457612e79477aafb1634;hb=939954e5645f79398208b529b5e3ed189224a07a;hp=61f8560e5bf4b957971e31d2d65260f41984ef66;hpb=2dab5cc160177f9e19f4cb658ecf9d3e9f44a10f;p=perl%2Fmodules%2FScope-Upper.git 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) \