bpo-12458: Fix line numbers for multiline expressions. (GH-8774)

This commit is contained in:
Serhiy Storchaka 2018-09-17 15:17:29 +03:00 committed by GitHub
parent 5e99b56d6b
commit da8d72c953
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 3741 additions and 3709 deletions

View File

@ -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 = """\

View File

@ -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é

View File

@ -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 = [

View File

@ -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):

View File

@ -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

View File

@ -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.

View File

@ -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)
{

2197
Python/importlib.h generated

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff