[pypy-commit] pypy mapdict-interp: Comments.

arigo noreply at buildbot.pypy.org
Tue May 17 17:29:19 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: mapdict-interp
Changeset: r44255:0eedad4896ba
Date: 2011-05-17 17:36 +0200
http://bitbucket.org/pypy/pypy/changeset/0eedad4896ba/

Log:	Comments.

diff --git a/pypy/objspace/std/callmethod.py b/pypy/objspace/std/callmethod.py
--- a/pypy/objspace/std/callmethod.py
+++ b/pypy/objspace/std/callmethod.py
@@ -51,6 +51,7 @@
             # this handles directly the common case
             #   module.function(args..)
             w_value = w_obj.getdictvalue(space, name)
+            # xxx we could also use the mapdict cache in that case, probably
         else:
             typ = type(w_descr)
             if typ is function.Function or typ is function.FunctionWithFixedCode:
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
@@ -762,19 +762,27 @@
             assert space.config.objspace.std.withmethodcache
             _, w_descr = w_type._pure_lookup_where_with_method_cache(
                 name, version_tag)
+            #
             selector = ("", INVALID)
             if w_descr is None:
-                selector = (name, DICT)   # common case: not shadowing anything
+                selector = (name, DICT) #common case: no such attr in the class
             elif isinstance(w_descr, TypeCell):
-                pass    # shadowing a TypeCell: give up
+                pass              # we have a TypeCell in the class: give up
+            elif space.is_data_descr(w_descr):
+                # we have a data descriptor, which means the dictionary value
+                # (if any) has no relevance.
+                from pypy.interpreter.typedef import Member
+                descr = space.interpclass_w(w_descr)
+                if isinstance(descr, Member):    # it is a slot -- easy case
+                    selector = ("slot", SLOTS_STARTING_FROM + descr.index)
             else:
-                if space.is_data_descr(w_descr):
-                    from pypy.interpreter.typedef import Member
-                    descr = space.interpclass_w(w_descr)
-                    if isinstance(descr, Member):    # a slot
-                        selector = ("slot", SLOTS_STARTING_FROM + descr.index)
-                else:
-                    selector = (name, DICT)   # shadowing a non-data descr
+                # There is a non-data descriptor in the class.  If there is
+                # also a dict attribute, use the latter, caching its position.
+                # If not, we loose.  We could do better in this case too,
+                # but we don't care too much; the common case of a method
+                # invocation is handled by LOOKUP_METHOD_xxx below.
+                selector = (name, DICT)
+            #
             if selector[1] != INVALID:
                 index = map.index(selector)
                 if index >= 0:
@@ -818,3 +826,7 @@
     if w_method is None or isinstance(w_method, TypeCell):
         return
     _fill_cache(pycode, nameindex, map, version_tag, -1, w_method)
+
+# XXX fix me: if a function contains a loop with both LOAD_ATTR and
+# XXX LOOKUP_METHOD on the same attribute name, it keeps trashing and
+# XXX rebuilding the cache


More information about the pypy-commit mailing list