[pypy-commit] pypy ClassRepr: store repr and extra_access_sets on the ClassDef object

rlamy noreply at buildbot.pypy.org
Tue Oct 14 01:06:33 CEST 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: ClassRepr
Changeset: r73935:189f16644e3a
Date: 2014-10-14 00:04 +0100
http://bitbucket.org/pypy/pypy/changeset/189f16644e3a/

Log:	store repr and extra_access_sets on the ClassDef object

diff --git a/rpython/annotator/classdef.py b/rpython/annotator/classdef.py
--- a/rpython/annotator/classdef.py
+++ b/rpython/annotator/classdef.py
@@ -154,6 +154,8 @@
         self.subdefs = []
         self.attr_sources = {}   # {name: list-of-sources}
         self.read_locations_of__class__ = {}
+        self.repr = None
+        self.extra_access_sets = {}
 
         if classdesc.basedesc:
             self.basedef = classdesc.basedesc.getuniqueclassdef()
diff --git a/rpython/rtyper/normalizecalls.py b/rpython/rtyper/normalizecalls.py
--- a/rpython/rtyper/normalizecalls.py
+++ b/rpython/rtyper/normalizecalls.py
@@ -236,9 +236,8 @@
                 if commonbase is None:
                     raise TyperError("reading attribute %r: no common base "
                                      "class for %r" % (attrname, descs.keys()))
-            extra_access_sets = rtyper.class_pbc_attributes.setdefault(
-                commonbase, {})
-            if commonbase in rtyper.class_reprs:
+            extra_access_sets = commonbase.extra_access_sets
+            if commonbase.repr is not None:
                 assert access_set in extra_access_sets # minimal sanity check
                 continue
             access_set.commonbase = commonbase
diff --git a/rpython/rtyper/rclass.py b/rpython/rtyper/rclass.py
--- a/rpython/rtyper/rclass.py
+++ b/rpython/rtyper/rclass.py
@@ -65,11 +65,9 @@
 def getclassrepr(rtyper, classdef):
     if classdef is None:
         return rtyper.rootclass_repr
-    try:
-        result = rtyper.class_reprs[classdef]
-    except KeyError:
-        result = ClassRepr(rtyper, classdef)
-        rtyper.class_reprs[classdef] = result
+    result = classdef.repr
+    if result is None:
+        result = classdef.repr = ClassRepr(rtyper, classdef)
         rtyper.add_pendingsetup(result)
     return result
 
@@ -266,8 +264,7 @@
                 clsfields[name] = mangled_name, r
                 llfields.append((mangled_name, r.lowleveltype))
         # attributes showing up in getattrs done on the class as a PBC
-        extra_access_sets = self.rtyper.class_pbc_attributes.get(
-            self.classdef, {})
+        extra_access_sets = self.classdef.extra_access_sets
         for access_set, (attr, counter) in extra_access_sets.items():
             r = self.rtyper.getrepr(access_set.s_value)
             mangled_name = mangle('pbc%d' % counter, attr)
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -44,7 +44,6 @@
         self._reprs_must_call_setup = []
         self._seen_reprs_must_call_setup = {}
         self._dict_traits = {}
-        self.class_reprs = {}
         self.rootclass_repr = RootClassRepr(self)
         self.rootclass_repr.setup()
         self.instance_reprs = {}
@@ -54,7 +53,6 @@
         self.wrapper_context = None # or add an extra arg to convertvar?
         self.classdef_to_pytypeobject = {}
         self.concrete_calltables = {}
-        self.class_pbc_attributes = {}
         self.cache_dummy_values = {}
         self.lltype2vtable = {}
         self.typererrors = []


More information about the pypy-commit mailing list