[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