Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r79468:af9d90e513b9
Date: 2015-09-05 16:00 +0200
http://bitbucket.org/pypy/pypy/changeset/af9d90e513b9/

Log:    Sort the vtable fields by decreasing size, like we do for the
        instance fields.

diff --git a/rpython/rtyper/rclass.py b/rpython/rtyper/rclass.py
--- a/rpython/rtyper/rclass.py
+++ b/rpython/rtyper/rclass.py
@@ -251,9 +251,7 @@
         allmethods = {}
         # class attributes
         llfields = []
-        attrs = self.classdef.attrs.items()
-        attrs.sort()
-        for name, attrdef in attrs:
+        for name, attrdef in self.classdef.attrs.items():
             if attrdef.readonly:
                 s_value = attrdef.s_value
                 s_unboundmethod = self.prepare_method(s_value)
@@ -271,6 +269,8 @@
             mangled_name = mangle('pbc%d' % counter, attr)
             pbcfields[access_set, attr] = mangled_name, r
             llfields.append((mangled_name, r.lowleveltype))
+        llfields.sort()
+        llfields.sort(key=attr_reverse_size)
         #
         self.rbase = getclassrepr(self.rtyper, self.classdef.basedef)
         self.rbase.setup()
@@ -492,19 +492,7 @@
                     fields[name] = mangled_name, r
                     myllfields.append((mangled_name, r.lowleveltype))
 
-            # Sort the instance attributes by decreasing "likely size",
-            # as reported by rffi.sizeof(), to minimize padding holes in C.
-            # Fields of the same size are sorted by name (by attrs.sort()
-            # above) just to minimize randomness.
-            def keysize((_, T)):
-                if T is lltype.Void:
-                    return None
-                from rpython.rtyper.lltypesystem.rffi import sizeof
-                try:
-                    return -sizeof(T)
-                except StandardError:
-                    return None
-            myllfields.sort(key=keysize)
+            myllfields.sort(key=attr_reverse_size)
             if llfields is None:
                 llfields = myllfields
             else:
@@ -1072,6 +1060,19 @@
                              (lltype.typeOf(widest), name))
     return default
 
+def attr_reverse_size((_, T)):
+    # This is used to sort the instance or class attributes by decreasing
+    # "likely size", as reported by rffi.sizeof(), to minimize padding
+    # holes in C.  Fields should first be sorted by name, just to minimize
+    # randomness, and then (stably) sorted by 'attr_reverse_size'.
+    if T is lltype.Void:
+        return None
+    from rpython.rtyper.lltypesystem.rffi import sizeof
+    try:
+        return -sizeof(T)
+    except StandardError:
+        return None
+
 
 # ____________________________________________________________
 #
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to