Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(442)

Unified Diff: third_party/WebKit/Source/build/scripts/make_computed_style_base.py

Issue 2844223002: Add heuristic to order non bit fields in ComputedStyleBase. (Closed)
Patch Set: Assert Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/build/scripts/make_computed_style_base.py
diff --git a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
index b52ab45c015cddf0ee10ad7f4a8b266460fa3d80..335d80dc9807e57418e540e975a77ce8f6ea12d5 100755
--- a/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
+++ b/third_party/WebKit/Source/build/scripts/make_computed_style_base.py
@@ -17,6 +17,22 @@ from name_utilities import (
from collections import defaultdict, OrderedDict
from itertools import chain
+# Heuristic ordering of types from largest to smallest, used to sort fields by their alignment sizes.
+# Specifying the exact alignment sizes for each type is impossible because it's platform specific,
+# so we define an ordering instead.
+# The ordering comes from the data obtained in:
+# https://codereview.chromium.org/2841413002
+# TODO(shend): Put alignment sizes into code form, rather than linking to a CL which may disappear.
+ALIGNMENT_ORDER = [
+ 'double',
+ 'FillLayer', 'BorderData', # Aligns like a void * (can be 32 or 64 bits)
+ 'LengthBox', 'Length', 'float',
+ 'StyleColor', 'Color', 'unsigned', 'int',
+ 'short',
+ 'char',
+ 'bool'
+]
+
# TODO(shend): Improve documentation and add docstrings.
@@ -272,14 +288,7 @@ def _create_fields(properties):
return fields
-def _reorder_fields(fields):
- """
- Returns a list of fields ordered to minimise padding.
- """
- # Separate out bit fields from non bit fields
- bit_fields = [field for field in fields if field.is_bit_field]
- non_bit_fields = [field for field in fields if not field.is_bit_field]
-
+def _reorder_bit_fields(bit_fields):
# Since fields cannot cross word boundaries, in order to minimize
# padding, group fields into buckets so that as many buckets as possible
# are exactly 32 bits. Although this greedy approach may not always
@@ -305,8 +314,28 @@ def _reorder_fields(fields):
if not added_to_bucket:
field_buckets.append([field])
+ return _flatten_list(field_buckets)
+
+
+def _reorder_non_bit_fields(non_bit_fields):
+ # A general rule of thumb is to sort members by their alignment requirement
+ # (from biggest aligned to smallest).
+ for field in non_bit_fields:
+ assert field.type_name in ALIGNMENT_ORDER, \
+ "Type {} has unknown alignment. Please update ALIGNMENT_ORDER to include it.".format(field.type_name)
+ return list(sorted(non_bit_fields, key=lambda f: ALIGNMENT_ORDER.index(f.type_name)))
+
+
+def _reorder_fields(fields):
+ """
+ Returns a list of fields ordered to minimise padding.
+ """
+ # Separate out bit fields from non bit fields
+ bit_fields = [field for field in fields if field.is_bit_field]
+ non_bit_fields = [field for field in fields if not field.is_bit_field]
+
# Non bit fields go first, then the bit fields.
- return list(non_bit_fields) + _flatten_list(field_buckets)
+ return _reorder_non_bit_fields(non_bit_fields) + _reorder_bit_fields(bit_fields)
class ComputedStyleBaseWriter(make_style_builder.StyleBuilderWriter):
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698