[pypy-svn] r28580 - in pypy/dist/pypy/translator/backendopt: . test

mwh at codespeak.net mwh at codespeak.net
Fri Jun 9 13:21:52 CEST 2006


Author: mwh
Date: Fri Jun  9 13:21:49 2006
New Revision: 28580

Added:
   pypy/dist/pypy/translator/backendopt/test/test_support.py   (contents, props changed)
Modified:
   pypy/dist/pypy/translator/backendopt/support.py
Log:
(mwh, pedronis)
conform to tradition by fixing a few more cases around the area of where to
insert keepalives.  break with tradition with ACTUALLY WRITING TESTS for this
stuff.  ffs.  (we've been guilty of this too, not pointing fingers :-)


Modified: pypy/dist/pypy/translator/backendopt/support.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/support.py	(original)
+++ pypy/dist/pypy/translator/backendopt/support.py	Fri Jun  9 13:21:49 2006
@@ -40,13 +40,18 @@
 def needs_conservative_livevar_calculation(block):
     from pypy.rpython.lltypesystem import rclass
     vars = block.getvariables()
+    assert len(block.exits) == 1
+    exitingvars = block.exits[0].args
     for var in vars:
         TYPE = getattr(var, "concretetype", lltype.Ptr(lltype.PyObject))
         if isinstance(TYPE, lltype.Ptr) and not var_needsgc(var):
+            if isinstance(TYPE.TO, lltype.FuncType):
+                continue
             try:
                 lltype.castable(TYPE, rclass.CLASSTYPE)
             except lltype.InvalidCast:
-                return True
+                if var in exitingvars:
+                    return True
     else:
         return False
 

Added: pypy/dist/pypy/translator/backendopt/test/test_support.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/backendopt/test/test_support.py	Fri Jun  9 13:21:49 2006
@@ -0,0 +1,58 @@
+from pypy.translator.backendopt.support import \
+     needs_conservative_livevar_calculation, split_block_with_keepalive
+
+from pypy.rpython.rtyper import LowLevelOpList
+from pypy.rpython.lltypesystem import lltype
+from pypy.objspace.flow import model
+
+NonGcB = lltype.Struct("B", ('x', lltype.Signed))
+GcA = lltype.GcStruct("A", ('b', NonGcB), ('c', lltype.Ptr(lltype.FuncType([], lltype.Void))))
+
+def varoftype(concretetype):
+    var = model.Variable()
+    var.concretetype = concretetype
+    return var
+
+def test_nclc_should_be_true():
+    llops = LowLevelOpList()
+    ptr_a = varoftype(lltype.Ptr(GcA))
+    v_res = llops.genop("getfield", [ptr_a, model.Constant('b', lltype.Void)],
+                        resulttype=lltype.Ptr(NonGcB))
+    block = model.Block([ptr_a])
+    block.operations.extend(llops)
+    block.closeblock(model.Link([v_res], None))
+    assert needs_conservative_livevar_calculation(block)
+
+def test_nclc_nongc_not_passed_on():
+    llops = LowLevelOpList()
+    ptr_a = varoftype(lltype.Ptr(GcA))
+    v_res = llops.genop("getfield", [ptr_a, model.Constant('b', lltype.Void)],
+                        resulttype=lltype.Ptr(NonGcB))
+    block = model.Block([ptr_a])
+    block.operations.extend(llops)
+    block.closeblock(model.Link([ptr_a], None))
+    assert not needs_conservative_livevar_calculation(block)
+
+def test_nclc_ignore_functype():
+    llops = LowLevelOpList()
+    ptr_a = varoftype(lltype.Ptr(GcA))
+    v_res = llops.genop("getfield", [ptr_a, model.Constant('c', lltype.Void)],
+                        resulttype=GcA.c)
+    block = model.Block([ptr_a])
+    block.operations.extend(llops)
+    block.closeblock(model.Link([v_res], None))
+    assert not needs_conservative_livevar_calculation(block)
+
+def test_sbwk_should_insert_keepalives():
+    llops = LowLevelOpList()
+    ptr_a = varoftype(lltype.Ptr(GcA))
+    v_res = llops.genop("getfield", [ptr_a, model.Constant('b', lltype.Void)],
+                        resulttype=lltype.Ptr(NonGcB))
+    llops.genop("direct_call", [model.Constant(None, lltype.Void), v_res],
+                resulttype=lltype.Void)
+    block = model.Block([ptr_a])
+    block.operations.extend(llops)
+    block.closeblock(model.Link([], None))
+    link = split_block_with_keepalive(block, 1)
+    assert 'keepalive' in [op.opname for op in link.target.operations]
+    



More information about the Pypy-commit mailing list