[pypy-commit] pypy identity-dict-strategy: as cfbolz points out, we cannot mutate the space, because it's frozen. Instead, store the mutable version in an object attached to the space

antocuni noreply at buildbot.pypy.org
Wed Jul 20 10:16:20 CEST 2011


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: identity-dict-strategy
Changeset: r45759:5ee41f314843
Date: 2011-07-20 10:16 +0200
http://bitbucket.org/pypy/pypy/changeset/5ee41f314843/

Log:	as cfbolz points out, we cannot mutate the space, because it's
	frozen. Instead, store the mutable version in an object attached to
	the space

diff --git a/pypy/objspace/std/objecttype.py b/pypy/objspace/std/objecttype.py
--- a/pypy/objspace/std/objecttype.py
+++ b/pypy/objspace/std/objecttype.py
@@ -45,7 +45,7 @@
         w_obj.setclass(space, w_newcls)
         if space.config.objspace.std.trackcomparebyidentity:
             if w_oldcls.compares_by_identity() and not w_newcls.compares_by_identity():
-                space.bump_compares_by_identity_version()
+                space.compares_by_identity_version.bump()
     else:
         raise operationerrfmt(space.w_TypeError,
                               "__class__ assignment: '%s' object layout differs from '%s'",
diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -89,7 +89,7 @@
         self.w_classobj = self.builtin.get('__metaclass__')
 
         if self.config.objspace.std.trackcomparebyidentity:
-            self.bump_compares_by_identity_version()
+            self.compares_by_identity_version = ComparesByIdentityVersion()
 
         # final setup
         self.setup_builtin_modules()
@@ -581,5 +581,11 @@
             return self.wrap(w_sub.issubtype(w_type))
         raise OperationError(self.w_TypeError, self.wrap("need type objects"))
 
-    def bump_compares_by_identity_version(self):
-        self.compares_by_identity_version = VersionTag()
+
+class ComparesByIdentityVersion(object):
+
+    def __init__(self):
+        self.bump()
+
+    def bump(self):
+        self._version = VersionTag()
diff --git a/pypy/objspace/std/test/test_typeobject.py b/pypy/objspace/std/test/test_typeobject.py
--- a/pypy/objspace/std/test/test_typeobject.py
+++ b/pypy/objspace/std/test/test_typeobject.py
@@ -1212,7 +1212,7 @@
         cls.w_compares_by_identity = cls.space.wrap(interp2app(compares_by_identity))
 
         def get_version(space):
-            v = cls.versions.setdefault(space.compares_by_identity_version,
+            v = cls.versions.setdefault(space.compares_by_identity_version._version,
                                         len(cls.versions))
             return space.wrap(v)
         cls.w_get_version = cls.space.wrap(interp2app(get_version))
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -178,7 +178,7 @@
                 key == '__cmp__' or key == '__hash__'):
                 w_self.compares_by_identity_status = UNKNOWN
                 if did_compare_by_identity:
-                    w_self.space.bump_compares_by_identity_version()
+                    w_self.space.compares_by_identity_version.bump()
                 
         if space.config.objspace.std.newshortcut:
             w_self.w_bltin_new = None


More information about the pypy-commit mailing list