summaryrefslogtreecommitdiffstats
path: root/gin/fingerprint
diff options
context:
space:
mode:
Diffstat (limited to 'gin/fingerprint')
-rw-r--r--gin/fingerprint/fingerprint_v8_snapshot.gypi47
-rwxr-xr-xgin/fingerprint/fingerprint_v8_snapshot.py86
2 files changed, 133 insertions, 0 deletions
diff --git a/gin/fingerprint/fingerprint_v8_snapshot.gypi b/gin/fingerprint/fingerprint_v8_snapshot.gypi
new file mode 100644
index 0000000..ede0de3
--- /dev/null
+++ b/gin/fingerprint/fingerprint_v8_snapshot.gypi
@@ -0,0 +1,47 @@
+# 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 is meant to be included into a target to provide a rule that
+# fingerprints the v8 snapshot and generates a .cc file which includes this
+# fingerprint.
+#
+# To use this, create a gyp target with the following form:
+# {
+# 'target_name': 'gin_v8_snapshot_fingerprint',
+# 'type': 'none',
+# 'variables': {
+# 'snapshot_file': 'snapshot blob file to be fingerprinted',
+# 'natives_file': 'natives blob file to be fingerprinted',
+# 'output_file': 'output .cc file to generate with fingerprints',
+# },
+# 'includes': [ '../gin/fingerprint/fingerprint_v8_snapshot.gypi' ],
+# },
+#
+
+{
+ 'conditions': [
+ ['v8_use_external_startup_data==1', {
+ 'actions': [
+ {
+ 'action_name': 'Generate V8 snapshot fingerprint',
+ 'message': 'Generating V8 snapshot fingerprint',
+ 'inputs': [
+ '<(DEPTH)/gin/fingerprint/fingerprint_v8_snapshot.py',
+ '<(snapshot_file)',
+ '<(natives_file)',
+ ],
+ 'outputs': [
+ '<(output_file)',
+ ],
+ 'action': [
+ 'python', '<(DEPTH)/gin/fingerprint/fingerprint_v8_snapshot.py',
+ '--snapshot_file=<(snapshot_file)',
+ '--natives_file=<(natives_file)',
+ '--output_file=<(output_file)',
+ ],
+ }
+ ],
+ }],
+ ],
+} \ No newline at end of file
diff --git a/gin/fingerprint/fingerprint_v8_snapshot.py b/gin/fingerprint/fingerprint_v8_snapshot.py
new file mode 100755
index 0000000..d1f7092
--- /dev/null
+++ b/gin/fingerprint/fingerprint_v8_snapshot.py
@@ -0,0 +1,86 @@
+#!/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())