[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