| OLD | NEW |
| 1 # Copyright 2017 The Chromium Authors. All rights reserved. | 1 # Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 """Methods for converting model objects to human-readable formats.""" | 4 """Methods for converting model objects to human-readable formats.""" |
| 5 | 5 |
| 6 import datetime | 6 import datetime |
| 7 import itertools | 7 import itertools |
| 8 import time | 8 import time |
| 9 | 9 |
| 10 import models | 10 import models |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 return self._DescribeSymbolDiff(obj) | 213 return self._DescribeSymbolDiff(obj) |
| 214 if isinstance(obj, models.SymbolGroup): | 214 if isinstance(obj, models.SymbolGroup): |
| 215 return self._DescribeSymbolGroup(obj) | 215 return self._DescribeSymbolGroup(obj) |
| 216 if isinstance(obj, models.Symbol): | 216 if isinstance(obj, models.Symbol): |
| 217 return self._DescribeSymbol(obj) | 217 return self._DescribeSymbol(obj) |
| 218 return (repr(obj),) | 218 return (repr(obj),) |
| 219 | 219 |
| 220 | 220 |
| 221 def DescribeSizeInfoCoverage(size_info): | 221 def DescribeSizeInfoCoverage(size_info): |
| 222 """Yields lines describing how accurate |size_info| is.""" | 222 """Yields lines describing how accurate |size_info| is.""" |
| 223 symbols = models.SymbolGroup(size_info.raw_symbols) | |
| 224 for section in models.SECTION_TO_SECTION_NAME: | 223 for section in models.SECTION_TO_SECTION_NAME: |
| 225 if section == 'd': | 224 if section == 'd': |
| 226 expected_size = sum(v for k, v in size_info.section_sizes.iteritems() | 225 expected_size = sum(v for k, v in size_info.section_sizes.iteritems() |
| 227 if k.startswith('.data')) | 226 if k.startswith('.data')) |
| 228 else: | 227 else: |
| 229 expected_size = size_info.section_sizes[ | 228 expected_size = size_info.section_sizes[ |
| 230 models.SECTION_TO_SECTION_NAME[section]] | 229 models.SECTION_TO_SECTION_NAME[section]] |
| 231 | 230 |
| 232 def one_stat(group): | 231 def one_stat(group): |
| 233 template = ('Section {}: has {:.1%} of {} bytes accounted for from ' | 232 template = ('Section {}: has {:.1%} of {} bytes accounted for from ' |
| 234 '{} symbols. {} bytes are unaccounted for.') | 233 '{} symbols. {} bytes are unaccounted for.') |
| 235 actual_size = group.size | 234 actual_size = group.size |
| 236 size_percent = float(actual_size) / expected_size | 235 size_percent = float(actual_size) / expected_size |
| 237 return template.format(section, size_percent, actual_size, len(group), | 236 return template.format(section, size_percent, actual_size, len(group), |
| 238 expected_size - actual_size) | 237 expected_size - actual_size) |
| 239 | 238 |
| 240 in_section = symbols.WhereInSection(section) | 239 in_section = size_info.symbols.WhereInSection(section) |
| 241 yield one_stat(in_section) | 240 yield one_stat(in_section) |
| 242 yield '* Padding accounts for {} bytes ({:.1%})'.format( | 241 yield '* Padding accounts for {} bytes ({:.1%})'.format( |
| 243 in_section.padding, float(in_section.padding) / in_section.size) | 242 in_section.padding, float(in_section.padding) / in_section.size) |
| 244 | 243 |
| 245 aliased_symbols = in_section.Filter(lambda s: s.aliases) | 244 aliased_symbols = in_section.Filter(lambda s: s.aliases) |
| 246 if len(aliased_symbols): | 245 if len(aliased_symbols): |
| 247 uniques = sum(1 for s in aliased_symbols.IterUniqueSymbols()) | 246 uniques = sum(1 for s in aliased_symbols.IterUniqueSymbols()) |
| 248 yield '* Contains {} aliases, mapped to {} addresses ({} bytes)'.format( | 247 yield '* Contains {} aliases, mapped to {} addresses ({} bytes)'.format( |
| 249 len(aliased_symbols), uniques, aliased_symbols.size) | 248 len(aliased_symbols), uniques, aliased_symbols.size) |
| 250 else: | 249 else: |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 | 291 |
| 293 def GenerateLines(obj, verbose=False, recursive=False): | 292 def GenerateLines(obj, verbose=False, recursive=False): |
| 294 """Returns an iterable of lines (without \n) that describes |obj|.""" | 293 """Returns an iterable of lines (without \n) that describes |obj|.""" |
| 295 return Describer(verbose=verbose, recursive=recursive).GenerateLines(obj) | 294 return Describer(verbose=verbose, recursive=recursive).GenerateLines(obj) |
| 296 | 295 |
| 297 | 296 |
| 298 def WriteLines(lines, func): | 297 def WriteLines(lines, func): |
| 299 for l in lines: | 298 for l in lines: |
| 300 func(l) | 299 func(l) |
| 301 func('\n') | 300 func('\n') |
| OLD | NEW |