[pypy-svn] r69082 - in pypy/trunk/pypy/translator/backendopt: . test

antocuni at codespeak.net antocuni at codespeak.net
Mon Nov 9 11:22:43 CET 2009


Author: antocuni
Date: Mon Nov  9 11:22:42 2009
New Revision: 69082

Modified:
   pypy/trunk/pypy/translator/backendopt/test/test_writeanalyze.py
   pypy/trunk/pypy/translator/backendopt/writeanalyze.py
Log:
(antocuni, cfbolz) port the writeanalizer to ootype


Modified: pypy/trunk/pypy/translator/backendopt/test/test_writeanalyze.py
==============================================================================
--- pypy/trunk/pypy/translator/backendopt/test/test_writeanalyze.py	(original)
+++ pypy/trunk/pypy/translator/backendopt/test/test_writeanalyze.py	Mon Nov  9 11:22:42 2009
@@ -1,5 +1,6 @@
 import py
 from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.ootypesystem import ootype
 from pypy.translator.translator import TranslationContext, graphof
 from pypy.translator.simplify import get_funcobj
 from pypy.translator.backendopt.writeanalyze import WriteAnalyzer, top_set
@@ -7,17 +8,19 @@
 from pypy.conftest import option
 
 
-class TestCanRaise(object):
+class BaseTestCanRaise(object):
 
+    type_system = None
+
+    
     def translate(self, func, sig):
         t = TranslationContext()
         t.buildannotator().build_types(func, sig)
-        t.buildrtyper().specialize()
+        t.buildrtyper(type_system=self.type_system).specialize()
         if option.view:
             t.view()
         return t, WriteAnalyzer(t)
 
-
     def test_writes_simple(self):
         def g(x):
             return True
@@ -108,7 +111,10 @@
         t, wa = self.translate(f, [int])
         fgraph = graphof(t, f)
         result = wa.analyze(fgraph.startblock.operations[0])
-        assert result is top_set
+        if self.type_system == 'lltype':
+            assert result is top_set
+        else:
+            assert not result # ootype is more precise in this case
 
     def test_llexternal(self):
         from pypy.rpython.lltypesystem.rffi import llexternal
@@ -124,6 +130,10 @@
         result = wa.analyze(fgraph.startblock.operations[0])
         assert not result
 
+
+class TestLLtype(BaseTestCanRaise):
+    type_system = 'lltype'
+
     def test_list(self):
         def g(x, y, z):
             return f(x, y, z)
@@ -152,3 +162,40 @@
         assert struct == "struct"
         assert name == "length"
         assert S1 is S2
+
+
+class TestOOtype(BaseTestCanRaise):
+    type_system = 'ootype'
+    
+    def test_array(self):
+        def g(x, y, z):
+            return f(x, y, z)
+        def f(x, y, z):
+            l = [0] * x
+            l[1] = 42
+            return len(l) + z
+
+        t, wa = self.translate(g, [int, int, int])
+        ggraph = graphof(t, g)
+        assert ggraph.startblock.operations[0].opname == 'direct_call'
+
+        result = sorted(wa.analyze(ggraph.startblock.operations[0]))
+        assert len(result) == 1
+        array, A = result[0]
+        assert array == 'array'
+        assert A.ITEM is ootype.Signed
+        
+    def test_list(self):
+        def g(x, y, z):
+            return f(x, y, z)
+        def f(x, y, z):
+            l = [0] * x
+            l.append(z)
+            return len(l) + z
+
+        t, wa = self.translate(g, [int, int, int])
+        ggraph = graphof(t, g)
+        assert ggraph.startblock.operations[0].opname == 'direct_call'
+
+        result = wa.analyze(ggraph.startblock.operations[0])
+        assert result is top_set

Modified: pypy/trunk/pypy/translator/backendopt/writeanalyze.py
==============================================================================
--- pypy/trunk/pypy/translator/backendopt/writeanalyze.py	(original)
+++ pypy/trunk/pypy/translator/backendopt/writeanalyze.py	Mon Nov  9 11:22:42 2009
@@ -1,4 +1,5 @@
 from pypy.translator.backendopt import graphanalyze
+from pypy.rpython.ootypesystem import ootype
 reload(graphanalyze)
 
 top_set = object()
@@ -27,13 +28,24 @@
         return result is top_set
 
     def analyze_simple_operation(self, op):
-        if op.opname == "setfield":
+        if op.opname in ("setfield", "oosetfield"):
             return frozenset([
                 ("struct", op.args[0].concretetype, op.args[1].value)])
         elif op.opname == "setarrayitem":
-            return frozenset([("array", op.args[0].concretetype)])
+            return self._array_result(op.args[0].concretetype)
         return empty_set
 
+    def _array_result(self, TYPE):
+        return frozenset([("array", TYPE)])
+
     def analyze_external_call(self, op):
         return self.bottom_result() # an external call cannot change anything
 
+    def analyze_external_method(self, op, TYPE, meth):
+        if isinstance(TYPE, ootype.Array):
+            methname = op.args[0].value
+            if methname == 'll_setitem_fast':
+                return self._array_result(op.args[1].concretetype)
+            elif methname in ('ll_getitem_fast', 'll_length'):
+                return self.bottom_result()
+        return graphanalyze.GraphAnalyzer.analyze_external_method(self, op, TYPE, meth)



More information about the Pypy-commit mailing list