Review issue 4715 from the public Python tracker - Code Review (original) (raw)
OLD
NEW
1 import dis
1 import dis
2 import sys
2 import sys
3 from cStringIO import StringIO
3 from cStringIO import StringIO
4 import unittest
4 import unittest
5
5
6 def disassemble(func):
6 def disassemble(func):
7 f = StringIO()
7 f = StringIO()
8 tmp = sys.stdout
8 tmp = sys.stdout
9 sys.stdout = f
9 sys.stdout = f
10 dis.dis(func)
10 dis.dis(func)
11 sys.stdout = tmp
11 sys.stdout = tmp
12 result = f.getvalue()
12 result = f.getvalue()
13 f.close()
13 f.close()
14 return result
14 return result
15
15
16 def dis_single(line):
16 def dis_single(line):
17 return disassemble(compile(line, '', 'single'))
17 return disassemble(compile(line, '', 'single'))
18
18
19 class TestTranforms(unittest.TestCase):
19 class TestTranforms(unittest.TestCase):
20
20
21 def test_unot(self):
21 def test_unot(self):
22 # UNARY_NOT JUMP_IF_FALSE POP_TOP --> JUMP_IF_TRUE POP_TOP'
22 # UNARY_NOT POP_JUMP_IF_FALSE --> POP_JUMP_IF_TRUE'
23 def unot(x):
23 def unot(x):
24 if not x == 2:
24 if not x == 2:
25 del x
25 del x
26 asm = disassemble(unot)
26 asm = disassemble(unot)
27 for elem in ('UNARY_NOT', 'JUMP_IF_FALSE'):
27 for elem in ('UNARY_NOT', 'POP_JUMP_IF_FALSE'):
28 self.assert_(elem not in asm)
28 self.assert_(elem not in asm)
29 for elem in ('JUMP_IF_TRUE', 'POP_TOP'):
29 for elem in ('POP_JUMP_IF_TRUE',):
30 self.assert_(elem in asm)
30 self.assert_(elem in asm)
31
31
32 def test_elim_inversion_of_is_or_in(self):
32 def test_elim_inversion_of_is_or_in(self):
33 for line, elem in (
33 for line, elem in (
34 ('not a is b', '(is not)',),
34 ('not a is b', '(is not)',),
35 ('not a in b', '(not in)',),
35 ('not a in b', '(not in)',),
36 ('not a is not b', '(is)',),
36 ('not a is not b', '(is)',),
37 ('not a not in b', '(in)',),
37 ('not a not in b', '(in)',),
38 ):
38 ):
39 asm = dis_single(line)
39 asm = dis_single(line)
40 self.assert_(elem in asm)
40 self.assert_(elem in asm)
41
41
42 def test_none_as_constant(self):
42 def test_none_as_constant(self):
43 # LOAD_GLOBAL None --> LOAD_CONST None
43 # LOAD_GLOBAL None --> LOAD_CONST None
44 def f(x):
44 def f(x):
45 None
45 None
46 return x
46 return x
47 asm = disassemble(f)
47 asm = disassemble(f)
48 for elem in ('LOAD_GLOBAL',):
48 for elem in ('LOAD_GLOBAL',):
49 self.assert_(elem not in asm)
49 self.assert_(elem not in asm)
50 for elem in ('LOAD_CONST', '(None)'):
50 for elem in ('LOAD_CONST', '(None)'):
51 self.assert_(elem in asm)
51 self.assert_(elem in asm)
52 def f():
52 def f():
53 'Adding a docstring made this test fail in Py2.5.0'
53 'Adding a docstring made this test fail in Py2.5.0'
54 return None
54 return None
55 self.assert_('LOAD_CONST' in disassemble(f))
55 self.assert_('LOAD_CONST' in disassemble(f))
56 self.assert_('LOAD_GLOBAL' not in disassemble(f))
56 self.assert_('LOAD_GLOBAL' not in disassemble(f))
57
57
58 def test_while_one(self):
58 def test_while_one(self):
59 # Skip over: LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP
59 # Skip over: LOAD_CONST trueconst POP_JUMP_IF_FALSE xx
60 def f():
60 def f():
61 while 1:
61 while 1:
62 pass
62 pass
63 return list
63 return list
64 asm = disassemble(f)
64 asm = disassemble(f)
65 for elem in ('LOAD_CONST', 'JUMP_IF_FALSE'):
65 for elem in ('LOAD_CONST', 'POP_JUMP_IF_FALSE'):
66 self.assert_(elem not in asm)
66 self.assert_(elem not in asm)
67 for elem in ('JUMP_ABSOLUTE',):
67 for elem in ('JUMP_ABSOLUTE',):
68 self.assert_(elem in asm)
68 self.assert_(elem in asm)
69
69
70 def test_pack_unpack(self):
70 def test_pack_unpack(self):
71 for line, elem in (
71 for line, elem in (
72 ('a, = a,', 'LOAD_CONST',),
72 ('a, = a,', 'LOAD_CONST',),
73 ('a, b = a, b', 'ROT_TWO',),
73 ('a, b = a, b', 'ROT_TWO',),
74 ('a, b, c = a, b, c', 'ROT_THREE',),
74 ('a, b, c = a, b, c', 'ROT_THREE',),
75 ):
75 ):
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
214 import gc
214 import gc
215 counts = [None] * 5
215 counts = [None] * 5
216 for i in xrange(len(counts)):
216 for i in xrange(len(counts)):
217 test_support.run_unittest(*test_classes)
217 test_support.run_unittest(*test_classes)
218 gc.collect()
218 gc.collect()
219 counts[i] = sys.gettotalrefcount()
219 counts[i] = sys.gettotalrefcount()
220 print counts
220 print counts
221
221
222 if __name__ == "__main__":
222 if __name__ == "__main__":
223 test_main(verbose=True)
223 test_main(verbose=True)
OLD
NEW