Skip to content

Commit

Permalink
gh-98398: Fix source locations for 'assert' bytecode (GH-98405)
Browse files Browse the repository at this point in the history
  • Loading branch information
iritkatriel authored Oct 19, 2022
1 parent e4ec8de commit 9be05df
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 9 deletions.
18 changes: 17 additions & 1 deletion Lib/test/test_compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,6 @@ def test_multiline_boolean_expression(self):
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',
Expand All @@ -1233,6 +1232,23 @@ def test_multiline_boolean_expression(self):
self.assertOpcodeSourcePositionIs(compiled_code, 'POP_JUMP_IF_TRUE',
line=4, end_line=4, column=8, end_column=13, occurrence=2)

def test_multiline_assert(self):
snippet = """\
assert (a > 0 and
bb > 0 and
ccc == 4), "error msg"
"""
compiled_code, _ = self.check_positions_against_ast(snippet)
self.assertOpcodeSourcePositionIs(compiled_code, 'LOAD_ASSERTION_ERROR',
line=1, end_line=3, column=0, end_column=30, occurrence=1)
# The "error msg":
self.assertOpcodeSourcePositionIs(compiled_code, 'LOAD_CONST',
line=3, end_line=3, column=19, end_column=30, occurrence=4)
self.assertOpcodeSourcePositionIs(compiled_code, 'CALL',
line=1, end_line=3, column=0, end_column=30, occurrence=1)
self.assertOpcodeSourcePositionIs(compiled_code, 'RAISE_VARARGS',
line=1, end_line=3, column=0, end_column=30, occurrence=1)

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.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix source location of 'assert' bytecodes.
18 changes: 10 additions & 8 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -3960,31 +3960,33 @@ compiler_from_import(struct compiler *c, stmt_ty s)
static int
compiler_assert(struct compiler *c, stmt_ty s)
{
location loc = LOC(s);
/* Always emit a warning if the test is a non-zero length tuple */
if ((s->v.Assert.test->kind == Tuple_kind &&
asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) ||
(s->v.Assert.test->kind == Constant_kind &&
PyTuple_Check(s->v.Assert.test->v.Constant.value) &&
PyTuple_Size(s->v.Assert.test->v.Constant.value) > 0))
{
if (!compiler_warn(c, loc, "assertion is always true, "
"perhaps remove parentheses?"))
if (!compiler_warn(c, LOC(s), "assertion is always true, "
"perhaps remove parentheses?"))
{
return 0;
}
}
if (c->c_optimize)
if (c->c_optimize) {
return 1;
}
NEW_JUMP_TARGET_LABEL(c, end);
if (!compiler_jump_if(c, &loc, s->v.Assert.test, end, 1))
location loc = LOC(s);
if (!compiler_jump_if(c, &loc, s->v.Assert.test, end, 1)) {
return 0;
ADDOP(c, loc, LOAD_ASSERTION_ERROR);
}
ADDOP(c, LOC(s), LOAD_ASSERTION_ERROR);
if (s->v.Assert.msg) {
VISIT(c, expr, s->v.Assert.msg);
ADDOP_I(c, loc, CALL, 0);
ADDOP_I(c, LOC(s), CALL, 0);
}
ADDOP_I(c, loc, RAISE_VARARGS, 1);
ADDOP_I(c, LOC(s), RAISE_VARARGS, 1);

USE_LABEL(c, end);
return 1;
Expand Down

0 comments on commit 9be05df

Please sign in to comment.