[pypy-commit] pypy translation-cleanup: Move pypy.interpreter.generator to flow space

rlamy noreply at buildbot.pypy.org
Mon Oct 1 18:27:29 CEST 2012


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: translation-cleanup
Changeset: r57705:5838c81970ae
Date: 2012-10-01 16:53 +0100
http://bitbucket.org/pypy/pypy/changeset/5838c81970ae/

Log:	Move pypy.interpreter.generator to flow space

diff --git a/pypy/translator/generator.py b/pypy/objspace/flow/generator.py
rename from pypy/translator/generator.py
rename to pypy/objspace/flow/generator.py
diff --git a/pypy/objspace/flow/objspace.py b/pypy/objspace/flow/objspace.py
--- a/pypy/objspace/flow/objspace.py
+++ b/pypy/objspace/flow/objspace.py
@@ -10,6 +10,7 @@
 from pypy.objspace.flow import operation
 from pypy.objspace.flow.flowcontext import (FlowSpaceFrame, fixeggblocks,
     FSException, FlowingError)
+from pypy.objspace.flow.generator import tweak_generator_graph
 from pypy.objspace.flow.pygraph import PyGraph
 from pypy.objspace.flow.specialcase import SPECIAL_CASES
 from pypy.rlib.unroll import unrolling_iterable, _unroller
@@ -244,7 +245,6 @@
         fixeggblocks(graph)
         checkgraph(graph)
         if graph.is_generator and tweak_for_generator:
-            from pypy.translator.generator import tweak_generator_graph
             tweak_generator_graph(graph)
         return graph
 
diff --git a/pypy/objspace/flow/test/test_generator.py b/pypy/objspace/flow/test/test_generator.py
--- a/pypy/objspace/flow/test/test_generator.py
+++ b/pypy/objspace/flow/test/test_generator.py
@@ -1,18 +1,153 @@
-from pypy.objspace.flow.test.test_objspace import Base
+from pypy.conftest import option
+from pypy.objspace.flow.objspace import FlowObjSpace
+from pypy.objspace.flow.model import Variable
+from pypy.interpreter.argument import Signature
+from pypy.objspace.flow.generator import (make_generatoriterator_class,
+        replace_graph_with_bootstrap, get_variable_names,
+        tweak_generator_body_graph, attach_next_method)
+from pypy.translator.simplify import join_blocks
 
 
-class TestGenerator(Base):
+# ____________________________________________________________
 
-    def test_simple_generator(self):
-        def f(n):
+def f_gen(n):
+    i = 0
+    while i < n:
+        yield i
+        i += 1
+
+class GeneratorIterator(object):
+    def __init__(self, entry):
+        self.current = entry
+    def next(self):
+        e = self.current
+        self.current = None
+        if isinstance(e, Yield1):
+            n = e.n_0
+            i = e.i_0
+            i += 1
+        else:
+            n = e.n_0
             i = 0
