diff options
author | Zefram <zefram@fysh.org> | 2010-04-21 00:00:09 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2010-04-25 13:24:29 +0100 |
commit | febb3a6d221072614a4dcfef3d3953e212e5cf6c (patch) | |
tree | 77ef0076d97be14c024406d9012b49db19234ad2 /pp_ctl.c | |
parent | db93c0c46b34e8b2e37c671b7362d0fa2550f5f7 (diff) | |
download | perl-febb3a6d221072614a4dcfef3d3953e212e5cf6c.tar.gz |
unwinding target nominated by separate global
When unwinding due to die, the new global PL_restartjmpenv points
to the JMP_ENV at which longjmping should stop and control should
be transferred to PL_restartop. This replaces the previous
use of cxstack[cxstack_ix+1].blk_eval.cur_top_env, located in a
nominally-discarded context frame.
Diffstat (limited to 'pp_ctl.c')
-rw-r--r-- | pp_ctl.c | 14 |
1 files changed, 3 insertions, 11 deletions
@@ -1664,6 +1664,7 @@ Perl_die_where(pTHX_ SV *msv) *msg ? msg : "Unknown error\n"); } assert(CxTYPE(cx) == CXt_EVAL); + PL_restartjmpenv = cx->blk_eval.cur_top_env; PL_restartop = cx->blk_eval.retop; JMPENV_JUMP(3); /* NOTREACHED */ @@ -2881,17 +2882,8 @@ S_docatch(pTHX_ OP *o) break; case 3: /* die caught by an inner eval - continue inner loop */ - - /* NB XXX we rely on the old popped CxEVAL still being at the top - * of the stack; the way die_where() currently works, this - * assumption is valid. In theory The cur_top_env value should be - * returned in another global, the way retop (aka PL_restartop) - * is. */ - assert(CxTYPE(&cxstack[cxstack_ix+1]) == CXt_EVAL); - - if (PL_restartop - && cxstack[cxstack_ix+1].blk_eval.cur_top_env == PL_top_env) - { + if (PL_restartop && PL_restartjmpenv == PL_top_env) { + PL_restartjmpenv = NULL; PL_op = PL_restartop; PL_restartop = 0; goto redo_body; |