[pypy-svn] r70257 - in pypy/branch/jit-delayed-write/pypy/translator/backendopt: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Dec 23 12:22:11 CET 2009
Author: arigo
Date: Wed Dec 23 12:22:10 2009
New Revision: 70257
Modified:
pypy/branch/jit-delayed-write/pypy/translator/backendopt/test/test_writeanalyze.py
pypy/branch/jit-delayed-write/pypy/translator/backendopt/writeanalyze.py
Log:
Add a ReadWriteAnalyzer to the module 'writeanalyze'.
Modified: pypy/branch/jit-delayed-write/pypy/translator/backendopt/test/test_writeanalyze.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/translator/backendopt/test/test_writeanalyze.py (original)
+++ pypy/branch/jit-delayed-write/pypy/translator/backendopt/test/test_writeanalyze.py Wed Dec 23 12:22:10 2009
@@ -4,14 +4,15 @@
from pypy.translator.translator import TranslationContext, graphof
from pypy.translator.simplify import get_funcobj
from pypy.translator.backendopt.writeanalyze import WriteAnalyzer, top_set
+from pypy.translator.backendopt.writeanalyze import ReadWriteAnalyzer
from pypy.translator.backendopt.all import backend_optimizations
from pypy.conftest import option
-class BaseTestWriteAnalyze(object):
+class BaseTest(object):
type_system = None
-
+ Analyzer = WriteAnalyzer
def translate(self, func, sig):
t = TranslationContext()
@@ -19,7 +20,10 @@
t.buildrtyper(type_system=self.type_system).specialize()
if option.view:
t.view()
- return t, WriteAnalyzer(t)
+ return t, self.Analyzer(t)
+
+
+class BaseTestWriteAnalyze(BaseTest):
def test_writes_simple(self):
def g(x):
@@ -240,3 +244,65 @@
result = wa.analyze(ggraph.startblock.operations[0])
assert result is top_set
+
+
+class TestLLtypeReadWriteAnalyze(BaseTest):
+ Analyzer = ReadWriteAnalyzer
+ type_system = 'lltype'
+
+ def test_read_simple(self):
+ def g(x):
+ return True
+
+ def f(x):
+ return g(x - 1)
+ t, wa = self.translate(f, [int])
+ fgraph = graphof(t, f)
+ result = wa.analyze(fgraph.startblock.operations[0])
+ assert not result
+
+ def test_read_really(self):
+ class A(object):
+ def __init__(self, y):
+ self.y = y
+ def f(self):
+ self.x = 1
+ return self.y
+ def h(flag):
+ obj = A(flag)
+ return obj.f()
+
+ t, wa = self.translate(h, [int])
+ hgraph = graphof(t, h)
+ op_call_f = hgraph.startblock.operations[-1]
+
+ # check that we fished the expected ops
+ assert op_call_f.opname == "direct_call"
+ assert get_funcobj(op_call_f.args[0].value)._name == 'A.f'
+
+ result = wa.analyze(op_call_f)
+ assert len(result) == 2
+ result = list(result)
+ result.sort()
+ [(struct1, T1, name1), (struct2, T2, name2)] = result
+ assert struct1 == "readstruct"
+ assert name1.endswith("y")
+ assert struct2 == "struct"
+ assert name2.endswith("x")
+ assert T1 == T2
+
+ def test_contains(self):
+ def g(x, y, z):
+ l = [x]
+ return f(l, y, z)
+ def f(x, y, z):
+ return y in x
+
+ t, wa = self.translate(g, [int, int, int])
+ ggraph = graphof(t, g)
+ assert ggraph.startblock.operations[-1].opname == 'direct_call'
+
+ result = wa.analyze(ggraph.startblock.operations[-1])
+ ARRAYPTR = list(result)[0][1]
+ assert list(result) == [("readarray", ARRAYPTR)]
+ assert isinstance(ARRAYPTR.TO, lltype.GcArray)
Modified: pypy/branch/jit-delayed-write/pypy/translator/backendopt/writeanalyze.py
==============================================================================
--- pypy/branch/jit-delayed-write/pypy/translator/backendopt/writeanalyze.py (original)
+++ pypy/branch/jit-delayed-write/pypy/translator/backendopt/writeanalyze.py Wed Dec 23 12:22:10 2009
@@ -45,3 +45,15 @@
elif methname in ('ll_getitem_fast', 'll_length'):
return self.bottom_result()
return graphanalyze.GraphAnalyzer.analyze_external_method(self, op, TYPE, meth)
+
+
+class ReadWriteAnalyzer(WriteAnalyzer):
+
+ def analyze_simple_operation(self, op):
+ if op.opname == "getfield":
+ return frozenset([
+ ("readstruct", op.args[0].concretetype, op.args[1].value)])
+ elif op.opname == "getarrayitem":
+ return frozenset([
+ ("readarray", op.args[0].concretetype)])
+ return WriteAnalyzer.analyze_simple_operation(self, op)
More information about the Pypy-commit
mailing list