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