Chromium Code Reviews| Index: src/snapshot-common.cc |
| =================================================================== |
| --- src/snapshot-common.cc (revision 12439) |
| +++ src/snapshot-common.cc (working copy) |
| @@ -37,24 +37,66 @@ |
| 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_); |
| +} |
| + |
| + |
| bool Snapshot::Initialize(const char* snapshot_file) { |
| if (snapshot_file) { |
| int len; |
| byte* str = ReadBytes(snapshot_file, &len); |
| if (!str) return false; |
| - Deserialize(str, len); |
| + SnapshotByteSource source(str, len); |
| + Deserializer deserializer(&source); |
| + ReserveSpaceForSnapshot(&deserializer, snapshot_file); |
| + bool success = V8::Initialize(&deserializer); |
|
Yang
2012/09/13 08:47:59
Is there any plans to include a SnapshotByteSink t
Erik Corry
2012/09/13 12:13:35
This is currently only used for tests.
|
| 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 +111,16 @@ |
| 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)); |