-            while i < n:
-                yield i
-                yield i
-                i += 1
-        graph = self.codetest(f, tweak_for_generator=False)
-        ops = self.all_operations(graph)
-        assert ops == {'generator_mark': 1,
-                       'lt': 1, 'is_true': 1,
-                       'yield': 2,
-                       'inplace_add': 1}
+        if i < n:
+            e = Yield1()
+            e.n_0 = n
+            e.i_0 = i
+            self.current = e
+            return i
+        raise StopIteration
+
+    def __iter__(self):
+        return self
+
+class AbstractPosition(object):
+    _immutable_ = True
+class Entry1(AbstractPosition):
+    _immutable_ = True
+class Yield1(AbstractPosition):
+    _immutable_ = True
+
+def f_explicit(n):
+    e = Entry1()
+    e.n_0 = n
+    return GeneratorIterator(e)
+
+def test_explicit():
+    assert list(f_gen(10)) == list(f_explicit(10))
+
+def test_get_variable_names():
+    lst = get_variable_names([Variable('a'), Variable('b_'), Variable('a')])
+    assert lst == ['g_a', 'g_b', 'g_a_']
+
+# ____________________________________________________________
+
+
+class TestGenerator:
+
+    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_body_graph(self):
+        def f(n, x, y, z=3):
+            z *= 10
+            yield n + 1
+            z -= 10
+        #
+        space = FlowObjSpace()
+        graph = space.build_flow(f, tweak_for_generator=False)
+        class Entry:
+            varnames = ['g_n', 'g_x', 'g_y', 'g_z']
+        tweak_generator_body_graph(Entry, graph)
+        if option.view:
+            graph.show()
+        # XXX how to test directly that the graph is correct?  :-(
+        assert len(graph.startblock.inputargs) == 1
+        assert graph.signature == Signature(['entry'])
+        assert graph.defaults == ()
+
+    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()
+
+    def test_automatic(self):
+        def f(n, x, y, z):
+            z *= 10
+            yield n + 1
+            z -= 10
+        #
+        space = FlowObjSpace()
+        graph = space.build_flow(f)   # tweak_for_generator=True
+        if option.view:
+            graph.show()
+        block = graph.startblock
+        assert len(block.exits) == 1
+        assert block.exits[0].target is graph.returnblock
diff --git a/pypy/translator/test/test_generator.py b/pypy/translator/test/test_generator.py
deleted file mode 100644
--- a/pypy/translator/test/test_generator.py
+++ /dev/null
@@ -1,156 +0,0 @@
-from pypy.conftest import option
-from pypy.objspace.flow.objspace import FlowObjSpace
-from pypy.objspace.flow.model import Variable
-from pypy.interpreter.argument import Signature
-from pypy.translator.translator import TranslationContext
-from pypy.translator.generator import make_generatoriterator_class
-from pypy.translator.generator import replace_graph_with_bootstrap
-from pypy.translator.generator import get_variable_names
-from pypy.translator.generator import tweak_generator_body_graph
-from pypy.translator.generator import attach_next_method
-from pypy.translator.simplify import join_blocks
-
-
-# ____________________________________________________________
-
-def f_gen(n):
-    i = 0
-    while i < n:
-        yield i
-        i += 1
-
-class GeneratorIterator(object):
-    def __init__(self, entry):
-        self.current = entry
-    def next(self):
-        e = self.current
-        self.current = None
-        if isinstance(e, Yield1):
-            n = e.n_0
-            i = e.i_0
-            i += 1
-        else:
-            n = e.n_0
-            i = 0
-        if i < n:
-            e = Yield1()
-            e.n_0 = n
-            e.i_0 = i
-            self.current = e
-            return i
-        raise StopIteration
-
-    def __iter__(self):
-        return self
-
-class AbstractPosition(object):
-    _immutable_ = True
-class Entry1(AbstractPosition):
-    _immutable_ = True
-class Yield1(AbstractPosition):
-    _immutable_ = True
-
-def f_explicit(n):
-    e = Entry1()
-    e.n_0 = n
-    return GeneratorIterator(e)
-
-def test_explicit():
-    assert list(f_gen(10)) == list(f_explicit(10))
-
-def test_get_variable_names():
-    lst = get_variable_names([Variable('a'), Variable('b_'), Variable('a')])
-    assert lst == ['g_a', 'g_b', 'g_a_']
-
-# ____________________________________________________________
-
-
-class TestGenerator:
-
-    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_body_graph(self):
-        def f(n, x, y, z=3):
-            z *= 10
-            yield n + 1
-            z -= 10
-        #
-        space = FlowObjSpace()
-        graph = space.build_flow(f, tweak_for_generator=False)
-        class Entry:
-            varnames = ['g_n', 'g_x', 'g_y', 'g_z']
-        tweak_generator_body_graph(Entry, graph)
-        if option.view:
-            graph.show()
-        # XXX how to test directly that the graph is correct?  :-(
-        assert len(graph.startblock.inputargs) == 1
-        assert graph.signature == Signature(['entry'])
-        assert graph.defaults == ()
-
-    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()
-
-    def test_automatic(self):
-        def f(n, x, y, z):
-            z *= 10
-            yield n + 1
-            z -= 10
-        #
-        space = FlowObjSpace()
-        graph = space.build_flow(f)   # tweak_for_generator=True
-        if option.view:
-            graph.show()
-        block = graph.startblock
-        assert len(block.exits) == 1
-        assert block.exits[0].target is graph.returnblock


More information about the pypy-commit mailing list