Author: Carl Friedrich Bolz <cfb...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit