summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael W. Hudson <mwh@python.net>2003-04-29 17:07:36 (GMT)
committerMichael W. Hudson <mwh@python.net>2003-04-29 17:07:36 (GMT)
commit26848a34d100f5ff9c3f2710d321d68f73204005 (patch)
treee7c2a4244b20e061ed6f871c14c5fafa8648693b
parent58ee2af48ecc353bd56fab588c85248a2f1bc373 (diff)
downloadcpython-26848a34d100f5ff9c3f2710d321d68f73204005.zip
cpython-26848a34d100f5ff9c3f2710d321d68f73204005.tar.gz
cpython-26848a34d100f5ff9c3f2710d321d68f73204005.tar.bz2
Use Tim's suggestion to fix
[ 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...
-rw-r--r--Lib/test/test_dis.py65
-rw-r--r--Python/compile.c2
2 files changed, 52 insertions, 15 deletions
diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py
index ab93d4a..d88ea45 100644
--- a/Lib/test/test_dis.py
+++ b/Lib/test/test_dis.py
@@ -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)
diff --git a/Python/compile.c b/Python/compile.c
index 57f0edb..a3f48fc 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -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);