[pypy-svn] r77903 - in pypy/branch/32ptr-on-64bit/pypy/objspace/std: . test

arigo at codespeak.net arigo at codespeak.net
Thu Oct 14 11:38:26 CEST 2010


Author: arigo
Date: Thu Oct 14 11:38:25 2010
New Revision: 77903

Modified:
   pypy/branch/32ptr-on-64bit/pypy/objspace/std/mapdict.py
   pypy/branch/32ptr-on-64bit/pypy/objspace/std/test/test_mapdict.py
Log:
Update mapdicts to only use rerased for the last field,
which allows all other fields to be compressed.


Modified: pypy/branch/32ptr-on-64bit/pypy/objspace/std/mapdict.py
==============================================================================
--- pypy/branch/32ptr-on-64bit/pypy/objspace/std/mapdict.py	(original)
+++ pypy/branch/32ptr-on-64bit/pypy/objspace/std/mapdict.py	Thu Oct 14 11:38:25 2010
@@ -413,11 +413,14 @@
     rangen = unroll.unrolling_iterable(range(n))
     nmin1 = n - 1
     rangenmin1 = unroll.unrolling_iterable(range(nmin1))
+    #
     class subcls(ObjectMixin, BaseMapdictObject, supercls):
+        _nmin1 = nmin1
+        for _i in rangenmin1:
+            locals()["_value%s" % _i] = None
+        locals()["_value%s" % nmin1] = rerased.erase(None)
+
         def _init_empty(self, map):
-            from pypy.rlib.debug import make_sure_not_resized
-            for i in rangen:
-                setattr(self, "_value%s" % i, rerased.erase(None))
             self.map = map
 
         def _has_storage_list(self):
@@ -430,22 +433,21 @@
         def _mapdict_read_storage(self, index):
             for i in rangenmin1:
                 if index == i:
-                    erased = getattr(self, "_value%s" % i)
-                    return rerased.unerase(erased, W_Root)
+                    return getattr(self, "_value%s" % i)
             if self._has_storage_list():
                 return self._mapdict_get_storage_list()[index - nmin1]
             erased = getattr(self, "_value%s" % nmin1)
             return rerased.unerase(erased, W_Root)
 
         def _mapdict_write_storage(self, index, value):
-            erased = rerased.erase(value)
             for i in rangenmin1:
                 if index == i:
-                    setattr(self, "_value%s" % i, erased)
+                    setattr(self, "_value%s" % i, value)
                     return
             if self._has_storage_list():
                 self._mapdict_get_storage_list()[index - nmin1] = value
                 return
+            erased = rerased.erase(value)
             setattr(self, "_value%s" % nmin1, erased)
 
         def _mapdict_storage_length(self):
@@ -458,10 +460,10 @@
             len_storage = len(storage)
             for i in rangenmin1:
                 if i < len_storage:
-                    erased = rerased.erase(storage[i])
+                    value = storage[i]
                 else:
-                    erased = rerased.erase(None)
-                setattr(self, "_value%s" % i, erased)
+                    value = None
+                setattr(self, "_value%s" % i, value)
             has_storage_list = self._has_storage_list()
             if len_storage < n:
                 assert not has_storage_list

Modified: pypy/branch/32ptr-on-64bit/pypy/objspace/std/test/test_mapdict.py
==============================================================================
--- pypy/branch/32ptr-on-64bit/pypy/objspace/std/test/test_mapdict.py	(original)
+++ pypy/branch/32ptr-on-64bit/pypy/objspace/std/test/test_mapdict.py	Thu Oct 14 11:38:25 2010
@@ -372,12 +372,18 @@
         obj = objectcls()
         obj.user_setup(space, cls)
         obj.setdictvalue(space, "a", w1)
-        assert rerased.unerase(obj._value0, W_Root) is w1
+        if objectcls._nmin1 == 0:
+            assert rerased.unerase(obj._value0, W_Root) is w1
+        else:
+            assert obj._value0 is w1
         assert obj.getdictvalue(space, "a") is w1
         assert obj.getdictvalue(space, "b") is None
         assert obj.getdictvalue(space, "c") is None
         obj.setdictvalue(space, "a", w2)
-        assert rerased.unerase(obj._value0, W_Root) is w2
+        if objectcls._nmin1 == 0:
+            assert rerased.unerase(obj._value0, W_Root) is w2
+        else:
+            assert obj._value0 is w2
         assert obj.getdictvalue(space, "a") == w2
         assert obj.getdictvalue(space, "b") is None
         assert obj.getdictvalue(space, "c") is None
@@ -395,7 +401,10 @@
 
         res = obj.deldictvalue(space, "a")
         assert res
-        assert rerased.unerase(obj._value0, W_Root) is w4
+        if objectcls._nmin1 == 0:
+            assert rerased.unerase(obj._value0, W_Root) is w4
+        else:
+            assert obj._value0 is w4
         assert obj.getdictvalue(space, "a") is None
         assert obj.getdictvalue(space, "b") is w4
         assert obj.getdictvalue(space, "c") is None



More information about the Pypy-commit mailing list