1
2 import ast
3 import types
4
5 from test.support.bytecode_helper import AssemblerTestCase
6
7
8 # Tests for the code-object creation stage of the compiler.
9
10 class ESC[4;38;5;81mIsolatedAssembleTests(ESC[4;38;5;149mAssemblerTestCase):
11
12 def complete_metadata(self, metadata, filename="myfile.py"):
13 if metadata is None:
14 metadata = {}
15 for key in ['name', 'qualname']:
16 metadata.setdefault(key, key)
17 for key in ['consts']:
18 metadata.setdefault(key, [])
19 for key in ['names', 'varnames', 'cellvars', 'freevars', 'fasthidden']:
20 metadata.setdefault(key, {})
21 for key in ['argcount', 'posonlyargcount', 'kwonlyargcount']:
22 metadata.setdefault(key, 0)
23 metadata.setdefault('firstlineno', 1)
24 metadata.setdefault('filename', filename)
25 return metadata
26
27 def assemble_test(self, insts, metadata, expected):
28 metadata = self.complete_metadata(metadata)
29 insts = self.complete_insts_info(insts)
30
31 co = self.get_code_object(metadata['filename'], insts, metadata)
32 self.assertIsInstance(co, types.CodeType)
33
34 expected_metadata = {}
35 for key, value in metadata.items():
36 if key == "fasthidden":
37 # not exposed on code object
38 continue
39 if isinstance(value, list):
40 expected_metadata[key] = tuple(value)
41 elif isinstance(value, dict):
42 expected_metadata[key] = tuple(value.keys())
43 else:
44 expected_metadata[key] = value
45
46 for key, value in expected_metadata.items():
47 self.assertEqual(getattr(co, "co_" + key), value)
48
49 f = types.FunctionType(co, {})
50 for args, res in expected.items():
51 self.assertEqual(f(*args), res)
52
53 def test_simple_expr(self):
54 metadata = {
55 'filename' : 'avg.py',
56 'name' : 'avg',
57 'qualname' : 'stats.avg',
58 'consts' : {2 : 0},
59 'argcount' : 2,
60 'varnames' : {'x' : 0, 'y' : 1},
61 }
62
63 # code for "return (x+y)/2"
64 insts = [
65 ('RESUME', 0),
66 ('LOAD_FAST', 0, 1), # 'x'
67 ('LOAD_FAST', 1, 1), # 'y'
68 ('BINARY_OP', 0, 1), # '+'
69 ('LOAD_CONST', 0, 1), # 2
70 ('BINARY_OP', 11, 1), # '/'
71 ('RETURN_VALUE', 1),
72 ]
73 expected = {(3, 4) : 3.5, (-100, 200) : 50, (10, 18) : 14}
74 self.assemble_test(insts, metadata, expected)