// 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 #include #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(strlen(name)); *buffer = reinterpret_cast(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(fread(const_cast(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