[pypy-commit] pypy default: use a specialize:memo instead of adding yet another word to the already huge W_TypeObjects.
cfbolz
noreply at buildbot.pypy.org
Wed Oct 26 14:19:04 CEST 2011
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch:
Changeset: r48470:bdebff21909a
Date: 2011-10-25 15:08 +0200
http://bitbucket.org/pypy/pypy/changeset/bdebff21909a/
Log: use a specialize:memo instead of adding yet another word to the
already huge W_TypeObjects.
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
@@ -83,11 +83,12 @@
if self.config.objspace.std.withtproxy:
transparent.setup(self)
+ interplevel_classes = {}
for type, classes in self.model.typeorder.iteritems():
- if len(classes) >= 3:
+ if len(classes) >= 3: # XXX what does this 3 mean??!
# W_Root, AnyXxx and actual object
- self.gettypefor(type).interplevel_cls = classes[0][0]
-
+ interplevel_classes[self.gettypefor(type)] = classes[0][0]
+ self._interplevel_classes = interplevel_classes
def get_builtin_types(self):
return self.builtin_types
@@ -579,7 +580,7 @@
raise OperationError(self.w_TypeError,
self.wrap("need type object"))
if is_annotation_constant(w_type):
- cls = w_type.interplevel_cls
+ cls = self._get_interplevel_cls(w_type)
if cls is not None:
assert w_inst is not None
if isinstance(w_inst, cls):
@@ -589,3 +590,9 @@
@specialize.arg_or_var(2)
def isinstance_w(space, w_inst, w_type):
return space._type_isinstance(w_inst, w_type)
+
+ @specialize.memo()
+ def _get_interplevel_cls(self, w_type):
+ if not hasattr(self, "_interplevel_classes"):
+ return None # before running initialize
+ return self._interplevel_classes.get(w_type, None)
diff --git a/pypy/objspace/std/test/test_obj.py b/pypy/objspace/std/test/test_obj.py
--- a/pypy/objspace/std/test/test_obj.py
+++ b/pypy/objspace/std/test/test_obj.py
@@ -102,3 +102,11 @@
def __repr__(self):
return 123456
assert A().__str__() == 123456
+
+def test_isinstance_shortcut():
+ from pypy.objspace.std import objspace
+ space = objspace.StdObjSpace()
+ w_a = space.wrap("a")
+ space.type = None
+ space.isinstance_w(w_a, space.w_str) # does not crash
+
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
@@ -102,7 +102,6 @@
'instancetypedef',
'terminator',
'_version_tag?',
- 'interplevel_cls',
]
# for config.objspace.std.getattributeshortcut
@@ -117,9 +116,6 @@
# of the __new__ is an instance of the type
w_bltin_new = None
- interplevel_cls = None # not None for prebuilt instances of
- # interpreter-level types
-
@dont_look_inside
def __init__(w_self, space, name, bases_w, dict_w,
overridetypedef=None):
More information about the pypy-commit
mailing list