]> granicus.if.org Git - python/commitdiff
Use Tim's suggestion to fix
authorMichael W. Hudson <mwh@python.net>
Tue, 29 Apr 2003 17:07:36 +0000 (17:07 +0000)
committerMichael W. Hudson <mwh@python.net>
Tue, 29 Apr 2003 17:07:36 +0000 (17:07 +0000)
[ 708901 ] Lineno calculation sometimes broken

A one line patch to compile.c and a rather-more-than-one-line patch
to test_dis.  Hey ho.

Possibly a backport candidate -- tho' lnotab is less used in 2.2...

Lib/test/test_dis.py
Python/compile.c

index ab93d4a0ec37ae8c6150041a31cf30fd3fdf51e6..d88ea4556bf6af8f832b25d148767639a45f2811 100644 (file)
@@ -14,17 +14,61 @@ def _f(a):
     return 1
 
 dis_f = """\
13           0 LOAD_FAST                0 (a)
%-4d         0 LOAD_FAST                0 (a)
               3 PRINT_ITEM
               4 PRINT_NEWLINE
 
14           5 LOAD_CONST               1 (1)
%-4d         5 LOAD_CONST               1 (1)
               8 RETURN_VALUE
               9 LOAD_CONST               0 (None)
              12 RETURN_VALUE
-"""
+"""%(_f.func_code.co_firstlineno + 1,
+     _f.func_code.co_firstlineno + 2)
+
+
+def bug708901():
+    for res in range(1,
+                     10):
+        pass
+
+dis_bug708901 = """\
+ %-4d         0 SETUP_LOOP              23 (to 26)
+              3 LOAD_GLOBAL              0 (range)
+              6 LOAD_CONST               1 (1)
+
+ %-4d         9 LOAD_CONST               2 (10)
+             12 CALL_FUNCTION            2
+             15 GET_ITER
+        >>   16 FOR_ITER                 6 (to 25)
+             19 STORE_FAST               0 (res)
+
+ %-4d        22 JUMP_ABSOLUTE           16
+        >>   25 POP_BLOCK
+        >>   26 LOAD_CONST               0 (None)
+             29 RETURN_VALUE
+"""%(bug708901.func_code.co_firstlineno + 1,
+     bug708901.func_code.co_firstlineno + 2,
+     bug708901.func_code.co_firstlineno + 3)
 
 class DisTests(unittest.TestCase):
+    def do_disassembly_test(self, func, expected):
+        s = StringIO.StringIO()
+        save_stdout = sys.stdout
+        sys.stdout = s
+        dis.dis(func)
+        sys.stdout = save_stdout
+        got = s.getvalue()
+        # Trim trailing blanks (if any).
+        lines = got.split('\n')
+        lines = [line.rstrip() for line in lines]
+        expected = expected.split("\n")
+        import difflib
+        if expected != lines:
+            self.fail(
+                "events did not match expectation:\n" +
+                "\n".join(difflib.ndiff(expected,
+                                        lines)))
+
     def test_opmap(self):
         self.assertEqual(dis.opmap["STOP_CODE"], 0)
         self.assertEqual(dis.opmap["LOAD_CONST"] in dis.hasconst, True)
@@ -38,17 +82,10 @@ class DisTests(unittest.TestCase):
         self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT)
 
     def test_dis(self):
-        s = StringIO.StringIO()
-        save_stdout = sys.stdout
-        sys.stdout = s
-        dis.dis(_f)
-        sys.stdout = save_stdout
-        got = s.getvalue()
-        # Trim trailing blanks (if any).
-        lines = got.split('\n')
-        lines = [line.rstrip() for line in lines]
-        got = '\n'.join(lines)
-        self.assertEqual(dis_f, got)
+        self.do_disassembly_test(_f, dis_f)
+
+    def test_bug_708901(self):
+        self.do_disassembly_test(bug708901, dis_bug708901)
 
 def test_main():
     run_unittest(DisTests)
index 57f0edb8f9c0edeabcc2a3119647668e4054c8ca..a3f48fca32799ccd2a3b369d98c82e1ad3edfa12 100644 (file)
@@ -3366,7 +3366,7 @@ com_for_stmt(struct compiling *c, node *n)
        com_node(c, CHILD(n, 3));
        com_addbyte(c, GET_ITER);
        c->c_begin = c->c_nexti;
-       com_set_lineno(c, n->n_lineno);
+       com_set_lineno(c, c->c_last_line);
        com_addfwref(c, FOR_ITER, &anchor);
        com_push(c, 1);
        com_assign(c, CHILD(n, 1), OP_ASSIGN, NULL);