| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index ecd5101e5ef4b4d5c6f27489a4845758c641ebdb..8a90592d103a3cc0c94636bf0e4d67fce0090b51 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -38,6 +38,7 @@
|
| #include "global-handles.h"
|
| #include "heap-profiler.h"
|
| #include "messages.h"
|
| +#include "natives.h"
|
| #include "parser.h"
|
| #include "platform.h"
|
| #include "profile-generator-inl.h"
|
| @@ -311,6 +312,46 @@ static inline i::Isolate* EnterIsolateIfNeeded() {
|
| }
|
|
|
|
|
| +StartupDataDecompressor::StartupDataDecompressor()
|
| + : raw_data(i::NewArray<char*>(V8::GetCompressedStartupDataCount())) {
|
| + for (int i = 0; i < V8::GetCompressedStartupDataCount(); ++i) {
|
| + raw_data[i] = NULL;
|
| + }
|
| +}
|
| +
|
| +
|
| +StartupDataDecompressor::~StartupDataDecompressor() {
|
| + for (int i = 0; i < V8::GetCompressedStartupDataCount(); ++i) {
|
| + i::DeleteArray(raw_data[i]);
|
| + }
|
| + i::DeleteArray(raw_data);
|
| +}
|
| +
|
| +
|
| +int StartupDataDecompressor::Decompress() {
|
| + int compressed_data_count = V8::GetCompressedStartupDataCount();
|
| + StartupData* compressed_data =
|
| + i::NewArray<StartupData>(compressed_data_count);
|
| + V8::GetCompressedStartupData(compressed_data);
|
| + for (int i = 0; i < compressed_data_count; ++i) {
|
| + char* decompressed = raw_data[i] =
|
| + i::NewArray<char>(compressed_data[i].raw_size);
|
| + if (compressed_data[i].compressed_size != 0) {
|
| + int result = DecompressData(decompressed,
|
| + &compressed_data[i].raw_size,
|
| + compressed_data[i].data,
|
| + compressed_data[i].compressed_size);
|
| + if (result != 0) return result;
|
| + } else {
|
| + ASSERT_EQ(0, compressed_data[i].raw_size);
|
| + }
|
| + compressed_data[i].data = decompressed;
|
| + }
|
| + V8::SetDecompressedStartupData(compressed_data);
|
| + return 0;
|
| +}
|
| +
|
| +
|
| StartupData::CompressionAlgorithm V8::GetCompressedStartupDataAlgorithm() {
|
| #ifdef COMPRESS_STARTUP_DATA_BZ2
|
| return StartupData::kBZip2;
|
| @@ -323,6 +364,8 @@ StartupData::CompressionAlgorithm V8::GetCompressedStartupDataAlgorithm() {
|
| enum CompressedStartupDataItems {
|
| kSnapshot = 0,
|
| kSnapshotContext,
|
| + kLibraries,
|
| + kExperimentalLibraries,
|
| kCompressedStartupDataCount
|
| };
|
|
|
| @@ -347,6 +390,21 @@ void V8::GetCompressedStartupData(StartupData* compressed_data) {
|
| compressed_data[kSnapshotContext].compressed_size =
|
| i::Snapshot::context_size();
|
| compressed_data[kSnapshotContext].raw_size = i::Snapshot::context_raw_size();
|
| +
|
| + i::Vector<const i::byte> libraries_source = i::Natives::GetScriptsSource();
|
| + compressed_data[kLibraries].data =
|
| + reinterpret_cast<const char*>(libraries_source.start());
|
| + compressed_data[kLibraries].compressed_size = libraries_source.length();
|
| + compressed_data[kLibraries].raw_size = i::Natives::GetRawScriptsSize();
|
| +
|
| + i::Vector<const i::byte> exp_libraries_source =
|
| + i::ExperimentalNatives::GetScriptsSource();
|
| + compressed_data[kExperimentalLibraries].data =
|
| + reinterpret_cast<const char*>(exp_libraries_source.start());
|
| + compressed_data[kExperimentalLibraries].compressed_size =
|
| + exp_libraries_source.length();
|
| + compressed_data[kExperimentalLibraries].raw_size =
|
| + i::ExperimentalNatives::GetRawScriptsSize();
|
| #endif
|
| }
|
|
|
| @@ -362,6 +420,20 @@ void V8::SetDecompressedStartupData(StartupData* decompressed_data) {
|
| i::Snapshot::set_context_raw_data(
|
| reinterpret_cast<const i::byte*>(
|
| decompressed_data[kSnapshotContext].data));
|
| +
|
| + ASSERT_EQ(i::Natives::GetRawScriptsSize(),
|
| + decompressed_data[kLibraries].raw_size);
|
| + i::Vector<const char> libraries_source(
|
| + decompressed_data[kLibraries].data,
|
| + decompressed_data[kLibraries].raw_size);
|
| + i::Natives::SetRawScriptsSource(libraries_source);
|
| +
|
| + ASSERT_EQ(i::ExperimentalNatives::GetRawScriptsSize(),
|
| + decompressed_data[kExperimentalLibraries].raw_size);
|
| + i::Vector<const char> exp_libraries_source(
|
| + decompressed_data[kExperimentalLibraries].data,
|
| + decompressed_data[kExperimentalLibraries].raw_size);
|
| + i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source);
|
| #endif
|
| }
|
|
|
|
|