diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py index 688a02dd56c..a3f15bf6510 100644 --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -166,6 +166,16 @@ if 1: pass""" compile(s, "", "exec") + # This test is probably specific to CPython and may not generalize + # to other implementations. We are trying to ensure that when + # the first line of code starts after 256, correct line numbers + # in tracebacks are still produced. + def test_leading_newlines(self): + s256 = "".join(["\n"] * 256 + ["spam"]) + co = compile(s256, 'fn', 'exec') + self.assertEqual(co.co_firstlineno, 257) + self.assertEqual(co.co_lnotab, '') + def test_literals_with_leading_zeroes(self): for arg in ["077787", "0xj", "0x.", "0e", "090000000000000", "080000000000000", "000000000000009", "000000000000008"]: diff --git a/Misc/NEWS b/Misc/NEWS index ff336c62aca..33ca2b6db35 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -33,6 +33,9 @@ Core and builtins - On 64 bit systems, int literals that use less than 64 bits are now ints rather than longs. +- Bug #1512814, Fix incorrect lineno's when code at module scope + started after line 256. + Library ------- diff --git a/Python/compile.c b/Python/compile.c index 3ddb0677d0b..a96a503723f 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1776,7 +1776,8 @@ compiler_mod(struct compiler *c, mod_ty mod) if (!module) return NULL; } - if (!compiler_enter_scope(c, module, mod, 1)) + /* Use 0 for firstlineno initially, will fixup in assemble(). */ + if (!compiler_enter_scope(c, module, mod, 0)) return NULL; switch (mod->kind) { case Module_kind: @@ -4446,6 +4447,13 @@ assemble(struct compiler *c, int addNone) entryblock = b; } + /* Set firstlineno if it wasn't explicitly set. */ + if (!c->u->u_firstlineno) { + if (entryblock && entryblock->b_instr) + c->u->u_firstlineno = entryblock->b_instr->i_lineno; + else + c->u->u_firstlineno = 1; + } if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) goto error; dfs(c, entryblock, &a);