diff options
Diffstat (limited to 'deps/v8/src/snapshot-common.cc')
-rw-r--r-- | deps/v8/src/snapshot-common.cc | 74 |
1 files changed, 59 insertions, 15 deletions
diff --git a/deps/v8/src/snapshot-common.cc b/deps/v8/src/snapshot-common.cc index 3a4ac70edf..a8806f053f 100644 --- a/deps/v8/src/snapshot-common.cc +++ b/deps/v8/src/snapshot-common.cc @@ -37,10 +37,47 @@ namespace v8 { namespace internal { -bool Snapshot::Deserialize(const byte* content, int len) { - SnapshotByteSource source(content, len); - Deserializer deserializer(&source); - return V8::Initialize(&deserializer); + +static void ReserveSpaceForSnapshot(Deserializer* deserializer, + const char* file_name) { + int file_name_length = StrLength(file_name) + 10; + Vector<char> name = Vector<char>::New(file_name_length + 1); + OS::SNPrintF(name, "%s.size", file_name); + FILE* fp = OS::FOpen(name.start(), "r"); + CHECK_NE(NULL, fp); + int new_size, pointer_size, data_size, code_size, map_size, cell_size; +#ifdef _MSC_VER + // Avoid warning about unsafe fscanf from MSVC. + // Please note that this is only fine if %c and %s are not being used. +#define fscanf fscanf_s +#endif + CHECK_EQ(1, fscanf(fp, "new %d\n", &new_size)); + CHECK_EQ(1, fscanf(fp, "pointer %d\n", &pointer_size)); + CHECK_EQ(1, fscanf(fp, "data %d\n", &data_size)); + CHECK_EQ(1, fscanf(fp, "code %d\n", &code_size)); + CHECK_EQ(1, fscanf(fp, "map %d\n", &map_size)); + CHECK_EQ(1, fscanf(fp, "cell %d\n", &cell_size)); +#ifdef _MSC_VER +#undef fscanf +#endif + fclose(fp); + deserializer->set_reservation(NEW_SPACE, new_size); + deserializer->set_reservation(OLD_POINTER_SPACE, pointer_size); + deserializer->set_reservation(OLD_DATA_SPACE, data_size); + deserializer->set_reservation(CODE_SPACE, code_size); + deserializer->set_reservation(MAP_SPACE, map_size); + deserializer->set_reservation(CELL_SPACE, cell_size); + name.Dispose(); +} + + +void Snapshot::ReserveSpaceForLinkedInSnapshot(Deserializer* deserializer) { + deserializer->set_reservation(NEW_SPACE, new_space_used_); + deserializer->set_reservation(OLD_POINTER_SPACE, pointer_space_used_); + deserializer->set_reservation(OLD_DATA_SPACE, data_space_used_); + deserializer->set_reservation(CODE_SPACE, code_space_used_); + deserializer->set_reservation(MAP_SPACE, map_space_used_); + deserializer->set_reservation(CELL_SPACE, cell_space_used_); } @@ -49,12 +86,20 @@ bool Snapshot::Initialize(const char* snapshot_file) { int len; byte* str = ReadBytes(snapshot_file, &len); if (!str) return false; - Deserialize(str, len); + bool success; + { + SnapshotByteSource source(str, len); + Deserializer deserializer(&source); + ReserveSpaceForSnapshot(&deserializer, snapshot_file); + success = V8::Initialize(&deserializer); + } DeleteArray(str); - return true; + return success; } else if (size_ > 0) { - Deserialize(raw_data_, raw_size_); - return true; + SnapshotByteSource source(raw_data_, raw_size_); + Deserializer deserializer(&source); + ReserveSpaceForLinkedInSnapshot(&deserializer); + return V8::Initialize(&deserializer); } return false; } @@ -69,17 +114,16 @@ Handle<Context> Snapshot::NewContextFromSnapshot() { if (context_size_ == 0) { return Handle<Context>(); } - HEAP->ReserveSpace(new_space_used_, - pointer_space_used_, - data_space_used_, - code_space_used_, - map_space_used_, - cell_space_used_, - large_space_used_); SnapshotByteSource source(context_raw_data_, context_raw_size_); Deserializer deserializer(&source); Object* root; + deserializer.set_reservation(NEW_SPACE, context_new_space_used_); + deserializer.set_reservation(OLD_POINTER_SPACE, context_pointer_space_used_); + deserializer.set_reservation(OLD_DATA_SPACE, context_data_space_used_); + deserializer.set_reservation(CODE_SPACE, context_code_space_used_); + deserializer.set_reservation(MAP_SPACE, context_map_space_used_); + deserializer.set_reservation(CELL_SPACE, context_cell_space_used_); deserializer.DeserializePartial(&root); CHECK(root->IsContext()); return Handle<Context>(Context::cast(root)); |