4
from pypy.interpreter.pyparser import pythonparse
5
from pypy.interpreter.pyparser.astbuilder import AstBuilder
6
from pypy.interpreter.pyparser.tuplebuilder import TupleBuilder
7
from pypy.interpreter.pycode import PyCode
10
def setup_module(mod):
12
mod.std_space = pypy.conftest.gettestobjspace('std')
14
from pypy.interpreter.astcompiler import ast, misc, pycodegen
16
from test_astbuilder import SNIPPETS, LIBSTUFF, FakeSpace, source2ast
17
from expressions import PY23_TESTS, EXEC_INPUTS, SINGLE_INPUTS, OPTIONAL_TESTS
19
TESTS = PY23_TESTS + EXEC_INPUTS
22
if sys.version_info[0]==2 and sys.version_info[1]>=4:
23
# genexps and new style import don't work on python2.3
24
# TESTS.append(genexps) XXX: 2.4 optimizes bytecode so our comparison doesn't work
25
TESTS += OPTIONAL_TESTS
28
def compile_with_astcompiler(expr, mode='exec', space=FakeSpace()):
29
ast = source2ast(expr, mode, space) # xxx exec: single not really tested, mumble
30
misc.set_filename('<?>', ast)
32
Generator = pycodegen.ModuleCodeGenerator
33
elif mode == 'single':
34
Generator = pycodegen.InteractiveCodeGenerator
36
Generator = pycodegen.ExpressionCodeGenerator
37
codegen = Generator(space, ast)
38
rcode = codegen.getCode()
41
# Create parser from Grammar_stable, not current grammar.
42
stable_parser = pythonparse.make_pyparser('stable')
44
def compile_with_testcompiler(expr, mode='exec', space=FakeSpace()):
45
mode2 = 'exec' # xxx exec: single not really tested
46
builder = TupleBuilder(stable_parser)
47
stable_parser.parse_source(expr, mode2, builder)
48
tuples = builder.stack[-1].as_tuple(True)
49
from pypy.interpreter.stablecompiler import transformer, pycodegen, misc
50
ast = transformer.Transformer('<?>').compile_node(tuples)
51
misc.set_filename('<?>', ast)
53
Generator = pycodegen.ModuleCodeGenerator
54
elif mode == 'single':
55
Generator = pycodegen.InteractiveCodeGenerator
57
Generator = pycodegen.ExpressionCodeGenerator
58
codegen = Generator(ast)
59
rcode = codegen.getCode()
63
def compare_code(ac_code, sc_code, space=FakeSpace()):
64
#print "Filename", ac_code.co_filename, sc_code.co_filename
65
ac_code = to_code(ac_code, space)
66
assert ac_code.co_filename == sc_code.co_filename
67
#print repr(ac_code.co_code)
68
#print repr(sc_code.co_code)
69
if ac_code.co_code != sc_code.co_code:
71
print "Code from pypy:"
73
print "Code from python", sys.version
75
assert ac_code.co_code == sc_code.co_code
76
assert ac_code.co_varnames == sc_code.co_varnames
77
assert ac_code.co_flags == sc_code.co_flags
79
assert len(ac_code.co_consts) == len(sc_code.co_consts)
80
for c1, c2 in zip( ac_code.co_consts, sc_code.co_consts ):
81
if isinstance(c1, PyCode):
82
return compare_code( c1, c2, space )
86
def to_code( rcode, space ):
89
for w in rcode.co_consts_w:
93
consts.append(space.unwrap(w))
94
code = new.code( rcode.co_argcount,
100
tuple(rcode.co_names),
101
tuple(rcode.co_varnames),
104
rcode.co_firstlineno,
106
tuple(rcode.co_freevars),
107
tuple(rcode.co_cellvars) )
110
def check_compile(expr, mode='exec', quiet=False, space=None):
112
print "Compiling:", expr
117
ac_code = compile_with_astcompiler(expr, mode=mode, space=space)
118
if expr == "k[v,]" or expr.startswith('"'): # module-level docstring
119
py.test.skip('comparison skipped, bug in "reference stable compiler"')
120
sc_code = compile_with_testcompiler(expr, mode=mode)
121
compare_code(ac_code, sc_code, space=space)
124
def test_compile_argtuple_1():
125
code = """def f( x, (y,z) ):
128
check_compile( code )
130
def test_compile_argtuple_2():
131
code = """def f( x, (y,(z,t)) ):
134
check_compile( code )
137
def test_compile_argtuple_3():
138
code = """def f( x, (y,(z,(t,u))) ):
141
check_compile( code )
144
def test_basic_astgen():
147
yield check_compile, expr
150
for snippet_name in SNIPPETS:
151
filepath = os.path.join(os.path.dirname(__file__), 'samples', snippet_name)
152
source = file(filepath).read()
153
yield check_compile, source, 'exec'
155
STDLIB_PATH = os.path.dirname(os.__file__)
156
def test_on_stdlib():
157
py.test.skip('too ambitious for now (and time consuming)')
158
for basename in os.listdir(STDLIB_PATH):
159
if not basename.endswith('.py'):
161
filepath = os.path.join(STDLIB_PATH, basename)
162
# size = os.stat(filepath)[6]
165
source = file(filepath).read()
166
yield check_compile, source, 'exec'
169
for snippet_name in LIBSTUFF:
170
filepath = os.path.join(os.path.dirname(__file__), '../../../lib', snippet_name)
171
source = file(filepath).read()
172
yield check_compile, source, 'exec'
175
def test_single_inputs():
176
for family in SINGLE_INPUTS:
178
yield check_compile, expr, 'single'