[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