[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