mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 10:48:25 +00:00
f7a2ea5e06
Closes https://github.com/dart-lang/sdk/pull/50922 GitOrigin-RevId: 58fd7cfd5ef470a65a52ea28e0407244d853c917 Change-Id: I2e5a5ed991cb05270170a18b8f0169daa9eabdb7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/278537 Reviewed-by: Alexander Thomas <athom@google.com> Commit-Queue: Alexander Thomas <athom@google.com>
132 lines
3.7 KiB
Python
Executable file
132 lines
3.7 KiB
Python
Executable file
#!/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())
|