| 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
 | 
|  }
 | 
|  
 | 
| 
 |