diff -r 336137a359ae Lib/test/disutil.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/test/disutil.py Mon Mar 14 23:22:44 2011 -0400 @@ -0,0 +1,19 @@ +import dis +import sys +from io import StringIO + +def disassemble(func): + f = StringIO() + tmp = sys.stdout + sys.stdout = f + try: + dis.dis(func) + result = f.getvalue() + finally: + sys.stdout = tmp + f.close() + return result + +def dis_single(line): + return disassemble(compile(line, '', 'single')) + diff -r 336137a359ae Lib/test/test_ast.py --- a/Lib/test/test_ast.py Fri Mar 11 10:27:14 2011 -0500 +++ b/Lib/test/test_ast.py Mon Mar 14 23:22:44 2011 -0400 @@ -3,7 +3,7 @@ import ast def to_tuple(t): - if t is None or isinstance(t, (str, int, complex)): + if t is None or isinstance(t, (str, bytes, int, complex)): return t elif isinstance(t, list): return [to_tuple(e) for e in t] @@ -96,10 +96,10 @@ "1 < 2 < 3", # Call "f(1,2,c=3,*d,**e)", - # Num + # Literals "10", - # Str "'string'", + "b'string'", # Attribute "a.b", # Subscript @@ -199,7 +199,7 @@ def test_invalid_sum(self): pos = dict(lineno=2, col_offset=3) - m = ast.Module([ast.Expr(ast.expr(**pos), **pos)]) + m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], "doc") with self.assertRaises(TypeError) as cm: compile(m, "", "exec") self.assertIn("but got <_ast.expr", str(cm.exception)) @@ -216,60 +216,61 @@ node = ast.parse('spam(eggs, "and cheese")') self.assertEqual(ast.dump(node), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), " - "args=[Name(id='eggs', ctx=Load()), Str(s='and cheese')], " - "keywords=[], starargs=None, kwargs=None))])" + "args=[Name(id='eggs', ctx=Load()), Lit(v='and cheese')], " + "keywords=[], starargs=None, kwargs=None))], docstring=None)" ) self.assertEqual(ast.dump(node, annotate_fields=False), "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " - "Str('and cheese')], [], None, None))])" + "Lit('and cheese')], [], None, None))], None)" ) self.assertEqual(ast.dump(node, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " "lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), " - "lineno=1, col_offset=5), Str(s='and cheese', lineno=1, " + "lineno=1, col_offset=5), Lit(v='and cheese', lineno=1, " "col_offset=11)], keywords=[], starargs=None, kwargs=None, " - "lineno=1, col_offset=0), lineno=1, col_offset=0)])" + "lineno=1, col_offset=0), lineno=1, col_offset=0)], " + "docstring=None)" ) def test_copy_location(self): src = ast.parse('1 + 1', mode='eval') - src.body.right = ast.copy_location(ast.Num(2), src.body.right) + src.body.right = ast.copy_location(ast.Lit(2), src.body.right) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Num(n=1, lineno=1, col_offset=0), ' - 'op=Add(), right=Num(n=2, lineno=1, col_offset=4), lineno=1, ' + 'Expression(body=BinOp(left=Lit(v=1, lineno=1, col_offset=0), ' + 'op=Add(), right=Lit(v=2, lineno=1, col_offset=4), lineno=1, ' 'col_offset=0))' ) def test_fix_missing_locations(self): src = ast.parse('write("spam")') src.body.append(ast.Expr(ast.Call(ast.Name('spam', ast.Load()), - [ast.Str('eggs')], [], None, None))) + [ast.Lit('eggs')], [], None, None))) self.assertEqual(src, ast.fix_missing_locations(src)) self.assertEqual(ast.dump(src, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), " - "lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, " + "lineno=1, col_offset=0), args=[Lit(v='spam', lineno=1, " "col_offset=6)], keywords=[], starargs=None, kwargs=None, " "lineno=1, col_offset=0), lineno=1, col_offset=0), " "Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, " - "col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], " + "col_offset=0), args=[Lit(v='eggs', lineno=1, col_offset=0)], " "keywords=[], starargs=None, kwargs=None, lineno=1, " - "col_offset=0), lineno=1, col_offset=0)])" + "col_offset=0), lineno=1, col_offset=0)], docstring=None)" ) def test_increment_lineno(self): src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src, n=3), src) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), ' - 'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, ' + 'Expression(body=BinOp(left=Lit(v=1, lineno=4, col_offset=0), ' + 'op=Add(), right=Lit(v=1, lineno=4, col_offset=4), lineno=4, ' 'col_offset=0))' ) # issue10869: do not increment lineno of root twice src = ast.parse('1 + 1', mode='eval') self.assertEqual(ast.increment_lineno(src.body, n=3), src.body) self.assertEqual(ast.dump(src, include_attributes=True), - 'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), ' - 'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, ' + 'Expression(body=BinOp(left=Lit(v=1, lineno=4, col_offset=0), ' + 'op=Add(), right=Lit(v=1, lineno=4, col_offset=4), lineno=4, ' 'col_offset=0))' ) @@ -285,10 +286,10 @@ self.assertEqual(len(list(ast.iter_child_nodes(node.body))), 4) iterator = ast.iter_child_nodes(node.body) self.assertEqual(next(iterator).id, 'spam') - self.assertEqual(next(iterator).n, 23) - self.assertEqual(next(iterator).n, 42) + self.assertEqual(next(iterator).v, 23) + self.assertEqual(next(iterator).v, 42) self.assertEqual(ast.dump(next(iterator)), - "keyword(arg='eggs', value=Str(s='leek'))" + "keyword(arg='eggs', value=Lit(v='leek'))" ) def test_get_docstring(self): @@ -332,50 +333,51 @@ #### EVERYTHING BELOW IS GENERATED ##### exec_results = [ -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Pass', (1, 9))], [], None)]), -('Module', [('ClassDef', (1, 0), 'C', [], [], None, None, [('Pass', (1, 8))], [])]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Return', (1, 8), ('Num', (1, 15), 1))], [], None)]), -('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]), -('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Num', (1, 4), 1))]), -('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Num', (1, 5), 1))]), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]), -('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]), -('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]), -('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Str', (1, 16), 'string')], [], None, None), None)]), -('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])]), -('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])]), -('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]), -('Module', [('Import', (1, 0), [('alias', 'sys', None)])]), -('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]), -('Module', [('Global', (1, 0), ['v'])]), -('Module', [('Expr', (1, 0), ('Num', (1, 0), 1))]), -('Module', [('Pass', (1, 0))]), -('Module', [('Break', (1, 0))]), -('Module', [('Continue', (1, 0))]), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [])]), -('Module', [('Expr', (1, 0), ('ListComp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [])]))]), -('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [])]))]), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Pass', (1, 9))], [], None, None)], None), +('Module', [('ClassDef', (1, 0), 'C', [], [], None, None, [('Pass', (1, 8))], [], None)], None), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, None, [], None, None, [], []), [('Return', (1, 8), ('Lit', (1, 15), 1))], [], None, None)], None), +('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], None), +('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Lit', (1, 4), 1))], None), +('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Lit', (1, 5), 1))], None), +('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])], None), +('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], None), +('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], None), +('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Lit', (1, 16), 'string')], [], None, None), None)], None), +('Module', [('TryExcept', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [])], None), +('Module', [('TryFinally', (1, 0), [('Pass', (2, 2))], [('Pass', (4, 2))])], None), +('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], None), +('Module', [('Import', (1, 0), [('alias', 'sys', None)])], None), +('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], None), +('Module', [('Global', (1, 0), ['v'])], None), +('Module', [('Expr', (1, 0), ('Lit', (1, 0), 1))], None), +('Module', [('Pass', (1, 0))], None), +('Module', [('Break', (1, 0))], None), +('Module', [('Continue', (1, 0))], None), +('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [])], None), +('Module', [('Expr', (1, 0), ('ListComp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [])]))], None), +('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 1), ('Tuple', (1, 2), [('Name', (1, 2), 'a', ('Load',)), ('Name', (1, 4), 'b', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'a', ('Store',)), ('Name', (1, 13), 'b', ('Store',))], ('Store',)), ('Name', (1, 18), 'c', ('Load',)), [])]))], None), ] single_results = [ -('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Num', (1, 0), 1), ('Add',), ('Num', (1, 2), 2)))]), +('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Lit', (1, 0), 1), ('Add',), ('Lit', (1, 2), 2)))]), ] eval_results = [ ('Expression', ('BoolOp', (1, 0), ('And',), [('Name', (1, 0), 'a', ('Load',)), ('Name', (1, 6), 'b', ('Load',))])), ('Expression', ('BinOp', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Add',), ('Name', (1, 4), 'b', ('Load',)))), ('Expression', ('UnaryOp', (1, 0), ('Not',), ('Name', (1, 4), 'v', ('Load',)))), -('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, [], None, None, [], []), ('Name', (1, 7), 'None', ('Load',)))), -('Expression', ('Dict', (1, 0), [('Num', (1, 2), 1)], [('Num', (1, 4), 2)])), +('Expression', ('Lambda', (1, 0), ('arguments', [], None, None, [], None, None, [], []), ('Lit', (1, 7), None))), +('Expression', ('Dict', (1, 0), [('Lit', (1, 2), 1)], [('Lit', (1, 4), 2)])), ('Expression', ('ListComp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))])])), ('Expression', ('GeneratorExp', (1, 1), ('Name', (1, 1), 'a', ('Load',)), [('comprehension', ('Name', (1, 7), 'b', ('Store',)), ('Name', (1, 12), 'c', ('Load',)), [('Name', (1, 17), 'd', ('Load',))])])), -('Expression', ('Compare', (1, 0), ('Num', (1, 0), 1), [('Lt',), ('Lt',)], [('Num', (1, 4), 2), ('Num', (1, 8), 3)])), -('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Num', (1, 2), 1), ('Num', (1, 4), 2)], [('keyword', 'c', ('Num', (1, 8), 3))], ('Name', (1, 11), 'd', ('Load',)), ('Name', (1, 15), 'e', ('Load',)))), -('Expression', ('Num', (1, 0), 10)), -('Expression', ('Str', (1, 0), 'string')), +('Expression', ('Compare', (1, 0), ('Lit', (1, 0), 1), [('Lt',), ('Lt',)], [('Lit', (1, 4), 2), ('Lit', (1, 8), 3)])), +('Expression', ('Call', (1, 0), ('Name', (1, 0), 'f', ('Load',)), [('Lit', (1, 2), 1), ('Lit', (1, 4), 2)], [('keyword', 'c', ('Lit', (1, 8), 3))], ('Name', (1, 11), 'd', ('Load',)), ('Name', (1, 15), 'e', ('Load',)))), +('Expression', ('Lit', (1, 0), 10)), +('Expression', ('Lit', (1, 0), 'string')), +('Expression', ('Lit', (1, 0), b'string')), ('Expression', ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',))), ('Expression', ('Subscript', (1, 0), ('Name', (1, 0), 'a', ('Load',)), ('Slice', ('Name', (1, 2), 'b', ('Load',)), ('Name', (1, 4), 'c', ('Load',)), None), ('Load',))), ('Expression', ('Name', (1, 0), 'v', ('Load',))), -('Expression', ('List', (1, 0), [('Num', (1, 1), 1), ('Num', (1, 3), 2), ('Num', (1, 5), 3)], ('Load',))), -('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))), -('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [], None, None)), +('Expression', ('List', (1, 0), [('Lit', (1, 1), 1), ('Lit', (1, 3), 2), ('Lit', (1, 5), 3)], ('Load',))), +('Expression', ('Tuple', (1, 0), [('Lit', (1, 0), 1), ('Lit', (1, 2), 2), ('Lit', (1, 4), 3)], ('Load',))), +('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Lit', (1, 12), 1), ('Lit', (1, 14), 2), None), ('Load',))], [], None, None)), ] main() diff -r 336137a359ae Lib/test/test_compile.py --- a/Lib/test/test_compile.py Fri Mar 11 10:27:14 2011 -0500 +++ b/Lib/test/test_compile.py Mon Mar 14 23:22:44 2011 -0400 @@ -2,6 +2,7 @@ import sys import _ast from test import support +from test.disutil import disassemble class TestSpecifics(unittest.TestCase): @@ -433,6 +434,16 @@ ast.body = [_ast.BoolOp()] self.assertRaises(TypeError, compile, ast, '', 'exec') + def test_if_no_else(self): + def f1(x): + if x: + x = 1 + return x + + asm = disassemble(f1) + for elem in ('JUMP_FORWARD', 'JUMP_ABSOLUTE'): + self.assertNotIn(elem, asm) + def test_main(): support.run_unittest(TestSpecifics) diff -r 336137a359ae Lib/test/test_dis.py --- a/Lib/test/test_dis.py Fri Mar 11 10:27:14 2011 -0500 +++ b/Lib/test/test_dis.py Mon Mar 14 23:22:44 2011 -0400 @@ -4,7 +4,7 @@ import unittest import sys import dis -import io +from test.disutil import disassemble def _f(a): @@ -139,12 +139,7 @@ class DisTests(unittest.TestCase): def do_disassembly_test(self, func, expected): - s = io.StringIO() - save_stdout = sys.stdout - sys.stdout = s - dis.dis(func) - sys.stdout = save_stdout - got = s.getvalue() + got = disassemble(func) # Trim trailing blanks (if any). lines = got.split('\n') lines = [line.rstrip() for line in lines] diff -r 336137a359ae Lib/test/test_peepholer.py --- a/Lib/test/test_peepholer.py Fri Mar 11 10:27:14 2011 -0500 +++ b/Lib/test/test_peepholer.py Mon Mar 14 23:22:44 2011 -0400 @@ -1,29 +1,15 @@ -import dis +from test.disutil import disassemble, dis_single import re import sys -from io import StringIO import unittest from math import copysign -def disassemble(func): - f = StringIO() - tmp = sys.stdout - sys.stdout = f - dis.dis(func) - sys.stdout = tmp - result = f.getvalue() - f.close() - return result - -def dis_single(line): - return disassemble(compile(line, '', 'single')) - class TestTranforms(unittest.TestCase): def test_unot(self): # UNARY_NOT POP_JUMP_IF_FALSE --> POP_JUMP_IF_TRUE' def unot(x): - if not x == 2: + if not x: del x asm = disassemble(unot) for elem in ('UNARY_NOT', 'POP_JUMP_IF_FALSE'): @@ -53,12 +39,10 @@ def h(x): False return x - for func, name in ((f, 'None'), (g, 'True'), (h, 'False')): + for func in (f, g, h): asm = disassemble(func) for elem in ('LOAD_GLOBAL',): self.assertNotIn(elem, asm) - for elem in ('LOAD_CONST', '('+name+')'): - self.assertIn(elem, asm) def f(): 'Adding a docstring made this test fail in Py2.5.0' return None @@ -82,11 +66,26 @@ ('a, = a,', 'LOAD_CONST',), ('a, b = a, b', 'ROT_TWO',), ('a, b, c = a, b, c', 'ROT_THREE',), + ('[a] = [a]', 'LOAD_CONST',), + ('[a, b] = [a, b]', 'ROT_TWO',), + ('[a, b, c] = [a, b, c]', 'ROT_THREE',), ): asm = dis_single(line) self.assertIn(elem, asm) self.assertNotIn('BUILD_TUPLE', asm) - self.assertNotIn('UNPACK_TUPLE', asm) + self.assertNotIn('BUILD_LIST', asm) + self.assertNotIn('UNPACK_SEQUENCE', asm) + + # Optimizing sets this way changes semantics -- sets + # remove duplicate items. So don't do it. + for line in ( + 'a, = {a}', + 'a, b = {a, b}', + 'a, b, c = {a, b, c}', + ): + asm = dis_single(line) + self.assertIn('BUILD_SET', asm) + self.assertIn('UNPACK_SEQUENCE', asm) def test_folding_of_tuples_of_constants(self): for line, elem in ( diff -r 336137a359ae Lib/test/test_sys_settrace.py --- a/Lib/test/test_sys_settrace.py Fri Mar 11 10:27:14 2011 -0500 +++ b/Lib/test/test_sys_settrace.py Mon Mar 14 23:22:44 2011 -0400 @@ -337,9 +337,9 @@ tracer.events, generator_example.events) def test_14_onliner_if(self): - def onliners(): - if True: False - else: True + def onliners(x=1): + if True: x + else: x return 0 self.run_and_compare( onliners,