[Python-checkins] gh-98390: Fix source locations of boolean sub-expressions (GH-98396)

iritkatriel webhook-mailer at python.org
Tue Oct 18 12:18:44 EDT 2022


https://github.com/python/cpython/commit/c051d55ddb29c4ff7b1fcc65971535f78369ffc0
commit: c051d55ddb29c4ff7b1fcc65971535f78369ffc0
branch: main
author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com>
committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com>
date: 2022-10-18T17:18:38+01:00
summary:

gh-98390: Fix source locations of boolean sub-expressions (GH-98396)

files:
A Misc/NEWS.d/next/Core and Builtins/2022-10-18-14-11-32.gh-issue-98390.H1sxJu.rst
M Lib/test/test_compile.py
M Python/compile.c

diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index f5c0c7647832..a5434d6fd512 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -1207,6 +1207,32 @@ def test_multiline_expression(self):
         self.assertOpcodeSourcePositionIs(compiled_code, 'CALL',
             line=1, end_line=3, column=0, end_column=1)
 
+    def test_multiline_boolean_expression(self):
+        snippet = """\
+if (a or
+    (b and not c) or
+    not (
+        d > 0)):
+    x = 42
+"""
+
+        compiled_code, _ = self.check_positions_against_ast(snippet)
+        # jump if a is true:
+        self.assertOpcodeSourcePositionIs(compiled_code, 'POP_JUMP_IF_TRUE',
+            line=1, end_line=1, column=4, end_column=5, occurrence=1)
+        # jump if b is false:
+        self.assertOpcodeSourcePositionIs(compiled_code, 'POP_JUMP_IF_FALSE',
+            line=2, end_line=2, column=5, end_column=6, occurrence=1)
+        # jump if c is false:
+        self.assertOpcodeSourcePositionIs(compiled_code, 'POP_JUMP_IF_FALSE',
+            line=2, end_line=2, column=15, end_column=16, occurrence=2)
+        # compare d and 0
+        self.assertOpcodeSourcePositionIs(compiled_code, 'COMPARE_OP',
+            line=4, end_line=4, column=8, end_column=13, occurrence=1)
+        # jump if comparison it True
+        self.assertOpcodeSourcePositionIs(compiled_code, 'POP_JUMP_IF_TRUE',
+            line=4, end_line=4, column=8, end_column=13, occurrence=2)
+
     def test_very_long_line_end_offset(self):
         # Make sure we get the correct column offset for offsets
         # too large to store in a byte.
diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-10-18-14-11-32.gh-issue-98390.H1sxJu.rst b/Misc/NEWS.d/next/Core and Builtins/2022-10-18-14-11-32.gh-issue-98390.H1sxJu.rst
new file mode 100644
index 000000000000..6dac72b905c9
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2022-10-18-14-11-32.gh-issue-98390.H1sxJu.rst	
@@ -0,0 +1 @@
+Fix location of sub-expressions of boolean expressions, by reducing their scope to that of the sub-expression.
diff --git a/Python/compile.c b/Python/compile.c
index 5fbf6fe10d13..4d5b41aa1300 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2953,7 +2953,7 @@ compiler_jump_if(struct compiler *c, location *ploc,
 
     /* general implementation */
     VISIT(c, expr, e);
-    ADDOP_JUMP(c, *ploc, cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
+    ADDOP_JUMP(c, LOC(e), cond ? POP_JUMP_IF_TRUE : POP_JUMP_IF_FALSE, next);
     return 1;
 }
 



More information about the Python-checkins mailing list