Better fix for #8738 (Core dump in 'leavetry')
authorDave Mitchell <davem@fdisolutions.com>
Mon, 2 May 2005 14:27:20 +0000 (14:27 +0000)
committerDave Mitchell <davem@fdisolutions.com>
Mon, 2 May 2005 14:27:20 +0000 (14:27 +0000)
commitabd70938721b65db3288384c514cb47b77a12268
treedc402b0f8ccfbe6e2a305887f31c59548d7601f3
parent745cf2ffbef88177c764dae7c27dbc293c1abb81
Better fix for #8738  (Core dump in 'leavetry')
When in an inner runops loop (eg via a tie or sort), an eval
needs a new JMPENV pushing by S_docatch. If an exception is raised,
control is returned to S_docatch, and it must determine whether
the eval that trapped the exception is an inner eval or an outer
one. In the former case, restart the loop, in the latter case,
rethrow the exception. This is determined by whether we are still
at the same PL_curstackinfo level. This fails in the case of
SPLICE(), which pushes a new SETJMP and runops level, but not a
new stackinfo level. There may be other code which does similar.
The solution is to store the current value of PL_top_env in each
pushed CxEVAL, and see if it's still the same as PL_top_env when
the exception is handled.

p4raw-id: //depot/perl@24363
cop.h
pp_ctl.c