|  | #!/usr/bin/env python3 | 
|  | # | 
|  | # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
|  | # for details. All rights reserved. Use of this source code is governed by a | 
|  | # BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | # Script to convert snapshot files to a C++ file which can be compiled and | 
|  | # linked together with VM binary. | 
|  |  | 
|  | import getopt | 
|  | import optparse | 
|  | import string | 
|  | import subprocess | 
|  | import sys | 
|  | import utils | 
|  |  | 
|  | HOST_OS = utils.GuessOS() | 
|  | HOST_CPUS = utils.GuessCpus() | 
|  |  | 
|  |  | 
|  | def BuildOptions(): | 
|  | result = optparse.OptionParser() | 
|  | result.add_option( | 
|  | "--vm_input_bin", | 
|  | action="store", | 
|  | type="string", | 
|  | help="input file name of the vm isolate snapshot in binary form") | 
|  | result.add_option( | 
|  | "--input_bin", | 
|  | action="store", | 
|  | type="string", | 
|  | help="input file name of the isolate snapshot in binary form") | 
|  | result.add_option( | 
|  | "--input_cc", | 
|  | action="store", | 
|  | type="string", | 
|  | help="input file name which contains the C buffer template") | 
|  | result.add_option( | 
|  | "--output", | 
|  | action="store", | 
|  | type="string", | 
|  | help="output file name into which snapshot in C buffer form is generated" | 
|  | ) | 
|  | result.add_option( | 
|  | "-v", | 
|  | "--verbose", | 
|  | help='Verbose output.', | 
|  | default=False, | 
|  | action="store_true") | 
|  | return result | 
|  |  | 
|  |  | 
|  | def ProcessOptions(options): | 
|  | if not options.vm_input_bin: | 
|  | sys.stderr.write('--vm_input_bin not specified\n') | 
|  | return False | 
|  | if not options.input_bin: | 
|  | sys.stderr.write('--input_bin not specified\n') | 
|  | return False | 
|  | if not options.input_cc: | 
|  | sys.stderr.write('--input_cc not specified\n') | 
|  | return False | 
|  | if not options.output: | 
|  | sys.stderr.write('--output not specified\n') | 
|  | return False | 
|  | return True | 
|  |  | 
|  |  | 
|  | def WriteBytesAsText(out, input_file): | 
|  | """Writes byte contents of the input_file into out file as text. | 
|  |  | 
|  | Output is formatted as a list of comma separated integer values - one value | 
|  | for each byte. | 
|  | """ | 
|  | with open(input_file, 'rb') as input: | 
|  | lineCounter = 0 | 
|  | line = ' ' | 
|  | for byte in input.read(): | 
|  | line += ' %d,' % ord(byte) | 
|  | lineCounter += 1 | 
|  | if lineCounter == 10: | 
|  | out.write(line + '\n') | 
|  | line = ' ' | 
|  | lineCounter = 0 | 
|  | if lineCounter != 0: | 
|  | out.write(line + '\n') | 
|  |  | 
|  |  | 
|  | def GenerateFileFromTemplate(output_file, input_cc_file, vm_isolate_input_file, | 
|  | isolate_input_file): | 
|  | """Generates C++ file based on a input_cc_file template and two binary files | 
|  |  | 
|  | Template is expected to have two %s placeholders which would be filled | 
|  | with binary contents of the given files each formatted as a comma separated | 
|  | list of integers. | 
|  | """ | 
|  | snapshot_cc_text = open(input_cc_file).read() | 
|  | chunks = snapshot_cc_text.split("%s") | 
|  | if len(chunks) != 3: | 
|  | raise Exception("Template %s should contain exactly two %%s occurrences" | 
|  | % input_cc_file) | 
|  |  | 
|  | with open(output_file, 'w') as out: | 
|  | out.write(chunks[0]) | 
|  | WriteBytesAsText(out, vm_isolate_input_file) | 
|  | out.write(chunks[1]) | 
|  | WriteBytesAsText(out, isolate_input_file) | 
|  | out.write(chunks[2]) | 
|  |  | 
|  |  | 
|  | def Main(): | 
|  | # Parse options. | 
|  | parser = BuildOptions() | 
|  | (options, args) = parser.parse_args() | 
|  | if not ProcessOptions(options): | 
|  | parser.print_help() | 
|  | return 1 | 
|  |  | 
|  | # If there are additional arguments, report error and exit. | 
|  | if args: | 
|  | parser.print_help() | 
|  | return 1 | 
|  |  | 
|  | GenerateFileFromTemplate(options.output, options.input_cc, | 
|  | options.vm_input_bin, options.input_bin) | 
|  |  | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(Main()) |