Index: src/startup-data-util.cc |
diff --git a/src/startup-data-util.cc b/src/startup-data-util.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2000e3ccca5dda8a38f4d391c437dbcc0de5b3f7 |
--- /dev/null |
+++ b/src/startup-data-util.cc |
@@ -0,0 +1,91 @@ |
+// Copyright 2015 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. |
+ |
+#include "src/startup-data-util.h" |
+ |
+#include <stdlib.h> |
+#include <string.h> |
+ |
+#include "src/base/logging.h" |
+ |
+ |
+namespace v8 { |
+ |
+#ifdef V8_USE_EXTERNAL_STARTUP_DATA |
+ |
+StartupDataHandler::StartupDataHandler(const char* exec_path, |
+ const char* natives_blob, |
+ const char* snapshot_blob) { |
+ // If we have (at least one) explicitly given blob, use those. |
+ // If not, use the default blob locations next to the d8 binary. |
+ if (natives_blob || snapshot_blob) { |
+ LoadFromFiles(natives_blob, snapshot_blob); |
+ } else { |
+ char* natives; |
+ char* snapshot; |
+ LoadFromFiles(RelativePath(&natives, exec_path, "natives_blob.bin"), |
+ RelativePath(&snapshot, exec_path, "snapshot_blob.bin")); |
+ |
+ free(natives); |
+ free(snapshot); |
+ } |
+} |
+ |
+ |
+StartupDataHandler::~StartupDataHandler() { |
+ delete[] natives_.data; |
+ delete[] snapshot_.data; |
+} |
+ |
+ |
+char* StartupDataHandler::RelativePath(char** buffer, const char* exec_path, |
+ const char* name) { |
+ DCHECK(exec_path); |
+ const char* last_slash = strrchr(exec_path, '/'); |
+ if (last_slash) { |
+ int after_slash = last_slash - exec_path + 1; |
+ int name_length = static_cast<int>(strlen(name)); |
+ *buffer = reinterpret_cast<char*>(calloc(after_slash + name_length + 1, 1)); |
+ strncpy(*buffer, exec_path, after_slash); |
+ strncat(*buffer, name, name_length); |
+ } else { |
+ *buffer = strdup(name); |
+ } |
+ return *buffer; |
+} |
+ |
+ |
+void StartupDataHandler::LoadFromFiles(const char* natives_blob, |
+ const char* snapshot_blob) { |
+ Load(natives_blob, &natives_, v8::V8::SetNativesDataBlob); |
+ Load(snapshot_blob, &snapshot_, v8::V8::SetSnapshotDataBlob); |
+} |
+ |
+ |
+void StartupDataHandler::Load(const char* blob_file, |
+ v8::StartupData* startup_data, |
+ void (*setter_fn)(v8::StartupData*)) { |
+ startup_data->data = NULL; |
+ startup_data->raw_size = 0; |
+ |
+ if (!blob_file) return; |
+ |
+ FILE* file = fopen(blob_file, "rb"); |
+ if (!file) return; |
+ |
+ fseek(file, 0, SEEK_END); |
+ startup_data->raw_size = ftell(file); |
+ rewind(file); |
+ |
+ startup_data->data = new char[startup_data->raw_size]; |
+ int read_size = static_cast<int>(fread(const_cast<char*>(startup_data->data), |
+ 1, startup_data->raw_size, file)); |
+ fclose(file); |
+ |
+ if (startup_data->raw_size == read_size) (*setter_fn)(startup_data); |
+} |
+ |
+#endif // V8_USE_EXTERNAL_STARTUP_DATA |
+ |
+} // namespace v8 |