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

Unified Diff: tools/binary_size/libsupersize/models.py

Issue 2884283002: supersize: Fix diff logic for changed vs unchanged of groups (Closed)
Patch Set: Created 3 years, 7 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
Index: tools/binary_size/libsupersize/models.py
diff --git a/tools/binary_size/libsupersize/models.py b/tools/binary_size/libsupersize/models.py
index 94259f0533e4e95107cc776320f1a8b83e7bc8a6..281e335f3c3ee76d26208e2286d713e34dcd5b31 100644
--- a/tools/binary_size/libsupersize/models.py
+++ b/tools/binary_size/libsupersize/models.py
@@ -59,6 +59,11 @@ FLAG_REL = 8
FLAG_REL_LOCAL = 16
FLAG_GENERATED_SOURCE = 32
+DIFF_STATUS_UNCHANGED = 0
+DIFF_STATUS_CHANGED = 1
+DIFF_STATUS_ADDED = 2
+DIFF_STATUS_REMOVED = 3
+
class SizeInfo(object):
"""Represents all size information for a single binary.
@@ -299,7 +304,7 @@ class SymbolGroup(BaseSymbol):
return len(self._symbols)
def __eq__(self, other):
- return self._symbols == other._symbols
+ return isinstance(other, SymbolGroup) and self._symbols == other._symbols
def __getitem__(self, key):
"""|key| can be an index or an address.
@@ -649,11 +654,15 @@ class SymbolDiff(SymbolGroup):
__slots__ = (
'_added_ids',
'_removed_ids',
+ '_diff_status',
+ '_changed_count',
)
def __init__(self, added, removed, similar):
self._added_ids = set(id(s) for s in added)
self._removed_ids = set(id(s) for s in removed)
+ self._diff_status = DIFF_STATUS_CHANGED
+ self._changed_count = None
symbols = []
symbols.extend(added)
symbols.extend(removed)
@@ -668,38 +677,28 @@ class SymbolDiff(SymbolGroup):
def _CreateTransformed(self, symbols, filtered_symbols=None, full_name=None,
template_name=None, name=None, section_name=None,
is_sorted=None):
- # Printing sorts, so short-circuit the same symbols case.
- if len(symbols) == len(self._symbols):
- new_added_ids = self._added_ids
- new_removed_ids = self._removed_ids
- else:
- old_added_ids = self._added_ids
- old_removed_ids = self._removed_ids
-
- def get_status(sym):
- obj_id = id(sym)
- if obj_id in old_added_ids:
- return 0
- if obj_id in old_removed_ids:
- return 1
- if sym.IsGroup():
- first_status = get_status(sym[0])
- if all(get_status(s) == first_status for s in sym[1:]):
- return first_status
- return 2
-
- new_added_ids = set()
- new_removed_ids = set()
+ new_added_ids = set()
+ new_removed_ids = set()
+ group_diff_status = DIFF_STATUS_UNCHANGED
+ changed_count = 0
+ if symbols:
+ group_diff_status = self.DiffStatus(symbols[0])
for sym in symbols:
- status = get_status(sym)
- if status == 0:
+ status = self.DiffStatus(sym)
+ if status != group_diff_status:
+ group_diff_status = DIFF_STATUS_CHANGED
+ if status == DIFF_STATUS_ADDED:
new_added_ids.add(id(sym))
- elif status == 1:
+ elif status == DIFF_STATUS_REMOVED:
new_removed_ids.add(id(sym))
+ elif status == DIFF_STATUS_CHANGED:
+ changed_count += 1
ret = SymbolDiff.__new__(SymbolDiff)
ret._added_ids = new_added_ids
ret._removed_ids = new_removed_ids
+ ret._diff_status = group_diff_status
+ ret._changed_count = changed_count
super(SymbolDiff, ret).__init__(
symbols, filtered_symbols=filtered_symbols, full_name=full_name,
template_name=template_name, name=name, section_name=section_name,
@@ -716,25 +715,42 @@ class SymbolDiff(SymbolGroup):
@property
def changed_count(self):
- not_changed = self.unchanged_count + self.added_count + self.removed_count
- return len(self) - not_changed
+ if self._changed_count is None:
+ self._changed_count = sum(1 for s in self if self.IsChanged(s))
+ return self._changed_count
@property
def unchanged_count(self):
- return sum(1 for s in self if self.IsSimilar(s) and s.size == 0)
+ return (len(self) - self.changed_count - self.added_count -
+ self.removed_count)
+
+ def DiffStatus(self, sym):
+ # Groups store their own status, computed during _CreateTransformed().
+ if sym.IsGroup():
+ return sym._diff_status
+ sym_id = id(sym)
+ if sym_id in self._added_ids:
+ return DIFF_STATUS_ADDED
+ if sym_id in self._removed_ids:
+ return DIFF_STATUS_REMOVED
+ # 0 --> unchanged
+ # 1 --> changed
+ return int(sym.size != 0)
+
+ def IsUnchanged(self, sym):
+ return self.DiffStatus(sym) == DIFF_STATUS_UNCHANGED
+
+ def IsChanged(self, sym):
+ return self.DiffStatus(sym) == DIFF_STATUS_CHANGED
def IsAdded(self, sym):
- return id(sym) in self._added_ids
-
- def IsSimilar(self, sym):
- key = id(sym)
- return key not in self._added_ids and key not in self._removed_ids
+ return self.DiffStatus(sym) == DIFF_STATUS_ADDED
def IsRemoved(self, sym):
- return id(sym) in self._removed_ids
+ return self.DiffStatus(sym) == DIFF_STATUS_REMOVED
def WhereNotUnchanged(self):
- return self.Filter(lambda s: not self.IsSimilar(s) or s.size)
+ return self.Filter(lambda s: not self.IsUnchanged(s))
def _ExtractPrefixBeforeSeparator(string, separator, count):
« no previous file with comments | « tools/binary_size/libsupersize/integration_test.py ('k') | tools/binary_size/libsupersize/testdata/Console.golden » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698