[pypy-svn] r63008 - in pypy/trunk/pypy/translator/backendopt: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Mar 17 18:26:38 CET 2009
Author: arigo
Date: Tue Mar 17 18:26:36 2009
New Revision: 63008
Modified:
pypy/trunk/pypy/translator/backendopt/malloc.py
pypy/trunk/pypy/translator/backendopt/test/test_malloc.py
Log:
Finally fix this test, as targetgbimplementation now shows the same problem.
Modified: pypy/trunk/pypy/translator/backendopt/malloc.py
==============================================================================
--- pypy/trunk/pypy/translator/backendopt/malloc.py (original)
+++ pypy/trunk/pypy/translator/backendopt/malloc.py Tue Mar 17 18:26:36 2009
@@ -460,12 +460,21 @@
pass
return S, fldname
+ def handle_unreachable(self, v_result):
+ from pypy.rpython.lltypesystem.rstr import string_repr
+ msg = "unreachable operation (from malloc.py)"
+ ll_msg = string_repr.convert_const(msg)
+ c_msg = Constant(ll_msg, lltype.typeOf(ll_msg))
+ return SpaceOperation("debug_fatalerror", [c_msg], v_result)
+
def flowin_op(self, op, vars, newvarsmap):
if op.opname in ("getfield", "getarrayitem"):
S = op.args[0].concretetype.TO
fldname = op.args[1].value
key = self.key_for_field_access(S, fldname)
- if key in self.accessed_substructs:
+ if key not in newvarsmap:
+ newop = self.handle_unreachable(op.result)
+ elif key in self.accessed_substructs:
c_name = Constant('data', lltype.Void)
newop = SpaceOperation("getfield",
[newvarsmap[key], c_name],
@@ -480,8 +489,10 @@
S = op.args[0].concretetype.TO
fldname = op.args[1].value
key = self.key_for_field_access(S, fldname)
- assert key in newvarsmap
- if key in self.accessed_substructs:
+ if key not in newvarsmap:
+ newop = self.handle_unreachable(op.result)
+ self.newops.append(newop)
+ elif key in self.accessed_substructs:
c_name = Constant('data', lltype.Void)
newop = SpaceOperation("setfield",
[newvarsmap[key], c_name, op.args[2]],
@@ -516,11 +527,15 @@
opname = "direct_fieldptr"
else:
opname = "getsubstruct"
- v = newvarsmap[S, fldname]
- cname = Constant('data', lltype.Void)
- newop = SpaceOperation(opname,
- [v, cname],
- op.result)
+ try:
+ v = newvarsmap[S, fldname]
+ except KeyError:
+ newop = self.handle_unreachable(op.result)
+ else:
+ cname = Constant('data', lltype.Void)
+ newop = SpaceOperation(opname,
+ [v, cname],
+ op.result)
self.newops.append(newop)
elif op.opname in ("ptr_iszero", "ptr_nonzero"):
# we know the pointer is not NULL if it comes from
Modified: pypy/trunk/pypy/translator/backendopt/test/test_malloc.py
==============================================================================
--- pypy/trunk/pypy/translator/backendopt/test/test_malloc.py (original)
+++ pypy/trunk/pypy/translator/backendopt/test/test_malloc.py Tue Mar 17 18:26:36 2009
@@ -384,7 +384,6 @@
graph = self.check(f, [int], [42], 42)
def test_bogus_cast_pointer(self):
- py.test.skip("XXX fix me")
S = lltype.GcStruct("S", ('x', lltype.Signed))
T = lltype.GcStruct("T", ('s', S), ('y', lltype.Signed))
def f(x):
More information about the Pypy-commit
mailing list