[pypy-svn] r27164 - in pypy/dist/pypy: rpython rpython/l3interp rpython/memory rpython/test translator/backendopt

cfbolz at codespeak.net cfbolz at codespeak.net
Sat May 13 12:06:45 CEST 2006


Author: cfbolz
Date: Sat May 13 12:06:42 2006
New Revision: 27164

Modified:
   pypy/dist/pypy/rpython/l3interp/convertgraph.py
   pypy/dist/pypy/rpython/memory/gctransform.py
   pypy/dist/pypy/rpython/objectmodel.py
   pypy/dist/pypy/rpython/test/test_objectmodel.py
   pypy/dist/pypy/translator/backendopt/all.py
Log:
add a __hash__ and a __cmp__ to symbolic to prevent bad things happening. of
course it did not actually help with the problem at hand :-(


Modified: pypy/dist/pypy/rpython/l3interp/convertgraph.py
==============================================================================
--- pypy/dist/pypy/rpython/l3interp/convertgraph.py	(original)
+++ pypy/dist/pypy/rpython/l3interp/convertgraph.py	Sat May 13 12:06:42 2006
@@ -82,11 +82,17 @@
                 value = fakeaddress(v.value)
             else:
                 value = v.value
-            try:
-                res = clist.index(value)
-            except ValueError:
-                res = len(clist)
-                clist.append(value)
+            for i, item in enumerate(clist):
+                # XXX hum, hum. The fact that symbolics are not comparable
+                # makes this ugly thing necessary :-(
+                try:
+                    if item == value:
+                        return i
+                except TypeError:
+                    if item is value:
+                        return i
+            res = len(clist)
+            clist.append(value)
             return res
         else:
             position = self.var2stack[v]
@@ -94,9 +100,10 @@
 
     def getoffset(self, offset):
         clist = self.constants['int']
-        try:
-            res = clist.index(offset)
-        except ValueError:
+        for i, item in enumerate(clist):
+            if item is offset:
+                return i
+        else:
             res = len(clist)
             clist.append(offset)
         return res

Modified: pypy/dist/pypy/rpython/memory/gctransform.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gctransform.py	(original)
+++ pypy/dist/pypy/rpython/memory/gctransform.py	Sat May 13 12:06:42 2006
@@ -907,7 +907,7 @@
             self.type_info_list.append(info)
             self.id_of_type[TYPE] = type_id
             offsets = offsets_to_gc_pointers(TYPE)
-            info["ofstoptrs"] = self.offsets2table(offsets)
+            info["ofstoptrs"] = self.offsets2table(offsets, TYPE)
             if not TYPE._is_varsize():
                 info["fixedsize"] = llmemory.sizeof(TYPE)
                 info["ofstolength"] = -1
@@ -933,10 +933,10 @@
                 assert isinstance(ARRAY, lltype.Array)
                 if ARRAY.OF != lltype.Void:
                     offsets = offsets_to_gc_pointers(ARRAY.OF)
-                    info["varofstoptrs"] = self.offsets2table(offsets)
+                    info["varofstoptrs"] = self.offsets2table(offsets, ARRAY.OF)
                     info["varitemsize"] = llmemory.sizeof(ARRAY.OF)
                 else:
-                    info["varofstoptrs"] = self.offsets2table(())
+                    info["varofstoptrs"] = self.offsets2table((), lltype.Void)
                     info["varitemsize"] = 0
             return type_id
 
@@ -952,16 +952,15 @@
                 for a in gc_pointers_inside(value, llmemory.fakeaddress(value)):
                     self.addresses_of_static_ptrs_in_nongc.append(a)
 
-    def offsets2table(self, offsets):
-        key = tuple(offsets)
+    def offsets2table(self, offsets, TYPE):
         try:
-            return self.offsettable_cache[key]
+            return self.offsettable_cache[TYPE]
         except KeyError:
             cachedarray = lltype.malloc(self.gcdata.OFFSETS_TO_GC_PTR,
                                         len(offsets), immortal=True)
             for i, value in enumerate(offsets):
                 cachedarray[i] = value
-            self.offsettable_cache[key] = cachedarray
+            self.offsettable_cache[TYPE] = cachedarray
             return cachedarray
 
     def finish(self):

Modified: pypy/dist/pypy/rpython/objectmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/objectmodel.py	(original)
+++ pypy/dist/pypy/rpython/objectmodel.py	Sat May 13 12:06:42 2006
@@ -13,6 +13,12 @@
     def lltype(self):
         return None
 
+    def __cmp__(self, other):
+        raise TypeError("Symbolics can not be compared!")
+
+    def __hash__(self):
+        raise TypeError("Symbolics are not hashable!")
+
 class ComputedIntSymbolic(Symbolic):
 
     def __init__(self, compute_fn):

Modified: pypy/dist/pypy/rpython/test/test_objectmodel.py
==============================================================================
--- pypy/dist/pypy/rpython/test/test_objectmodel.py	(original)
+++ pypy/dist/pypy/rpython/test/test_objectmodel.py	Sat May 13 12:06:42 2006
@@ -266,3 +266,12 @@
 
     assert A(12098).value == 12098
     assert A(12098).getvalue() == 12098
+
+def test_symbolic():
+    
+
+def test_symbolic_raises():
+    s1 = Symbolic()
+    s2 = Symbolic()
+    py.test.raises(TypeError, "s1 < s2")
+    py.test.raises(TypeError, "hash(s1)")

Modified: pypy/dist/pypy/translator/backendopt/all.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/all.py	(original)
+++ pypy/dist/pypy/translator/backendopt/all.py	Sat May 13 12:06:42 2006
@@ -16,7 +16,7 @@
                                       inline_threshold=1,
                                       mallocs=True,
                                       merge_if_blocks_to_switch=True,
-                                      propagate=False,
+                                      propagate=True,
                                       heap2stack=False,
                                       clever_malloc_removal=False):
 



More information about the Pypy-commit mailing list