| 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 | 4 |
| 5 """An interactive console for looking analyzing .size files.""" | 5 """An interactive console for looking analyzing .size files.""" |
| 6 | 6 |
| 7 import argparse | 7 import argparse |
| 8 import atexit | 8 import atexit |
| 9 import code | 9 import code |
| 10 import contextlib | 10 import contextlib |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 cls._readline_initialized = True | 199 cls._readline_initialized = True |
| 200 # Without initializing readline, arrow keys don't even work! | 200 # Without initializing readline, arrow keys don't even work! |
| 201 readline.parse_and_bind('tab: complete') | 201 readline.parse_and_bind('tab: complete') |
| 202 history_file = os.path.join(os.path.expanduser('~'), | 202 history_file = os.path.join(os.path.expanduser('~'), |
| 203 '.binary_size_query_history') | 203 '.binary_size_query_history') |
| 204 if os.path.exists(history_file): | 204 if os.path.exists(history_file): |
| 205 readline.read_history_file(history_file) | 205 readline.read_history_file(history_file) |
| 206 atexit.register(lambda: readline.write_history_file(history_file)) | 206 atexit.register(lambda: readline.write_history_file(history_file)) |
| 207 | 207 |
| 208 def Eval(self, query): | 208 def Eval(self, query): |
| 209 eval_result = eval(query, self._variables) | 209 exec query in self._variables |
| 210 if eval_result: | |
| 211 self._PrintFunc(eval_result) | |
| 212 | 210 |
| 213 def GoInteractive(self): | 211 def GoInteractive(self): |
| 214 _Session._InitReadline() | 212 _Session._InitReadline() |
| 215 code.InteractiveConsole(self._variables).interact(self._CreateBanner()) | 213 code.InteractiveConsole(self._variables).interact(self._CreateBanner()) |
| 216 | 214 |
| 217 | 215 |
| 218 def AddArguments(parser): | 216 def AddArguments(parser): |
| 219 parser.add_argument( | 217 parser.add_argument( |
| 220 'inputs', nargs='+', | 218 'inputs', nargs='+', |
| 221 help='Input .size files to load. For a single file, it will be mapped to ' | 219 help='Input .size files to load. For a single file, it will be mapped to ' |
| 222 'the variable "size_info". For multiple inputs, the names will be ' | 220 'the variable "size_info". For multiple inputs, the names will be ' |
| 223 'size_info1, size_info2, etc.') | 221 'size_info1, size_info2, etc.') |
| 224 parser.add_argument( | 222 parser.add_argument('--query', |
| 225 '--query', help='Print the result of the given snippet. Example: ' | 223 help='Execute the given snippet. ' |
| 226 'size_info.symbols.WhereInSection("d")' | 224 'Example: Print(size_info)') |
| 227 '.WhereBiggerThan(100)') | |
| 228 parser.add_argument('--tool-prefix', default='', | 225 parser.add_argument('--tool-prefix', default='', |
| 229 help='Path prefix for objdump. Required only for ' | 226 help='Path prefix for objdump. Required only for ' |
| 230 'Disassemble().') | 227 'Disassemble().') |
| 231 parser.add_argument('--output-directory', | 228 parser.add_argument('--output-directory', |
| 232 help='Path to the root build directory. Used only for ' | 229 help='Path to the root build directory. Used only for ' |
| 233 'Disassemble().') | 230 'Disassemble().') |
| 234 | 231 |
| 235 | 232 |
| 236 def Run(args, parser): | 233 def Run(args, parser): |
| 237 for path in args.inputs: | 234 for path in args.inputs: |
| 238 if not path.endswith('.size'): | 235 if not path.endswith('.size'): |
| 239 parser.error('All inputs must end with ".size"') | 236 parser.error('All inputs must end with ".size"') |
| 240 | 237 |
| 241 size_infos = [archive.LoadAndPostProcessSizeInfo(p) for p in args.inputs] | 238 size_infos = [archive.LoadAndPostProcessSizeInfo(p) for p in args.inputs] |
| 242 lazy_paths = paths.LazyPaths(args=args, input_file=args.inputs[0]) | 239 lazy_paths = paths.LazyPaths(tool_prefix=args.tool_prefix, |
| 240 output_directory=args.output_directory, |
| 241 any_path_within_output_directory=args.inputs[0]) |
| 243 session = _Session(size_infos, lazy_paths) | 242 session = _Session(size_infos, lazy_paths) |
| 244 | 243 |
| 245 if args.query: | 244 if args.query: |
| 246 logging.info('Running query from command-line.') | 245 logging.info('Running query from command-line.') |
| 247 session.Eval(args.query) | 246 session.Eval(args.query) |
| 248 else: | 247 else: |
| 249 logging.info('Entering interactive console.') | 248 logging.info('Entering interactive console.') |
| 250 session.GoInteractive() | 249 session.GoInteractive() |
| OLD | NEW |