| Index: src/startup-data-util.cc
|
| diff --git a/src/startup-data-util.cc b/src/startup-data-util.cc
|
| index 1b2f7ed7e95129a288777d19709f2c1e84af9dde..92c4b5b3e9820dc9124380bf9a162c263e824604 100644
|
| --- a/src/startup-data-util.cc
|
| +++ b/src/startup-data-util.cc
|
| @@ -8,66 +8,41 @@
|
| #include <string.h>
|
|
|
| #include "src/base/logging.h"
|
| +#include "src/base/platform/platform.h"
|
|
|
|
|
| namespace v8 {
|
| +namespace internal {
|
|
|
| #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"));
|
| +namespace {
|
|
|
| - free(natives);
|
| - free(snapshot);
|
| - }
|
| -}
|
| +v8::StartupData g_natives;
|
| +v8::StartupData g_snapshot;
|
|
|
|
|
| -StartupDataHandler::~StartupDataHandler() {
|
| - delete[] natives_.data;
|
| - delete[] snapshot_.data;
|
| +void ClearStartupData(v8::StartupData* data) {
|
| + data->data = nullptr;
|
| + data->raw_size = 0;
|
| }
|
|
|
|
|
| -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 = static_cast<int>(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 DeleteStartupData(v8::StartupData* data) {
|
| + delete[] data->data;
|
| + ClearStartupData(data);
|
| }
|
|
|
|
|
| -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 FreeStartupData() {
|
| + DeleteStartupData(&g_natives);
|
| + DeleteStartupData(&g_snapshot);
|
| }
|
|
|
|
|
| -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;
|
| +void Load(const char* blob_file, v8::StartupData* startup_data,
|
| + void (*setter_fn)(v8::StartupData*)) {
|
| + ClearStartupData(startup_data);
|
|
|
| if (!blob_file) return;
|
|
|
| @@ -86,6 +61,57 @@ void StartupDataHandler::Load(const char* blob_file,
|
| if (startup_data->raw_size == read_size) (*setter_fn)(startup_data);
|
| }
|
|
|
| +
|
| +void LoadFromFiles(const char* natives_blob, const char* snapshot_blob) {
|
| + Load(natives_blob, &g_natives, v8::V8::SetNativesDataBlob);
|
| + Load(snapshot_blob, &g_snapshot, v8::V8::SetSnapshotDataBlob);
|
| +
|
| + atexit(&FreeStartupData);
|
| +}
|
| +
|
| +
|
| +char* RelativePath(char** buffer, const char* exec_path, const char* name) {
|
| + DCHECK(exec_path);
|
| + int path_separator = static_cast<int>(strlen(exec_path)) - 1;
|
| + while (path_separator >= 0 &&
|
| + !base::OS::isDirectorySeparator(exec_path[path_separator])) {
|
| + path_separator--;
|
| + }
|
| + if (path_separator >= 0) {
|
| + int name_length = static_cast<int>(strlen(name));
|
| + *buffer =
|
| + reinterpret_cast<char*>(calloc(path_separator + name_length + 2, 1));
|
| + *buffer[0] = '\0';
|
| + strncat(*buffer, exec_path, path_separator + 1);
|
| + strncat(*buffer, name, name_length);
|
| + } else {
|
| + *buffer = strdup(name);
|
| + }
|
| + return *buffer;
|
| +}
|
| +
|
| +} // namespace
|
| #endif // V8_USE_EXTERNAL_STARTUP_DATA
|
|
|
| +
|
| +void InitializeExternalStartupData(const char* directory_path) {
|
| +#ifdef V8_USE_EXTERNAL_STARTUP_DATA
|
| + char* natives;
|
| + char* snapshot;
|
| + LoadFromFiles(RelativePath(&natives, directory_path, "natives_blob.bin"),
|
| + RelativePath(&snapshot, directory_path, "snapshot_blob.bin"));
|
| + free(natives);
|
| + free(snapshot);
|
| +#endif // V8_USE_EXTERNAL_STARTUP_DATA
|
| +}
|
| +
|
| +
|
| +void InitializeExternalStartupData(const char* natives_blob,
|
| + const char* snapshot_blob) {
|
| +#ifdef V8_USE_EXTERNAL_STARTUP_DATA
|
| + LoadFromFiles(natives_blob, snapshot_blob);
|
| +#endif // V8_USE_EXTERNAL_STARTUP_DATA
|
| +}
|
| +
|
| +} // namespace internal
|
| } // namespace v8
|
|
|