]> git.vpit.fr Git - perl/modules/Scope-Upper.git/commitdiff
A saner workaround for the "call_sv() during LEAVE clobbers the still used last poppe...
authorVincent Pit <vince@profvince.com>
Sat, 2 May 2009 14:42:38 +0000 (16:42 +0200)
committerVincent Pit <vince@profvince.com>
Sat, 2 May 2009 14:42:45 +0000 (16:42 +0200)
Upper.xs

index 8f6bda8377418af6a8dd29d82ac833b9a6ce6e3c..5e8e8e396302ee3ebf951f08f50927765c0c1247 100644 (file)
--- 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;