1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh# Minimal tests for dis module
2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import run_unittest
4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest
5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys
6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport dis
7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport StringIO
8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef _f(a):
11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    print a
12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    return 1
13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdis_f = """\
15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d         0 LOAD_FAST                0 (a)
16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              3 PRINT_ITEM
17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              4 PRINT_NEWLINE
18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d         5 LOAD_CONST               1 (1)
20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              8 RETURN_VALUE
21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""%(_f.func_code.co_firstlineno + 1,
22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh     _f.func_code.co_firstlineno + 2)
23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef bug708901():
26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    for res in range(1,
27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                     10):
28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        pass
29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdis_bug708901 = """\
31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d         0 SETUP_LOOP              23 (to 26)
32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              3 LOAD_GLOBAL              0 (range)
33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              6 LOAD_CONST               1 (1)
34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d         9 LOAD_CONST               2 (10)
36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             12 CALL_FUNCTION            2
37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             15 GET_ITER
38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        >>   16 FOR_ITER                 6 (to 25)
39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             19 STORE_FAST               0 (res)
40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d        22 JUMP_ABSOLUTE           16
42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        >>   25 POP_BLOCK
43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        >>   26 LOAD_CONST               0 (None)
44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             29 RETURN_VALUE
45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""%(bug708901.func_code.co_firstlineno + 1,
46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh     bug708901.func_code.co_firstlineno + 2,
47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh     bug708901.func_code.co_firstlineno + 3)
48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef bug1333982(x=[]):
51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    assert 0, ([s for s in x] +
52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              1)
53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    pass
54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdis_bug1333982 = """\
56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d         0 LOAD_CONST               1 (0)
57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              3 POP_JUMP_IF_TRUE        41
58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              6 LOAD_GLOBAL              0 (AssertionError)
59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              9 BUILD_LIST               0
60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             12 LOAD_FAST                0 (x)
61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             15 GET_ITER
62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        >>   16 FOR_ITER                12 (to 31)
63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             19 STORE_FAST               1 (s)
64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             22 LOAD_FAST                1 (s)
65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             25 LIST_APPEND              2
66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             28 JUMP_ABSOLUTE           16
67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d   >>   31 LOAD_CONST               2 (1)
69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             34 BINARY_ADD
70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             35 CALL_FUNCTION            1
71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             38 RAISE_VARARGS            1
72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh %-4d   >>   41 LOAD_CONST               0 (None)
74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh             44 RETURN_VALUE
75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""%(bug1333982.func_code.co_firstlineno + 1,
76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh     bug1333982.func_code.co_firstlineno + 2,
77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh     bug1333982.func_code.co_firstlineno + 3)
78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh_BIG_LINENO_FORMAT = """\
80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh%3d           0 LOAD_GLOBAL              0 (spam)
81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              3 POP_TOP
82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              4 LOAD_CONST               0 (None)
83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh              7 RETURN_VALUE
84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh"""
85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass DisTests(unittest.TestCase):
87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def do_disassembly_test(self, func, expected):
88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        s = StringIO.StringIO()
89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        save_stdout = sys.stdout
90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        sys.stdout = s
91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        dis.dis(func)
92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        sys.stdout = save_stdout
93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        got = s.getvalue()
94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Trim trailing blanks (if any).
95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        lines = got.split('\n')
96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        lines = [line.rstrip() for line in lines]
97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        expected = expected.split("\n")
98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        import difflib
99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if expected != lines:
100ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.fail(
101ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                "events did not match expectation:\n" +
102ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                "\n".join(difflib.ndiff(expected,
103ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh                                        lines)))
104ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
105ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_opmap(self):
106ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dis.opmap["STOP_CODE"], 0)
107ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIn(dis.opmap["LOAD_CONST"], dis.hasconst)
108ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertIn(dis.opmap["STORE_NAME"], dis.hasname)
109ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
110ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_opname(self):
111ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dis.opname[dis.opmap["LOAD_FAST"]], "LOAD_FAST")
112ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
113ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_boundaries(self):
114ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dis.opmap["EXTENDED_ARG"], dis.EXTENDED_ARG)
115ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT)
116ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
117ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_dis(self):
118ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_disassembly_test(_f, dis_f)
119ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
120ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_bug_708901(self):
121ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        self.do_disassembly_test(bug708901, dis_bug708901)
122ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
123ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_bug_1333982(self):
124ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # This one is checking bytecodes generated for an `assert` statement,
125ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # so fails if the tests are run with -O.  Skip this test then.
126ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        if __debug__:
127ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.do_disassembly_test(bug1333982, dis_bug1333982)
128ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
129ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    def test_big_linenos(self):
130ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        def func(count):
131ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            namespace = {}
132ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            func = "def foo():\n " + "".join(["\n "] * count + ["spam\n"])
133ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            exec func in namespace
134ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            return namespace['foo']
135ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
136ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test all small ranges
137ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in xrange(1, 300):
138ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = _BIG_LINENO_FORMAT % (i + 2)
139ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.do_disassembly_test(func(i), expected)
140ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
141ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        # Test some larger ranges too
142ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh        for i in xrange(300, 5000, 10):
143ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            expected = _BIG_LINENO_FORMAT % (i + 2)
144ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh            self.do_disassembly_test(func(i), expected)
145ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
146ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main():
147ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    run_unittest(DisTests)
148ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
149ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh
150ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == "__main__":
151ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh    test_main()
152