◐ Shell
clean mode source ↗

gh-104240: return code unit metadata from codegen by iritkatriel · Pull Request #104300 · python/cpython

from _testinternalcapi import compiler_codegen, optimize_cfg, assemble_code_object
import ast
import opcode
import textwrap
import types

a = ast.parse("(x+y)/2", mode='eval')
filename = "myfile.py"
eval_mode = 1  # 0=exec, 1=eval, 2=single

insts, metadata = compiler_codegen(a, filename, 0, eval_mode)

consts = [v[1] for v in sorted([(v, k) for k, v in metadata['consts'].items()])]
insts = optimize_cfg(insts, consts)

from test.test_compiler_assemble import IsolatedAssembleTests
IsolatedAssembleTests().complete_metadata(metadata)

co = assemble_code_object(filename, insts, metadata)

for x,y in [(3, 4), (-100, 200), (10, 18)]:
    f = types.FunctionType(co, {'x': x, 'y': y})
    print(f'avg of {x} and {y} is {f()}')