Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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()