OLD | NEW |
1 // Copyright 2007-2010 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 { | 280 { |
281 v8::HandleScope handle_scope(v8_isolate); | 281 v8::HandleScope handle_scope(v8_isolate); |
282 v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); | 282 v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); |
283 } | 283 } |
284 env.Reset(); | 284 env.Reset(); |
285 | 285 |
286 StartupSerializer startup_serializer( | 286 StartupSerializer startup_serializer( |
287 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); | 287 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); |
288 startup_serializer.SerializeStrongReferences(); | 288 startup_serializer.SerializeStrongReferences(); |
289 | 289 |
290 PartialSerializer partial_serializer(isolate, &startup_serializer); | 290 PartialSerializer partial_serializer(isolate, &startup_serializer, nullptr); |
291 partial_serializer.Serialize(&raw_foo); | 291 partial_serializer.Serialize(&raw_foo); |
292 | 292 |
293 startup_serializer.SerializeWeakReferencesAndDeferred(); | 293 startup_serializer.SerializeWeakReferencesAndDeferred(); |
294 | 294 |
295 SnapshotData startup_snapshot(&startup_serializer); | 295 SnapshotData startup_snapshot(&startup_serializer); |
296 SnapshotData partial_snapshot(&partial_serializer); | 296 SnapshotData partial_snapshot(&partial_serializer); |
297 | 297 |
298 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 298 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
299 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 299 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
300 } | 300 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 i::Object* raw_context = *v8::Utils::OpenPersistent(env); | 380 i::Object* raw_context = *v8::Utils::OpenPersistent(env); |
381 | 381 |
382 env.Reset(); | 382 env.Reset(); |
383 | 383 |
384 SnapshotByteSink startup_sink; | 384 SnapshotByteSink startup_sink; |
385 StartupSerializer startup_serializer( | 385 StartupSerializer startup_serializer( |
386 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); | 386 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); |
387 startup_serializer.SerializeStrongReferences(); | 387 startup_serializer.SerializeStrongReferences(); |
388 | 388 |
389 SnapshotByteSink partial_sink; | 389 SnapshotByteSink partial_sink; |
390 PartialSerializer partial_serializer(isolate, &startup_serializer); | 390 PartialSerializer partial_serializer(isolate, &startup_serializer, nullptr); |
391 partial_serializer.Serialize(&raw_context); | 391 partial_serializer.Serialize(&raw_context); |
392 startup_serializer.SerializeWeakReferencesAndDeferred(); | 392 startup_serializer.SerializeWeakReferencesAndDeferred(); |
393 | 393 |
394 SnapshotData startup_snapshot(&startup_serializer); | 394 SnapshotData startup_snapshot(&startup_serializer); |
395 SnapshotData partial_snapshot(&partial_serializer); | 395 SnapshotData partial_snapshot(&partial_serializer); |
396 | 396 |
397 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 397 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
398 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 398 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
399 } | 399 } |
400 v8_isolate->Dispose(); | 400 v8_isolate->Dispose(); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 i::Object* raw_context = *v8::Utils::OpenPersistent(env); | 499 i::Object* raw_context = *v8::Utils::OpenPersistent(env); |
500 | 500 |
501 env.Reset(); | 501 env.Reset(); |
502 | 502 |
503 SnapshotByteSink startup_sink; | 503 SnapshotByteSink startup_sink; |
504 StartupSerializer startup_serializer( | 504 StartupSerializer startup_serializer( |
505 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); | 505 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); |
506 startup_serializer.SerializeStrongReferences(); | 506 startup_serializer.SerializeStrongReferences(); |
507 | 507 |
508 SnapshotByteSink partial_sink; | 508 SnapshotByteSink partial_sink; |
509 PartialSerializer partial_serializer(isolate, &startup_serializer); | 509 PartialSerializer partial_serializer(isolate, &startup_serializer, nullptr); |
510 partial_serializer.Serialize(&raw_context); | 510 partial_serializer.Serialize(&raw_context); |
511 startup_serializer.SerializeWeakReferencesAndDeferred(); | 511 startup_serializer.SerializeWeakReferencesAndDeferred(); |
512 | 512 |
513 SnapshotData startup_snapshot(&startup_serializer); | 513 SnapshotData startup_snapshot(&startup_serializer); |
514 SnapshotData partial_snapshot(&partial_serializer); | 514 SnapshotData partial_snapshot(&partial_serializer); |
515 | 515 |
516 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 516 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
517 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 517 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
518 } | 518 } |
519 v8_isolate->Dispose(); | 519 v8_isolate->Dispose(); |
(...skipping 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2102 ExpectInt32("f()", 42); | 2102 ExpectInt32("f()", 42); |
2103 | 2103 |
2104 CHECK_EQ(0, creator.AddContext(context)); | 2104 CHECK_EQ(0, creator.AddContext(context)); |
2105 } | 2105 } |
2106 v8::StartupData blob = | 2106 v8::StartupData blob = |
2107 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); | 2107 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); |
2108 | 2108 |
2109 delete[] blob.data; | 2109 delete[] blob.data; |
2110 } | 2110 } |
2111 | 2111 |
| 2112 struct InternalFieldData { |
| 2113 uint32_t data; |
| 2114 }; |
| 2115 |
| 2116 v8::StartupData SerializeInternalFields(v8::Local<v8::Object> holder, |
| 2117 int index) { |
| 2118 InternalFieldData* data = static_cast<InternalFieldData*>( |
| 2119 holder->GetAlignedPointerFromInternalField(index)); |
| 2120 int size = sizeof(*data); |
| 2121 char* payload = new char[size]; |
| 2122 // We simply use memcpy to serialize the content. |
| 2123 memcpy(payload, data, size); |
| 2124 return {payload, size}; |
| 2125 } |
| 2126 |
| 2127 void DeserializeInternalFields(v8::Local<v8::Object> holder, int index, |
| 2128 v8::StartupData payload) { |
| 2129 InternalFieldData* data = new InternalFieldData{0}; |
| 2130 memcpy(data, payload.data, payload.raw_size); |
| 2131 holder->SetAlignedPointerInInternalField(index, data); |
| 2132 } |
| 2133 |
2112 TEST(SnapshotCreatorTemplates) { | 2134 TEST(SnapshotCreatorTemplates) { |
2113 DisableTurbofan(); | 2135 DisableTurbofan(); |
2114 v8::StartupData blob; | 2136 v8::StartupData blob; |
| 2137 |
2115 { | 2138 { |
| 2139 InternalFieldData* a1 = new InternalFieldData{11}; |
| 2140 InternalFieldData* b0 = new InternalFieldData{20}; |
| 2141 InternalFieldData* c0 = new InternalFieldData{30}; |
| 2142 InternalFieldData* c1 = new InternalFieldData{31}; |
| 2143 |
2116 v8::SnapshotCreator creator(original_external_references); | 2144 v8::SnapshotCreator creator(original_external_references); |
2117 v8::Isolate* isolate = creator.GetIsolate(); | 2145 v8::Isolate* isolate = creator.GetIsolate(); |
2118 { | 2146 { |
2119 v8::HandleScope handle_scope(isolate); | 2147 v8::HandleScope handle_scope(isolate); |
2120 v8::ExtensionConfiguration* no_extension = nullptr; | 2148 v8::ExtensionConfiguration* no_extension = nullptr; |
2121 v8::Local<v8::ObjectTemplate> global_template = | 2149 v8::Local<v8::ObjectTemplate> global_template = |
2122 v8::ObjectTemplate::New(isolate); | 2150 v8::ObjectTemplate::New(isolate); |
2123 v8::Local<v8::FunctionTemplate> callback = | 2151 v8::Local<v8::FunctionTemplate> callback = |
2124 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2152 v8::FunctionTemplate::New(isolate, SerializedCallback); |
2125 global_template->Set(v8_str("f"), callback); | 2153 global_template->Set(v8_str("f"), callback); |
2126 v8::Local<v8::Context> context = | 2154 v8::Local<v8::Context> context = |
2127 v8::Context::New(isolate, no_extension, global_template); | 2155 v8::Context::New(isolate, no_extension, global_template); |
| 2156 v8::Local<v8::ObjectTemplate> object_template = |
| 2157 v8::ObjectTemplate::New(isolate); |
| 2158 object_template->SetInternalFieldCount(2); |
| 2159 |
2128 v8::Context::Scope context_scope(context); | 2160 v8::Context::Scope context_scope(context); |
2129 ExpectInt32("f()", 42); | 2161 ExpectInt32("f()", 42); |
| 2162 |
| 2163 v8::Local<v8::Object> a = |
| 2164 object_template->NewInstance(context).ToLocalChecked(); |
| 2165 v8::Local<v8::Object> b = |
| 2166 object_template->NewInstance(context).ToLocalChecked(); |
| 2167 v8::Local<v8::Object> c = |
| 2168 object_template->NewInstance(context).ToLocalChecked(); |
| 2169 a->SetInternalField(0, b); |
| 2170 a->SetAlignedPointerInInternalField(1, a1); |
| 2171 b->SetAlignedPointerInInternalField(0, b0); |
| 2172 b->SetInternalField(1, c); |
| 2173 c->SetAlignedPointerInInternalField(0, c0); |
| 2174 c->SetAlignedPointerInInternalField(1, c1); |
| 2175 CHECK(context->Global()->Set(context, v8_str("a"), a).FromJust()); |
| 2176 |
2130 CHECK_EQ(0, creator.AddContext(context)); | 2177 CHECK_EQ(0, creator.AddContext(context)); |
2131 CHECK_EQ(0, creator.AddTemplate(callback)); | 2178 CHECK_EQ(0, creator.AddTemplate(callback)); |
2132 CHECK_EQ(1, creator.AddTemplate(global_template)); | 2179 CHECK_EQ(1, creator.AddTemplate(global_template)); |
2133 } | 2180 } |
2134 blob = | 2181 blob = creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear, |
2135 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); | 2182 SerializeInternalFields); |
| 2183 |
| 2184 delete a1; |
| 2185 delete b0; |
| 2186 delete c1; |
| 2187 delete c0; |
2136 } | 2188 } |
2137 | 2189 |
2138 { | 2190 { |
2139 v8::Isolate::CreateParams params; | 2191 v8::Isolate::CreateParams params; |
2140 params.snapshot_blob = &blob; | 2192 params.snapshot_blob = &blob; |
2141 params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 2193 params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
2142 params.external_references = original_external_references; | 2194 params.external_references = original_external_references; |
| 2195 params.deserialize_internal_fields_callback = DeserializeInternalFields; |
2143 v8::Isolate* isolate = v8::Isolate::New(params); | 2196 v8::Isolate* isolate = v8::Isolate::New(params); |
2144 { | 2197 { |
2145 v8::Isolate::Scope isolate_scope(isolate); | 2198 v8::Isolate::Scope isolate_scope(isolate); |
2146 { | 2199 { |
2147 // Create a new context without a new object template. | 2200 // Create a new context without a new object template. |
2148 v8::HandleScope handle_scope(isolate); | 2201 v8::HandleScope handle_scope(isolate); |
2149 v8::Local<v8::Context> context = | 2202 v8::Local<v8::Context> context = |
2150 v8::Context::FromSnapshot(isolate, 0).ToLocalChecked(); | 2203 v8::Context::FromSnapshot(isolate, 0).ToLocalChecked(); |
2151 v8::Context::Scope context_scope(context); | 2204 v8::Context::Scope context_scope(context); |
2152 ExpectInt32("f()", 42); | 2205 ExpectInt32("f()", 42); |
(...skipping 13 matching lines...) Expand all Loading... |
2166 v8::Local<v8::FunctionTemplate> fun_template = | 2219 v8::Local<v8::FunctionTemplate> fun_template = |
2167 v8::FunctionTemplate::FromSnapshot(isolate, 0).ToLocalChecked(); | 2220 v8::FunctionTemplate::FromSnapshot(isolate, 0).ToLocalChecked(); |
2168 CHECK(!fun_template.IsEmpty()); | 2221 CHECK(!fun_template.IsEmpty()); |
2169 v8::Local<v8::Function> fun = | 2222 v8::Local<v8::Function> fun = |
2170 fun_template->GetFunction(context).ToLocalChecked(); | 2223 fun_template->GetFunction(context).ToLocalChecked(); |
2171 CHECK(context->Global()->Set(context, v8_str("g"), fun).FromJust()); | 2224 CHECK(context->Global()->Set(context, v8_str("g"), fun).FromJust()); |
2172 ExpectInt32("g()", 42); | 2225 ExpectInt32("g()", 42); |
2173 // Check that it instantiates to the same prototype. | 2226 // Check that it instantiates to the same prototype. |
2174 ExpectTrue("g.prototype === f.prototype"); | 2227 ExpectTrue("g.prototype === f.prototype"); |
2175 | 2228 |
| 2229 // Retrieve internal fields. |
| 2230 v8::Local<v8::Object> a = context->Global() |
| 2231 ->Get(context, v8_str("a")) |
| 2232 .ToLocalChecked() |
| 2233 ->ToObject(context) |
| 2234 .ToLocalChecked(); |
| 2235 v8::Local<v8::Object> b = |
| 2236 a->GetInternalField(0)->ToObject(context).ToLocalChecked(); |
| 2237 InternalFieldData* a1 = reinterpret_cast<InternalFieldData*>( |
| 2238 a->GetAlignedPointerFromInternalField(1)); |
| 2239 InternalFieldData* b0 = reinterpret_cast<InternalFieldData*>( |
| 2240 b->GetAlignedPointerFromInternalField(0)); |
| 2241 v8::Local<v8::Object> c = |
| 2242 b->GetInternalField(1)->ToObject(context).ToLocalChecked(); |
| 2243 InternalFieldData* c0 = reinterpret_cast<InternalFieldData*>( |
| 2244 c->GetAlignedPointerFromInternalField(0)); |
| 2245 InternalFieldData* c1 = reinterpret_cast<InternalFieldData*>( |
| 2246 c->GetAlignedPointerFromInternalField(1)); |
| 2247 |
| 2248 CHECK_EQ(11, a1->data); |
| 2249 CHECK_EQ(20, b0->data); |
| 2250 CHECK_EQ(30, c0->data); |
| 2251 CHECK_EQ(31, c1->data); |
| 2252 |
2176 // Accessing out of bound returns empty MaybeHandle. | 2253 // Accessing out of bound returns empty MaybeHandle. |
2177 CHECK(v8::ObjectTemplate::FromSnapshot(isolate, 2).IsEmpty()); | 2254 CHECK(v8::ObjectTemplate::FromSnapshot(isolate, 2).IsEmpty()); |
2178 CHECK(v8::FunctionTemplate::FromSnapshot(isolate, 2).IsEmpty()); | 2255 CHECK(v8::FunctionTemplate::FromSnapshot(isolate, 2).IsEmpty()); |
2179 CHECK(v8::Context::FromSnapshot(isolate, 2).IsEmpty()); | 2256 CHECK(v8::Context::FromSnapshot(isolate, 2).IsEmpty()); |
| 2257 |
| 2258 delete a1; |
| 2259 delete b0; |
| 2260 delete c1; |
| 2261 delete c0; |
2180 } | 2262 } |
2181 | 2263 |
2182 { | 2264 { |
2183 // Create a context with a new object template. It is merged into the | 2265 // Create a context with a new object template. It is merged into the |
2184 // deserialized global object. | 2266 // deserialized global object. |
2185 v8::HandleScope handle_scope(isolate); | 2267 v8::HandleScope handle_scope(isolate); |
2186 v8::ExtensionConfiguration* no_extension = nullptr; | 2268 v8::ExtensionConfiguration* no_extension = nullptr; |
2187 v8::Local<v8::ObjectTemplate> global_template = | 2269 v8::Local<v8::ObjectTemplate> global_template = |
2188 v8::ObjectTemplate::New(isolate); | 2270 v8::ObjectTemplate::New(isolate); |
2189 global_template->Set( | 2271 global_template->Set( |
(...skipping 11 matching lines...) Expand all Loading... |
2201 } | 2283 } |
2202 delete[] blob.data; | 2284 delete[] blob.data; |
2203 } | 2285 } |
2204 | 2286 |
2205 TEST(SerializationMemoryStats) { | 2287 TEST(SerializationMemoryStats) { |
2206 FLAG_profile_deserialization = true; | 2288 FLAG_profile_deserialization = true; |
2207 FLAG_always_opt = false; | 2289 FLAG_always_opt = false; |
2208 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); | 2290 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); |
2209 delete[] blob.data; | 2291 delete[] blob.data; |
2210 } | 2292 } |
OLD | NEW |