blob: d8d53cd3b2ff03fe061953a730f6958fb8ce9457 [file] [log] [blame]
Skip Montanaroadd0ccc2003-02-27 21:27:07 +00001from test.test_support import verify, verbose, TestFailed, run_unittest
2import sys
3import dis
4import StringIO
5
6# Minimal tests for dis module
7
8import unittest
9
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000010def _f(a):
Tim Peterseabafeb2003-03-07 15:55:36 +000011 print a
12 return 1
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000013
14dis_f = """\
Michael W. Hudson26848a32003-04-29 17:07:36 +000015 %-4d 0 LOAD_FAST 0 (a)
Tim Peterseabafeb2003-03-07 15:55:36 +000016 3 PRINT_ITEM
17 4 PRINT_NEWLINE
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000018
Michael W. Hudson26848a32003-04-29 17:07:36 +000019 %-4d 5 LOAD_CONST 1 (1)
Tim Peterseabafeb2003-03-07 15:55:36 +000020 8 RETURN_VALUE
Michael W. Hudson26848a32003-04-29 17:07:36 +000021"""%(_f.func_code.co_firstlineno + 1,
22 _f.func_code.co_firstlineno + 2)
23
24
25def bug708901():
26 for res in range(1,
27 10):
28 pass
29
30dis_bug708901 = """\
31 %-4d 0 SETUP_LOOP 23 (to 26)
32 3 LOAD_GLOBAL 0 (range)
33 6 LOAD_CONST 1 (1)
34
35 %-4d 9 LOAD_CONST 2 (10)
36 12 CALL_FUNCTION 2
37 15 GET_ITER
38 >> 16 FOR_ITER 6 (to 25)
39 19 STORE_FAST 0 (res)
40
41 %-4d 22 JUMP_ABSOLUTE 16
42 >> 25 POP_BLOCK
43 >> 26 LOAD_CONST 0 (None)
44 29 RETURN_VALUE
45"""%(bug708901.func_code.co_firstlineno + 1,
46 bug708901.func_code.co_firstlineno + 2,
47 bug708901.func_code.co_firstlineno + 3)
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000048
Neal Norwitz51abbc72005-12-18 07:06:23 +000049
50def bug1333982(x=[]):
51 assert 0, ([s for s in x] +
52 1)
53 pass
54
55dis_bug1333982 = """\
56 %-4d 0 LOAD_CONST 1 (0)
57 3 JUMP_IF_TRUE 47 (to 53)
58 6 POP_TOP
59 7 LOAD_GLOBAL 0 (AssertionError)
60 10 BUILD_LIST 0
61 13 DUP_TOP
62 14 LOAD_ATTR 1 (append)
63 17 STORE_FAST 1 (_[1])
64 20 LOAD_FAST 0 (x)
65 23 GET_ITER
66 >> 24 FOR_ITER 16 (to 43)
67 27 STORE_FAST 2 (s)
68 30 LOAD_FAST 1 (_[1])
69 33 LOAD_FAST 2 (s)
70 36 CALL_FUNCTION 1
71 39 POP_TOP
72 40 JUMP_ABSOLUTE 24
73 >> 43 DELETE_FAST 1 (_[1])
74
75 %-4d 46 LOAD_CONST 2 (1)
76 49 BINARY_ADD
77 50 RAISE_VARARGS 2
78 >> 53 POP_TOP
79
80 %-4d 54 LOAD_CONST 0 (None)
81 57 RETURN_VALUE
82"""%(bug1333982.func_code.co_firstlineno + 1,
83 bug1333982.func_code.co_firstlineno + 2,
84 bug1333982.func_code.co_firstlineno + 3)
85
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000086class DisTests(unittest.TestCase):
Michael W. Hudson26848a32003-04-29 17:07:36 +000087 def do_disassembly_test(self, func, expected):
88 s = StringIO.StringIO()
89 save_stdout = sys.stdout
90 sys.stdout = s
91 dis.dis(func)
92 sys.stdout = save_stdout
93 got = s.getvalue()
94 # Trim trailing blanks (if any).
95 lines = got.split('\n')
96 lines = [line.rstrip() for line in lines]
97 expected = expected.split("\n")
98 import difflib
99 if expected != lines:
100 self.fail(
101 "events did not match expectation:\n" +
102 "\n".join(difflib.ndiff(expected,
103 lines)))
104
Skip Montanaroadd0ccc2003-02-27 21:27:07 +0000105 def test_opmap(self):
106 self.assertEqual(dis.opmap["STOP_CODE"], 0)
107 self.assertEqual(dis.opmap["LOAD_CONST"] in dis.hasconst, True)
108 self.assertEqual(dis.opmap["STORE_NAME"] in dis.hasname, True)
109
110 def test_opname(self):
111 self.assertEqual(dis.opname[dis.opmap["LOAD_FAST"]], "LOAD_FAST")
112
113 def test_boundaries(self):
114 self.assertEqual(dis.opmap["EXTENDED_ARG"], dis.EXTENDED_ARG)
115 self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT)
116
117 def test_dis(self):
Michael W. Hudson26848a32003-04-29 17:07:36 +0000118 self.do_disassembly_test(_f, dis_f)
119
120 def test_bug_708901(self):
121 self.do_disassembly_test(bug708901, dis_bug708901)
Skip Montanaroadd0ccc2003-02-27 21:27:07 +0000122
Neal Norwitz51abbc72005-12-18 07:06:23 +0000123 def test_bug_1333982(self):
Tim Peters83a8c392005-12-25 22:52:32 +0000124 # This one is checking bytecodes generated for an `assert` statement,
125 # so fails if the tests are run with -O. Skip this test then.
126 if __debug__:
127 self.do_disassembly_test(bug1333982, dis_bug1333982)
Neal Norwitz51abbc72005-12-18 07:06:23 +0000128
Skip Montanaroadd0ccc2003-02-27 21:27:07 +0000129def test_main():
130 run_unittest(DisTests)
131
132
133if __name__ == "__main__":
134 test_main()