https://github.com/python/cpython/commit/1f2026b8a239b3169c0cad0157eb08358152b4c1
commit: 1f2026b8a239b3169c0cad0157eb08358152b4c1
branch: main
author: Irit Katriel <[email protected]>
committer: iritkatriel <[email protected]>
date: 2025-08-05T19:25:57+01:00
summary:
gh-137288: Fix bug where boolean expressions are not associated with the
correct exception handler (#137310)
files:
A
Misc/NEWS.d/next/Core_and_Builtins/2025-08-01-18-54-31.gh-issue-137288.FhE7ku.rst
M Include/internal/pycore_magic_number.h
M Lib/test/test_compile.py
M Python/flowgraph.c
diff --git a/Include/internal/pycore_magic_number.h
b/Include/internal/pycore_magic_number.h
index 347d9762f26bff..a570ae684379a4 100644
--- a/Include/internal/pycore_magic_number.h
+++ b/Include/internal/pycore_magic_number.h
@@ -281,6 +281,7 @@ Known values:
Python 3.15a1 3651 (Simplify LOAD_CONST)
Python 3.15a1 3652 (Virtual iterators)
Python 3.15a1 3653 (Fix handling of opcodes that may leave operands on the
stack when optimizing LOAD_FAST)
+ Python 3.15a1 3654 (Fix missing exception handlers in logical expression)
Python 3.16 will start with 3700
@@ -294,7 +295,7 @@ PC/launcher.c must also be updated.
*/
-#define PYC_MAGIC_NUMBER 3653
+#define PYC_MAGIC_NUMBER 3654
/* This is equivalent to converting PYC_MAGIC_NUMBER to 2 bytes
(little-endian) and then appending b'\r\n'. */
#define PYC_MAGIC_NUMBER_TOKEN \
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 57e5f29b015637..8a66be9b331262 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1723,6 +1723,21 @@ def test_compound(self):
self.assertIs(res, v[3])
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()
class TestSourcePositions(unittest.TestCase):
# Ensure that compiled code snippets have correct line and column numbers
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-01-18-54-31.gh-issue-137288.FhE7ku.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-01-18-54-31.gh-issue-137288.FhE7ku.rst
new file mode 100644
index 00000000000000..37c143f18e76f7
--- /dev/null
+++
b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-01-18-54-31.gh-issue-137288.FhE7ku.rst
@@ -0,0 +1,2 @@
+Fix bug where some bytecode instructions of a boolean expression are not
+associated with the correct exception handler.
diff --git a/Python/flowgraph.c b/Python/flowgraph.c
index 1cb6f03169e3b5..d82da15a43cac6 100644
--- a/Python/flowgraph.c
+++ b/Python/flowgraph.c
@@ -3472,11 +3472,13 @@ convert_pseudo_conditional_jumps(cfg_builder *g)
instr->i_opcode = instr->i_opcode == JUMP_IF_FALSE ?
POP_JUMP_IF_FALSE : POP_JUMP_IF_TRUE;
location loc = instr->i_loc;
+ basicblock *except = instr->i_except;
cfg_instr copy = {
.i_opcode = COPY,
.i_oparg = 1,
.i_loc = loc,
.i_target = NULL,
+ .i_except = except,
};
RETURN_IF_ERROR(basicblock_insert_instruction(b, i++, ©));
cfg_instr to_bool = {
@@ -3484,6 +3486,7 @@ convert_pseudo_conditional_jumps(cfg_builder *g)
.i_oparg = 0,
.i_loc = loc,
.i_target = NULL,
+ .i_except = except,
};
RETURN_IF_ERROR(basicblock_insert_instruction(b, i++,
&to_bool));
}
@@ -3726,6 +3729,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata
*umd, basicblock *entrybl
.i_oparg = 0,
.i_loc = loc,
.i_target = NULL,
+ .i_except = NULL,
};
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0,
&make_gen));
cfg_instr pop_top = {
@@ -3733,6 +3737,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata
*umd, basicblock *entrybl
.i_oparg = 0,
.i_loc = loc,
.i_target = NULL,
+ .i_except = NULL,
};
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 1,
&pop_top));
}
@@ -3763,6 +3768,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata
*umd, basicblock *entrybl
.i_oparg = oldindex,
.i_loc = NO_LOCATION,
.i_target = NULL,
+ .i_except = NULL,
};
if (basicblock_insert_instruction(entryblock, ncellsused,
&make_cell) < 0) {
PyMem_RawFree(sorted);
@@ -3779,6 +3785,7 @@ insert_prefix_instructions(_PyCompile_CodeUnitMetadata
*umd, basicblock *entrybl
.i_oparg = nfreevars,
.i_loc = NO_LOCATION,
.i_target = NULL,
+ .i_except = NULL,
};
RETURN_IF_ERROR(basicblock_insert_instruction(entryblock, 0,
©_frees));
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]