mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-98390: Fix source locations of boolean sub-expressions (GH-98396)
This commit is contained in:
parent
debacd9ad5
commit
c051d55ddb
3 changed files with 28 additions and 1 deletions
|
@ -1207,6 +1207,32 @@ f(
|
|||
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.
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fix location of sub-expressions of boolean expressions, by reducing their scope to that of the sub-expression.
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue