]> granicus.if.org Git - python/commitdiff
Bug #1512814, Fix incorrect lineno's when code at module scope
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 10 Jul 2006 00:04:44 +0000 (00:04 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 10 Jul 2006 00:04:44 +0000 (00:04 +0000)
started after line 256.

Lib/test/test_compile.py
Misc/NEWS
Python/compile.c

index 688a02dd56c23f06172427a4d716e8ed3a2901f7..a3f15bf6510c0fef69677987330ad76399a057fc 100644 (file)
@@ -166,6 +166,16 @@ if 1:
         pass"""
         compile(s, "<string>", "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"]:
index ff336c62aca9dc3437ef9b71a09b33960246030e..33ca2b6db35baeab150a9c84fcb9c5499ddb9201 100644 (file)
--- 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
 -------
 
index 3ddb0677d0b3509e55cd17a608ad128e79400de4..a96a503723fa2d35e9d9356bf2e53d8a59ebe0a6 100644 (file)
@@ -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);