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

This commit is contained in:
Irit Katriel 2022-10-18 17:18:38 +01:00 committed by GitHub
parent debacd9ad5
commit c051d55ddb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 1 deletions

View file

@ -1207,6 +1207,32 @@ f(
self.assertOpcodeSourcePositionIs(compiled_code, 'CALL', self.assertOpcodeSourcePositionIs(compiled_code, 'CALL',
line=1, end_line=3, column=0, end_column=1) 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): def test_very_long_line_end_offset(self):
# Make sure we get the correct column offset for offsets # Make sure we get the correct column offset for offsets
# too large to store in a byte. # too large to store in a byte.

View file

@ -0,0 +1 @@
Fix location of sub-expressions of boolean expressions, by reducing their scope to that of the sub-expression.

View file

@ -2953,7 +2953,7 @@ compiler_jump_if(struct compiler *c, location *ploc,
/* general implementation */ /* general implementation */
VISIT(c, expr, e); 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; return 1;
} }