|  | #!/usr/bin/env python | 
|  | # | 
|  | # Copyright 2015 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """Fingerprints the V8 snapshot blob files. | 
|  |  | 
|  | Constructs a SHA256 fingerprint of the V8 natives and snapshot blob files and | 
|  | creates a .cc file which includes these fingerprint as variables. | 
|  | """ | 
|  |  | 
|  | import hashlib | 
|  | import optparse | 
|  | import os | 
|  | import sys | 
|  |  | 
|  | _HEADER = """// Copyright 2015 The Chromium 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 file was generated by fingerprint_v8_snapshot.py. | 
|  |  | 
|  | namespace gin { | 
|  | """ | 
|  |  | 
|  | _FOOTER = """ | 
|  | }  // namespace gin | 
|  | """ | 
|  |  | 
|  |  | 
|  | def FingerprintFile(file_path): | 
|  | input_file = open(file_path, 'rb') | 
|  | sha256 = hashlib.sha256() | 
|  | while True: | 
|  | block = input_file.read(sha256.block_size) | 
|  | if not block: | 
|  | break | 
|  | sha256.update(block) | 
|  | return sha256.digest() | 
|  |  | 
|  |  | 
|  | def WriteFingerprint(output_file, variable_name, fingerprint): | 
|  | output_file.write('\nextern const unsigned char %s[] = { ' % variable_name) | 
|  | for byte in fingerprint: | 
|  | output_file.write(str(ord(byte)) + ', ') | 
|  | output_file.write('};\n') | 
|  |  | 
|  |  | 
|  | def WriteOutputFile(natives_fingerprint, | 
|  | snapshot_fingerprint, | 
|  | output_file_path): | 
|  | output_dir_path = os.path.dirname(output_file_path) | 
|  | if not os.path.exists(output_dir_path): | 
|  | os.makedirs(output_dir_path) | 
|  | output_file = open(output_file_path, 'w') | 
|  |  | 
|  | output_file.write(_HEADER) | 
|  | WriteFingerprint(output_file, 'g_natives_fingerprint', natives_fingerprint) | 
|  | output_file.write('\n') | 
|  | WriteFingerprint(output_file, 'g_snapshot_fingerprint', snapshot_fingerprint) | 
|  | output_file.write(_FOOTER) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = optparse.OptionParser() | 
|  |  | 
|  | parser.add_option('--snapshot_file', | 
|  | help='The input V8 snapshot blob file path.') | 
|  | parser.add_option('--natives_file', | 
|  | help='The input V8 natives blob file path.') | 
|  | parser.add_option('--output_file', | 
|  | help='The path for the output cc file which will be write.') | 
|  |  | 
|  | options, _ = parser.parse_args() | 
|  |  | 
|  | natives_fingerprint = FingerprintFile(options.natives_file) | 
|  | snapshot_fingerprint = FingerprintFile(options.snapshot_file) | 
|  | WriteOutputFile( | 
|  | natives_fingerprint, snapshot_fingerprint, options.output_file) | 
|  |  | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |