def test_replace_graph_with_bootstrap(self): def func(n, x, y, z): yield n yield n # space = FlowObjSpace() graph = space.build_flow(func, tweak_for_generator=False) assert graph.startblock.operations[0].opname == 'generator_mark' GeneratorIterator = make_generatoriterator_class(graph) replace_graph_with_bootstrap(GeneratorIterator, graph) if option.view: graph.show() block = graph.startblock ops = block.operations assert ops[0].opname == 'simple_call' # e = Entry1() assert ops[1].opname == 'setattr' # e.g_n = n assert ops[1].args[1].value == 'g_n' assert ops[2].opname == 'setattr' # e.g_x = x assert ops[2].args[1].value == 'g_x' assert ops[3].opname == 'setattr' # e.g_y = y assert ops[3].args[1].value == 'g_y' assert ops[4].opname == 'setattr' # e.g_z = z assert ops[4].args[1].value == 'g_z' assert ops[5].opname == 'simple_call' # g = GeneratorIterator(e) assert ops[5].args[1] == ops[0].result assert len(ops) == 6 assert len(block.exits) == 1 assert block.exits[0].target is graph.returnblock
def test_tweak_generator_graph(self): def f(n, x, y, z): z *= 10 yield n + 1 z -= 10 # space = FlowObjSpace() graph = space.build_flow(f, tweak_for_generator=False) GeneratorIterator = make_generatoriterator_class(graph) replace_graph_with_bootstrap(GeneratorIterator, graph) func1 = attach_next_method(GeneratorIterator, graph) if option.view: graph.show() # assert func1._generator_next_method_of_ is GeneratorIterator assert hasattr(GeneratorIterator, 'next') # graph_next = space.build_flow(GeneratorIterator.next.im_func) join_blocks(graph_next) if option.view: graph_next.show() # graph1 = space.build_flow(func1, tweak_for_generator=False) tweak_generator_body_graph(GeneratorIterator.Entry, graph1) if option.view: graph1.show()