mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
[3.14] gh-137288: Fix bug where boolean expressions are not associated with the correct exception handler (GH-137310). (#137427)
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Co-authored-by: Petr Viktorin <encukou@gmail.com>
This commit is contained in:
parent
019238ab18
commit
0ccf244a19
5 changed files with 27 additions and 2 deletions
|
|
@ -278,6 +278,7 @@ Known values:
|
||||||
Python 3.14a7 3623 (Add BUILD_INTERPOLATION & BUILD_TEMPLATE opcodes)
|
Python 3.14a7 3623 (Add BUILD_INTERPOLATION & BUILD_TEMPLATE opcodes)
|
||||||
Python 3.14b1 3624 (Don't optimize LOAD_FAST when local is killed by DELETE_FAST)
|
Python 3.14b1 3624 (Don't optimize LOAD_FAST when local is killed by DELETE_FAST)
|
||||||
Python 3.14b3 3625 (Fix handling of opcodes that may leave operands on the stack when optimizing LOAD_FAST)
|
Python 3.14b3 3625 (Fix handling of opcodes that may leave operands on the stack when optimizing LOAD_FAST)
|
||||||
|
Python 3.14b5 3626 (Fix missing exception handlers in logical expression)
|
||||||
|
|
||||||
Python 3.15 will start with 3650
|
Python 3.15 will start with 3650
|
||||||
|
|
||||||
|
|
@ -290,7 +291,7 @@ PC/launcher.c must also be updated.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PYC_MAGIC_NUMBER 3625
|
#define PYC_MAGIC_NUMBER 3626
|
||||||
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
|
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
|
||||||
(little-endian) and then appending b'\r\n'. */
|
(little-endian) and then appending b'\r\n'. */
|
||||||
#define PYC_MAGIC_NUMBER_TOKEN \
|
#define PYC_MAGIC_NUMBER_TOKEN \
|
||||||
|
|
|
||||||
|
|
@ -1723,6 +1723,21 @@ def test_compound(self):
|
||||||
self.assertIs(res, v[3])
|
self.assertIs(res, v[3])
|
||||||
self.assertEqual([e.called for e in v], [1, 1, 0, 1, 0])
|
self.assertEqual([e.called for e in v], [1, 1, 0, 1, 0])
|
||||||
|
|
||||||
|
def test_exception(self):
|
||||||
|
# See gh-137288
|
||||||
|
class Foo:
|
||||||
|
def __bool__(self):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
a = Foo()
|
||||||
|
b = Foo()
|
||||||
|
|
||||||
|
with self.assertRaises(NotImplementedError):
|
||||||
|
bool(a)
|
||||||
|
|
||||||
|
with self.assertRaises(NotImplementedError):
|
||||||
|
c = a or b
|
||||||
|
|
||||||
@requires_debug_ranges()
|
@requires_debug_ranges()
|
||||||
class TestSourcePositions(unittest.TestCase):
|
class TestSourcePositions(unittest.TestCase):
|
||||||
# Ensure that compiled code snippets have correct line and column numbers
|
# Ensure that compiled code snippets have correct line and column numbers
|
||||||
|
|
|
||||||
|
|
@ -635,7 +635,7 @@ def test_magic_number(self):
|
||||||
# stakeholders such as OS package maintainers must be notified
|
# stakeholders such as OS package maintainers must be notified
|
||||||
# in advance. Such exceptional releases will then require an
|
# in advance. Such exceptional releases will then require an
|
||||||
# adjustment to this test case.
|
# adjustment to this test case.
|
||||||
EXPECTED_MAGIC_NUMBER = 3625
|
EXPECTED_MAGIC_NUMBER = 3626
|
||||||
actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little')
|
actual = int.from_bytes(importlib.util.MAGIC_NUMBER[:2], 'little')
|
||||||
|
|
||||||
msg = (
|
msg = (
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix bug where some bytecode instructions of a boolean expression are not
|
||||||
|
associated with the correct exception handler.
|
||||||
|
|
@ -3463,11 +3463,13 @@ convert_pseudo_conditional_jumps(cfg_builder *g)
|
||||||
instr->i_opcode = instr->i_opcode == JUMP_IF_FALSE ?
|
instr->i_opcode = instr->i_opcode == JUMP_IF_FALSE ?
|
||||||
POP_JUMP_IF_FALSE : POP_JUMP_IF_TRUE;
|
POP_JUMP_IF_FALSE : POP_JUMP_IF_TRUE;
|
||||||
location loc = instr->i_loc;
|
location loc = instr->i_loc;
|
||||||
|
basicblock *except = instr->i_except;
|
||||||
cfg_instr copy = {
|
cfg_instr copy = {
|
||||||
.i_opcode = COPY,
|
.i_opcode = COPY,
|
||||||
.i_oparg = 1,
|
.i_oparg = 1,
|
||||||
.i_loc = loc,
|
.i_loc = loc,
|
||||||
.i_target = NULL,
|
.i_target = NULL,
|
||||||
|
.i_except = except,
|
||||||
};
|
};
|
||||||
RETURN_IF_ERROR(basicblock_insert_instruction(b, i++, ©));
|
RETURN_IF_ERROR(basicblock_insert_instruction(b, i++, ©));
|
||||||
cfg_instr to_bool = {
|
cfg_instr to_bool = {
|
||||||
|
|
@ -3475,6 +3477,7 @@ convert_pseudo_conditional_jumps(cfg_builder *g)
|
||||||
.i_oparg = 0,
|
.i_oparg = 0,
|
||||||
.i_loc = loc,
|
.i_loc = loc,
|
||||||
.i_target = NULL,
|
.i_target = NULL,
|
||||||
|
.i_except = except,
|
||||||
};
|
};
|
||||||
RETURN_IF_ERROR(basicblock_insert_instruction(b, i++, &to_bool));
|
RETURN_IF_ERROR(basicblock_insert_instruction(b, i++, &to_bool));
|
||||||
}
|
}
|
||||||
|
|
@ -3717,6 +3720,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata *umd, basicblock *entrybl
|
||||||
.i_oparg = 0,
|
.i_oparg = 0,
|
||||||
.i_loc = loc,
|
.i_loc = loc,
|
||||||
.i_target = NULL,
|
.i_target = NULL,
|
||||||
|
.i_except = NULL,
|
||||||
};
|
};
|
||||||
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0, &make_gen));
|
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0, &make_gen));
|
||||||
cfg_instr pop_top = {
|
cfg_instr pop_top = {
|
||||||
|
|
@ -3724,6 +3728,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata *umd, basicblock *entrybl
|
||||||
.i_oparg = 0,
|
.i_oparg = 0,
|
||||||
.i_loc = loc,
|
.i_loc = loc,
|
||||||
.i_target = NULL,
|
.i_target = NULL,
|
||||||
|
.i_except = NULL,
|
||||||
};
|
};
|
||||||
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 1, &pop_top));
|
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 1, &pop_top));
|
||||||
}
|
}
|
||||||
|
|
@ -3754,6 +3759,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata *umd, basicblock *entrybl
|
||||||
.i_oparg = oldindex,
|
.i_oparg = oldindex,
|
||||||
.i_loc = NO_LOCATION,
|
.i_loc = NO_LOCATION,
|
||||||
.i_target = NULL,
|
.i_target = NULL,
|
||||||
|
.i_except = NULL,
|
||||||
};
|
};
|
||||||
if (basicblock_insert_instruction(entryblock, ncellsused, &make_cell) < 0) {
|
if (basicblock_insert_instruction(entryblock, ncellsused, &make_cell) < 0) {
|
||||||
PyMem_RawFree(sorted);
|
PyMem_RawFree(sorted);
|
||||||
|
|
@ -3770,6 +3776,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata *umd, basicblock *entrybl
|
||||||
.i_oparg = nfreevars,
|
.i_oparg = nfreevars,
|
||||||
.i_loc = NO_LOCATION,
|
.i_loc = NO_LOCATION,
|
||||||
.i_target = NULL,
|
.i_target = NULL,
|
||||||
|
.i_except = NULL,
|
||||||
};
|
};
|
||||||
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0, ©_frees));
|
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0, ©_frees));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue