Author: Alex Gaynor <[email protected]>
Branch: detect-immutable-fields
Changeset: r68903:9b7b906379c9
Date: 2014-01-24 08:59 -0600
http://bitbucket.org/pypy/pypy/changeset/9b7b906379c9/

Log:    Failing test, unsure how to make it pass

diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -179,7 +179,7 @@
         return None
     def _set_mapdict_map(self, map):
         raise NotImplementedError
-    def _mapdict_read_storage(self, index, pure=False):
+    def _mapdict_read_storage(self, index, pure):
         raise NotImplementedError
     def _mapdict_write_storage(self, index, value):
         raise NotImplementedError
diff --git a/pypy/objspace/std/mapdict.py b/pypy/objspace/std/mapdict.py
--- a/pypy/objspace/std/mapdict.py
+++ b/pypy/objspace/std/mapdict.py
@@ -34,7 +34,18 @@
         attr = self.find_map_attr(selector)
         if attr is None:
             return self.terminator._read_terminator(obj, selector)
-        return obj._mapdict_read_storage(attr.storageindex, pure=not 
attr.ever_mutated)
+        if (
+            not attr.ever_mutated and
+            jit.isconstant(attr.storageindex) and
+            jit.isconstant(obj)
+        ):
+            return self._pure_mapdict_read_storage(obj, attr.storageindex)
+        else:
+            return obj._mapdict_read_storage(attr.storageindex)
+
+    @jit.elidable
+    def _pure_mapdict_read_storage(self, obj, storageindex):
+        return obj._mapdict_read_storage(storageindex)
 
     def write(self, obj, selector, w_value):
         attr = self.find_map_attr(selector)
@@ -466,18 +477,13 @@
         self.map = map
         self.storage = make_sure_not_resized([None] * map.size_estimate())
 
-    def _mapdict_read_storage(self, storageindex, pure=False):
+    def _mapdict_read_storage(self, storageindex):
         assert storageindex >= 0
-        if pure and jit.isconstant(storageindex) and jit.isconstant(self):
-            return self._pure_mapdict_read_storage(storageindex)
-        return self.storage[storageindex]
-
-    @jit.elidable
-    def _pure_mapdict_read_storage(self, storageindex):
         return self.storage[storageindex]
 
     def _mapdict_write_storage(self, storageindex, value):
         self.storage[storageindex] = value
+
     def _mapdict_storage_length(self):
         return len(self.storage)
     def _set_mapdict_storage_and_map(self, storage, map):
@@ -543,17 +549,8 @@
             erased = getattr(self, "_value%s" % nmin1)
             return unerase_list(erased)
 
-        def _mapdict_read_storage(self, storageindex, pure=False):
+        def _mapdict_read_storage(self, storageindex):
             assert storageindex >= 0
-            if pure and jit.isconstant(storageindex) and jit.isconstant(self):
-                return self._pure_mapdict_read_storage(storageindex)
-            return self._indirection_mapdict_read_storage(storageindex)
-
-        @jit.elidable
-        def _pure_mapdict_read_storage(self, storageindex):
-            return self._indirection_mapdict_read_storage(storageindex)
-
-        def _indirection_mapdict_read_storage(self, storageindex):
             if storageindex < nmin1:
                 for i in rangenmin1:
                     if storageindex == i:
diff --git a/pypy/objspace/std/test/test_mapdict.py 
b/pypy/objspace/std/test/test_mapdict.py
--- a/pypy/objspace/std/test/test_mapdict.py
+++ b/pypy/objspace/std/test/test_mapdict.py
@@ -117,18 +117,19 @@
     assert obj.map.ever_mutated == True
     assert obj.map.back.ever_mutated == False
 
-    def _mapdict_read_storage(index, pure=False):
-        assert index in (0, 1)
-        if index == 0:
-            assert pure == True
-        else:
-            assert pure == False
-        return Object._mapdict_read_storage(obj, index, pure)
+    indices = []
 
-    obj._mapdict_read_storage = _mapdict_read_storage
+    def _pure_mapdict_read_storage(obj, index):
+        assert index == 0
+        indices.append(index)
+        return obj._mapdict_read_storage(obj, index)
+
+    obj.map._pure_mapdict_read_storage = _pure_mapdict_read_storage
 
     assert obj.getdictvalue(space, "a") == 10
     assert obj.getdictvalue(space, "b") == 30
+    assert obj.getdictvalue(space, "a") == 10
+    assert indices == [0, 0]
 
     obj2 = cls.instantiate()
     obj2.setdictvalue(space, "a", 15)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to