|  | #!/usr/bin/env python | 
|  | # Copyright 2016 the V8 project authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | # This script executes dumpcpp.js, collects all dumped C++ symbols, | 
|  | # and merges them back into v8 log. | 
|  |  | 
|  | import os | 
|  | import platform | 
|  | import re | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | def is_file_executable(fPath): | 
|  | return os.path.isfile(fPath) and os.access(fPath, os.X_OK) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | JS_FILES = ['splaytree.js', 'codemap.js', 'csvparser.js', 'consarray.js', | 
|  | 'profile.js', 'logreader.js', 'arguments.js', 'tickprocessor.js', | 
|  | 'SourceMap.js', 'dumpcpp.js', 'dumpcpp-driver.js'] | 
|  | tools_path = os.path.dirname(os.path.realpath(__file__)) | 
|  | on_windows = platform.system() == 'Windows' | 
|  | JS_FILES = [os.path.join(tools_path, f) for f in JS_FILES] | 
|  |  | 
|  | args = [] | 
|  | log_file = 'v8.log' | 
|  | debug = False | 
|  | for arg in sys.argv[1:]: | 
|  | if arg == '--debug': | 
|  | debug = True | 
|  | continue | 
|  | args.append(arg) | 
|  | if not arg.startswith('-'): | 
|  | log_file = arg | 
|  |  | 
|  | if on_windows: | 
|  | args.append('--windows') | 
|  |  | 
|  | with open(log_file, 'r') as f: | 
|  | lines = f.readlines() | 
|  |  | 
|  | d8_line = re.search(',\"(.*d8)', ''.join(lines)) | 
|  | if d8_line: | 
|  | d8_exec = d8_line.group(1) | 
|  | if not is_file_executable(d8_exec): | 
|  | print 'd8 binary path found in {} is not executable.'.format(log_file) | 
|  | sys.exit(-1) | 
|  | else: | 
|  | print 'No d8 binary path found in {}.'.format(log_file) | 
|  | sys.exit(-1) | 
|  |  | 
|  | args = [d8_exec] + JS_FILES + ['--'] + args | 
|  |  | 
|  | with open(log_file) as f: | 
|  | sp = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, | 
|  | stdin=f) | 
|  | out, err = sp.communicate() | 
|  | if debug: | 
|  | print err | 
|  | if sp.returncode != 0: | 
|  | print out | 
|  | exit(-1) | 
|  |  | 
|  | if on_windows and out: | 
|  | out = re.sub('\r+\n', '\n', out) | 
|  |  | 
|  | is_written = not bool(out) | 
|  | with open(log_file, 'w') as f: | 
|  | for line in lines: | 
|  | if not is_written and line.startswith('tick'): | 
|  | f.write(out) | 
|  | is_written = True | 
|  | f.write(line) |