mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
[3.14] gh-140104: Set next_instr properly in the JIT during exceptions (GH-140233) (GH-140687)
Co-authored-by: Ken Jin <kenjin@python.org> Co-authored-by: devdanzin <74280297+devdanzin@users.noreply.github.com> Co-authored-by: Chris Eibl <138194463+chris-eibl@users.noreply.github.com>
This commit is contained in:
parent
3bb0eb4ca9
commit
2e21672803
3 changed files with 26 additions and 1 deletions
|
|
@ -1972,6 +1972,27 @@ def testfunc(n):
|
||||||
assert ex is not None
|
assert ex is not None
|
||||||
"""))
|
"""))
|
||||||
|
|
||||||
|
def test_next_instr_for_exception_handler_set(self):
|
||||||
|
# gh-140104: We just want the exception to be caught properly.
|
||||||
|
def f():
|
||||||
|
for i in range(TIER2_THRESHOLD + 3):
|
||||||
|
try:
|
||||||
|
undefined_variable(i)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
f()
|
||||||
|
|
||||||
|
def test_next_instr_for_exception_handler_set_lasts_instr(self):
|
||||||
|
# gh-140104: We just want the exception to be caught properly.
|
||||||
|
def f():
|
||||||
|
a_list = []
|
||||||
|
for _ in range(TIER2_THRESHOLD + 3):
|
||||||
|
try:
|
||||||
|
a_list[""] = 0
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def global_identity(x):
|
def global_identity(x):
|
||||||
return x
|
return x
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix a bug with exception handling in the JIT. Patch by Ken Jin. Bug reported
|
||||||
|
by Daniel Diniz.
|
||||||
|
|
@ -368,7 +368,9 @@ do { \
|
||||||
frame = tstate->current_frame; \
|
frame = tstate->current_frame; \
|
||||||
stack_pointer = _PyFrame_GetStackPointer(frame); \
|
stack_pointer = _PyFrame_GetStackPointer(frame); \
|
||||||
if (next_instr == NULL) { \
|
if (next_instr == NULL) { \
|
||||||
next_instr = frame->instr_ptr; \
|
/* gh-140104: The exception handler expects frame->instr_ptr
|
||||||
|
to after this_instr, not this_instr! */ \
|
||||||
|
next_instr = frame->instr_ptr + 1; \
|
||||||
JUMP_TO_LABEL(error); \
|
JUMP_TO_LABEL(error); \
|
||||||
} \
|
} \
|
||||||
DISPATCH(); \
|
DISPATCH(); \
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue