Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(73)

Side by Side Diff: src/snapshot-common.cc

Issue 848023002: Store embed-script flag as metadata into snapshot blob. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // The common functionality when building with or without snapshots. 5 // The common functionality when building with or without snapshots.
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
11 #include "src/serialize.h" 11 #include "src/serialize.h"
12 #include "src/snapshot.h" 12 #include "src/snapshot.h"
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 16
17 bool Snapshot::HaveASnapshotToStartFrom() { 17 bool Snapshot::HaveASnapshotToStartFrom() {
18 return SnapshotBlob().data != NULL; 18 return SnapshotBlob().data != NULL;
19 } 19 }
20 20
21 21
22 #ifdef DEBUG
23 bool Snapshot::SnapshotIsValid() {
24 const v8::StartupData blob = SnapshotBlob();
25 return !Snapshot::ExtractStartupData(&blob).is_empty() &&
26 !Snapshot::ExtractContextData(&blob).is_empty();
27 }
28 #endif // DEBUG
29
30
31 bool Snapshot::EmbedsScript() {
32 if (!HaveASnapshotToStartFrom()) return false;
33 const v8::StartupData blob = SnapshotBlob();
34 return ExtractMetadata(&blob).embeds_script();
35 }
36
37
22 bool Snapshot::Initialize(Isolate* isolate) { 38 bool Snapshot::Initialize(Isolate* isolate) {
23 if (!HaveASnapshotToStartFrom()) return false; 39 if (!HaveASnapshotToStartFrom()) return false;
24 base::ElapsedTimer timer; 40 base::ElapsedTimer timer;
25 if (FLAG_profile_deserialization) timer.Start(); 41 if (FLAG_profile_deserialization) timer.Start();
26 42
27 const v8::StartupData blob = SnapshotBlob(); 43 const v8::StartupData blob = SnapshotBlob();
28 Vector<const byte> startup_data = ExtractStartupData(&blob); 44 Vector<const byte> startup_data = ExtractStartupData(&blob);
29 SnapshotData snapshot_data(startup_data); 45 SnapshotData snapshot_data(startup_data);
30 Deserializer deserializer(&snapshot_data); 46 Deserializer deserializer(&snapshot_data);
31 bool success = isolate->Init(&deserializer); 47 bool success = isolate->Init(&deserializer);
(...skipping 15 matching lines...) Expand all
47 const v8::StartupData blob = SnapshotBlob(); 63 const v8::StartupData blob = SnapshotBlob();
48 Vector<const byte> context_data = ExtractContextData(&blob); 64 Vector<const byte> context_data = ExtractContextData(&blob);
49 SnapshotData snapshot_data(context_data); 65 SnapshotData snapshot_data(context_data);
50 Deserializer deserializer(&snapshot_data); 66 Deserializer deserializer(&snapshot_data);
51 67
52 MaybeHandle<Object> maybe_context = 68 MaybeHandle<Object> maybe_context =
53 deserializer.DeserializePartial(isolate, outdated_contexts_out); 69 deserializer.DeserializePartial(isolate, outdated_contexts_out);
54 Handle<Object> result; 70 Handle<Object> result;
55 if (!maybe_context.ToHandle(&result)) return MaybeHandle<Context>(); 71 if (!maybe_context.ToHandle(&result)) return MaybeHandle<Context>();
56 CHECK(result->IsContext()); 72 CHECK(result->IsContext());
73 // If the snapshot does not contain a custom script, we need to update
74 // the global object for exactly one context.
75 CHECK(EmbedsScript() || (*outdated_contexts_out)->length() == 1);
57 if (FLAG_profile_deserialization) { 76 if (FLAG_profile_deserialization) {
58 double ms = timer.Elapsed().InMillisecondsF(); 77 double ms = timer.Elapsed().InMillisecondsF();
59 int bytes = context_data.length(); 78 int bytes = context_data.length();
60 PrintF("[Deserializing context (%d bytes) took %0.3f ms]\n", bytes, ms); 79 PrintF("[Deserializing context (%d bytes) took %0.3f ms]\n", bytes, ms);
61 } 80 }
62 return Handle<Context>::cast(result); 81 return Handle<Context>::cast(result);
63 } 82 }
64 83
65 84
66 v8::StartupData Snapshot::CreateSnapshotBlob( 85 v8::StartupData Snapshot::CreateSnapshotBlob(
67 const Vector<const byte> startup_data, 86 const Vector<const byte> startup_data,
68 const Vector<const byte> context_data) { 87 const Vector<const byte> context_data, Snapshot::Metadata metadata) {
69 int startup_length = startup_data.length(); 88 int startup_length = startup_data.length();
70 int context_length = context_data.length(); 89 int context_length = context_data.length();
71 int context_offset = kIntSize + startup_length; 90 int context_offset = ContextOffset(startup_length);
91
72 int length = context_offset + context_length; 92 int length = context_offset + context_length;
73 char* data = new char[length]; 93 char* data = new char[length];
74 94
75 memcpy(data, &startup_length, kIntSize); 95 memcpy(data + kMetadataOffset, &metadata.RawValue(), kInt32Size);
76 memcpy(data + kIntSize, startup_data.begin(), startup_length); 96 memcpy(data + kStartupLengthOffset, &startup_length, kInt32Size);
97 memcpy(data + kStartupDataOffset, startup_data.begin(), startup_length);
77 memcpy(data + context_offset, context_data.begin(), context_length); 98 memcpy(data + context_offset, context_data.begin(), context_length);
78 v8::StartupData result = {data, length}; 99 v8::StartupData result = {data, length};
79 return result; 100 return result;
80 } 101 }
81 102
82 103
104 Snapshot::Metadata Snapshot::ExtractMetadata(const v8::StartupData* data) {
105 uint32_t raw;
106 memcpy(&raw, data->data + kMetadataOffset, kInt32Size);
107 return Metadata(raw);
108 }
109
110
83 Vector<const byte> Snapshot::ExtractStartupData(const v8::StartupData* data) { 111 Vector<const byte> Snapshot::ExtractStartupData(const v8::StartupData* data) {
84 DCHECK_LT(kIntSize, data->raw_size); 112 DCHECK_LT(kIntSize, data->raw_size);
85 int startup_length; 113 int startup_length;
86 memcpy(&startup_length, data->data, kIntSize); 114 memcpy(&startup_length, data->data + kStartupLengthOffset, kInt32Size);
87 DCHECK_LT(startup_length, data->raw_size); 115 DCHECK_LT(startup_length, data->raw_size);
88 const byte* startup_data = 116 const byte* startup_data =
89 reinterpret_cast<const byte*>(data->data + kIntSize); 117 reinterpret_cast<const byte*>(data->data + kStartupDataOffset);
90 return Vector<const byte>(startup_data, startup_length); 118 return Vector<const byte>(startup_data, startup_length);
91 } 119 }
92 120
93 121
94 Vector<const byte> Snapshot::ExtractContextData(const v8::StartupData* data) { 122 Vector<const byte> Snapshot::ExtractContextData(const v8::StartupData* data) {
95 DCHECK_LT(kIntSize, data->raw_size); 123 DCHECK_LT(kIntSize, data->raw_size);
96 int startup_length; 124 int startup_length;
97 memcpy(&startup_length, data->data, kIntSize); 125 memcpy(&startup_length, data->data + kStartupLengthOffset, kIntSize);
98 int context_offset = kIntSize + startup_length; 126 int context_offset = ContextOffset(startup_length);
99 const byte* context_data = 127 const byte* context_data =
100 reinterpret_cast<const byte*>(data->data + context_offset); 128 reinterpret_cast<const byte*>(data->data + context_offset);
101 DCHECK_LT(context_offset, data->raw_size); 129 DCHECK_LT(context_offset, data->raw_size);
102 int context_length = data->raw_size - context_offset; 130 int context_length = data->raw_size - context_offset;
103 return Vector<const byte>(context_data, context_length); 131 return Vector<const byte>(context_data, context_length);
104 } 132 }
105 } } // namespace v8::internal 133 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/snapshot.h ('k') | src/snapshot-external.cc » ('j') | src/snapshot-external.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698