bpo-12458: Fix line numbers for multiline expressions. (GH-8774)
This commit is contained in:
parent
5e99b56d6b
commit
da8d72c953
|
@ -124,7 +124,8 @@ dis_bug708901 = """\
|
|||
2 LOAD_CONST 1 (1)
|
||||
|
||||
%3d 4 LOAD_CONST 2 (10)
|
||||
6 CALL_FUNCTION 2
|
||||
|
||||
%3d 6 CALL_FUNCTION 2
|
||||
8 GET_ITER
|
||||
>> 10 FOR_ITER 4 (to 16)
|
||||
12 STORE_FAST 0 (res)
|
||||
|
@ -134,6 +135,7 @@ dis_bug708901 = """\
|
|||
18 RETURN_VALUE
|
||||
""" % (bug708901.__code__.co_firstlineno + 1,
|
||||
bug708901.__code__.co_firstlineno + 2,
|
||||
bug708901.__code__.co_firstlineno + 1,
|
||||
bug708901.__code__.co_firstlineno + 3)
|
||||
|
||||
|
||||
|
@ -154,7 +156,8 @@ dis_bug1333982 = """\
|
|||
16 CALL_FUNCTION 1
|
||||
|
||||
%3d 18 LOAD_CONST 4 (1)
|
||||
20 BINARY_ADD
|
||||
|
||||
%3d 20 BINARY_ADD
|
||||
22 CALL_FUNCTION 1
|
||||
24 RAISE_VARARGS 1
|
||||
|
||||
|
@ -164,6 +167,7 @@ dis_bug1333982 = """\
|
|||
__file__,
|
||||
bug1333982.__code__.co_firstlineno + 1,
|
||||
bug1333982.__code__.co_firstlineno + 2,
|
||||
bug1333982.__code__.co_firstlineno + 1,
|
||||
bug1333982.__code__.co_firstlineno + 3)
|
||||
|
||||
_BIG_LINENO_FORMAT = """\
|
||||
|
|
|
@ -2719,7 +2719,7 @@ Check doctest with a non-ascii filename:
|
|||
Exception raised:
|
||||
Traceback (most recent call last):
|
||||
File ...
|
||||
compileflags, 1), test.globs)
|
||||
exec(compile(example.source, filename, "single",
|
||||
File "<doctest foo-bär@baz[0]>", line 1, in <module>
|
||||
raise Exception('clé')
|
||||
Exception: clé
|
||||
|
|
|
@ -400,7 +400,7 @@ class FaultHandlerTests(unittest.TestCase):
|
|||
if filename:
|
||||
lineno = 9
|
||||
elif fd is not None:
|
||||
lineno = 12
|
||||
lineno = 11
|
||||
else:
|
||||
lineno = 14
|
||||
expected = [
|
||||
|
|
|
@ -995,11 +995,11 @@ class TestStack(unittest.TestCase):
|
|||
s = some_inner(3, 4)
|
||||
self.assertEqual(
|
||||
[' File "%s", line %d, in some_inner\n'
|
||||
' traceback.walk_stack(None), capture_locals=True, limit=1)\n'
|
||||
' return traceback.StackSummary.extract(\n'
|
||||
' a = 1\n'
|
||||
' b = 2\n'
|
||||
' k = 3\n'
|
||||
' v = 4\n' % (__file__, some_inner.__code__.co_firstlineno + 4)
|
||||
' v = 4\n' % (__file__, some_inner.__code__.co_firstlineno + 3)
|
||||
], s.format())
|
||||
|
||||
class TestTracebackException(unittest.TestCase):
|
||||
|
|
|
@ -936,7 +936,7 @@ class TestCAPI(unittest.TestCase):
|
|||
return None
|
||||
|
||||
def track(self, release_gil=False, nframe=1):
|
||||
frames = get_frames(nframe, 2)
|
||||
frames = get_frames(nframe, 1)
|
||||
_testcapi.tracemalloc_track(self.domain, self.ptr, self.size,
|
||||
release_gil)
|
||||
return frames
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Tracebacks show now correct line number for subexpressions in multiline
|
||||
expressions. Tracebacks show now the line number of the first line for
|
||||
multiline expressions instead of the line number of the last subexpression.
|
|
@ -4089,10 +4089,6 @@ compiler_comprehension(struct compiler *c, expr_ty e, int type,
|
|||
is_async_generator = c->u->u_ste->ste_coroutine;
|
||||
|
||||
if (is_async_generator && !is_async_function && type != COMP_GENEXP) {
|
||||
if (e->lineno > c->u->u_lineno) {
|
||||
c->u->u_lineno = e->lineno;
|
||||
c->u->u_lineno_set = 0;
|
||||
}
|
||||
compiler_error(c, "asynchronous comprehension outside of "
|
||||
"an asynchronous function");
|
||||
goto error_in_scope;
|
||||
|
@ -4430,17 +4426,8 @@ compiler_with(struct compiler *c, stmt_ty s, int pos)
|
|||
}
|
||||
|
||||
static int
|
||||
compiler_visit_expr(struct compiler *c, expr_ty e)
|
||||
compiler_visit_expr1(struct compiler *c, expr_ty e)
|
||||
{
|
||||
/* If expr e has a different line number than the last expr/stmt,
|
||||
set a new line number for the next instruction.
|
||||
*/
|
||||
if (e->lineno > c->u->u_lineno) {
|
||||
c->u->u_lineno = e->lineno;
|
||||
c->u->u_lineno_set = 0;
|
||||
}
|
||||
/* Updating the column offset is always harmless. */
|
||||
c->u->u_col_offset = e->col_offset;
|
||||
switch (e->kind) {
|
||||
case BoolOp_kind:
|
||||
return compiler_boolop(c, e);
|
||||
|
@ -4609,6 +4596,31 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
compiler_visit_expr(struct compiler *c, expr_ty e)
|
||||
{
|
||||
/* If expr e has a different line number than the last expr/stmt,
|
||||
set a new line number for the next instruction.
|
||||
*/
|
||||
int old_lineno = c->u->u_lineno;
|
||||
int old_col_offset = c->u->u_col_offset;
|
||||
if (e->lineno != c->u->u_lineno) {
|
||||
c->u->u_lineno = e->lineno;
|
||||
c->u->u_lineno_set = 0;
|
||||
}
|
||||
/* Updating the column offset is always harmless. */
|
||||
c->u->u_col_offset = e->col_offset;
|
||||
|
||||
int res = compiler_visit_expr1(c, e);
|
||||
|
||||
if (old_lineno != c->u->u_lineno) {
|
||||
c->u->u_lineno = old_lineno;
|
||||
c->u->u_lineno_set = 0;
|
||||
}
|
||||
c->u->u_col_offset = old_col_offset;
|
||||
return res;
|
||||
}
|
||||
|
||||
static int
|
||||
compiler_augassign(struct compiler *c, stmt_ty s)
|
||||
{
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue