From: Vincent Pit Date: Sat, 2 May 2009 14:42:38 +0000 (+0200) Subject: A saner workaround for the "call_sv() during LEAVE clobbers the still used last poppe... X-Git-Tag: v0.09~9 X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FScope-Upper.git;a=commitdiff_plain;h=2436778e0e29dd2f20d72518fec5bc8c29efe4e4 A saner workaround for the "call_sv() during LEAVE clobbers the still used last popped stack element" issue on 5.10 --- diff --git a/Upper.xs b/Upper.xs index 8f6bda8..5e8e8e3 100644 --- a/Upper.xs +++ b/Upper.xs @@ -278,7 +278,9 @@ typedef struct { STATIC void su_call(pTHX_ void *ud_) { su_ud_reap *ud = (su_ud_reap *) ud_; #if SU_HAS_PERL(5, 10, 0) + PERL_CONTEXT saved_cx; I32 dieing = PL_op->op_type == OP_DIE; + I32 cxix; #endif dSP; @@ -297,17 +299,18 @@ STATIC void su_call(pTHX_ void *ud_) { #if SU_HAS_PERL(5, 10, 0) if (dieing) { if (cxstack_ix < cxstack_max) - ++cxstack_ix; + cxix = cxstack_ix + 1; else - cxstack_ix = Perl_cxinc(aTHX); + cxix = Perl_cxinc(aTHX); + saved_cx = cxstack[cxix]; } #endif call_sv(ud->cb, G_VOID); #if SU_HAS_PERL(5, 10, 0) - if (dieing && cxstack_ix > 0) - --cxstack_ix; + if (dieing) + cxstack[cxix] = saved_cx; #endif PUTBACK;