[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