| 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 v8::HandleScope handle_scope(v8_isolate); | 280 v8::HandleScope handle_scope(v8_isolate); |
| 281 v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); | 281 v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); |
| 282 } | 282 } |
| 283 env.Reset(); | 283 env.Reset(); |
| 284 | 284 |
| 285 StartupSerializer startup_serializer( | 285 StartupSerializer startup_serializer( |
| 286 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); | 286 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); |
| 287 startup_serializer.SerializeStrongReferences(); | 287 startup_serializer.SerializeStrongReferences(); |
| 288 | 288 |
| 289 PartialSerializer partial_serializer(isolate, &startup_serializer, | 289 PartialSerializer partial_serializer(isolate, &startup_serializer, |
| 290 v8::SerializeInternalFieldsCallback()); | 290 v8::SerializeEmbedderFieldsCallback()); |
| 291 partial_serializer.Serialize(&raw_foo, false); | 291 partial_serializer.Serialize(&raw_foo, false); |
| 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 17 matching lines...) Expand all Loading... |
| 318 HandleScope handle_scope(isolate); | 318 HandleScope handle_scope(isolate); |
| 319 Handle<Object> root; | 319 Handle<Object> root; |
| 320 // Intentionally empty handle. The deserializer should not come across | 320 // Intentionally empty handle. The deserializer should not come across |
| 321 // any references to the global proxy in this test. | 321 // any references to the global proxy in this test. |
| 322 Handle<JSGlobalProxy> global_proxy = Handle<JSGlobalProxy>::null(); | 322 Handle<JSGlobalProxy> global_proxy = Handle<JSGlobalProxy>::null(); |
| 323 { | 323 { |
| 324 SnapshotData snapshot_data(partial_blob); | 324 SnapshotData snapshot_data(partial_blob); |
| 325 Deserializer deserializer(&snapshot_data); | 325 Deserializer deserializer(&snapshot_data); |
| 326 root = deserializer | 326 root = deserializer |
| 327 .DeserializePartial(isolate, global_proxy, | 327 .DeserializePartial(isolate, global_proxy, |
| 328 v8::DeserializeInternalFieldsCallback()) | 328 v8::DeserializeEmbedderFieldsCallback()) |
| 329 .ToHandleChecked(); | 329 .ToHandleChecked(); |
| 330 CHECK(root->IsString()); | 330 CHECK(root->IsString()); |
| 331 } | 331 } |
| 332 | 332 |
| 333 Handle<Object> root2; | 333 Handle<Object> root2; |
| 334 { | 334 { |
| 335 SnapshotData snapshot_data(partial_blob); | 335 SnapshotData snapshot_data(partial_blob); |
| 336 Deserializer deserializer(&snapshot_data); | 336 Deserializer deserializer(&snapshot_data); |
| 337 root2 = deserializer | 337 root2 = deserializer |
| 338 .DeserializePartial(isolate, global_proxy, | 338 .DeserializePartial(isolate, global_proxy, |
| 339 v8::DeserializeInternalFieldsCallback()) | 339 v8::DeserializeEmbedderFieldsCallback()) |
| 340 .ToHandleChecked(); | 340 .ToHandleChecked(); |
| 341 CHECK(root2->IsString()); | 341 CHECK(root2->IsString()); |
| 342 CHECK(root.is_identical_to(root2)); | 342 CHECK(root.is_identical_to(root2)); |
| 343 } | 343 } |
| 344 partial_blob.Dispose(); | 344 partial_blob.Dispose(); |
| 345 } | 345 } |
| 346 v8_isolate->Dispose(); | 346 v8_isolate->Dispose(); |
| 347 } | 347 } |
| 348 | 348 |
| 349 static void PartiallySerializeContext(Vector<const byte>* startup_blob_out, | 349 static void PartiallySerializeContext(Vector<const byte>* startup_blob_out, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 385 |
| 386 env.Reset(); | 386 env.Reset(); |
| 387 | 387 |
| 388 SnapshotByteSink startup_sink; | 388 SnapshotByteSink startup_sink; |
| 389 StartupSerializer startup_serializer( | 389 StartupSerializer startup_serializer( |
| 390 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); | 390 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); |
| 391 startup_serializer.SerializeStrongReferences(); | 391 startup_serializer.SerializeStrongReferences(); |
| 392 | 392 |
| 393 SnapshotByteSink partial_sink; | 393 SnapshotByteSink partial_sink; |
| 394 PartialSerializer partial_serializer(isolate, &startup_serializer, | 394 PartialSerializer partial_serializer(isolate, &startup_serializer, |
| 395 v8::SerializeInternalFieldsCallback()); | 395 v8::SerializeEmbedderFieldsCallback()); |
| 396 partial_serializer.Serialize(&raw_context, false); | 396 partial_serializer.Serialize(&raw_context, false); |
| 397 startup_serializer.SerializeWeakReferencesAndDeferred(); | 397 startup_serializer.SerializeWeakReferencesAndDeferred(); |
| 398 | 398 |
| 399 SnapshotData startup_snapshot(&startup_serializer); | 399 SnapshotData startup_snapshot(&startup_serializer); |
| 400 SnapshotData partial_snapshot(&partial_serializer); | 400 SnapshotData partial_snapshot(&partial_serializer); |
| 401 | 401 |
| 402 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 402 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
| 403 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 403 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
| 404 } | 404 } |
| 405 v8_isolate->Dispose(); | 405 v8_isolate->Dispose(); |
| 406 } | 406 } |
| 407 | 407 |
| 408 UNINITIALIZED_TEST(PartialSerializerContext) { | 408 UNINITIALIZED_TEST(PartialSerializerContext) { |
| 409 DisableAlwaysOpt(); | 409 DisableAlwaysOpt(); |
| 410 Vector<const byte> startup_blob; | 410 Vector<const byte> startup_blob; |
| 411 Vector<const byte> partial_blob; | 411 Vector<const byte> partial_blob; |
| 412 PartiallySerializeContext(&startup_blob, &partial_blob); | 412 PartiallySerializeContext(&startup_blob, &partial_blob); |
| 413 | 413 |
| 414 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 414 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
| 415 CHECK(v8_isolate); | 415 CHECK(v8_isolate); |
| 416 startup_blob.Dispose(); | 416 startup_blob.Dispose(); |
| 417 { | 417 { |
| 418 v8::Isolate::Scope isolate_scope(v8_isolate); | 418 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 419 | 419 |
| 420 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 420 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
| 421 HandleScope handle_scope(isolate); | 421 HandleScope handle_scope(isolate); |
| 422 Handle<Object> root; | 422 Handle<Object> root; |
| 423 Handle<JSGlobalProxy> global_proxy = | 423 Handle<JSGlobalProxy> global_proxy = |
| 424 isolate->factory()->NewUninitializedJSGlobalProxy( | 424 isolate->factory()->NewUninitializedJSGlobalProxy( |
| 425 JSGlobalProxy::SizeWithInternalFields(0)); | 425 JSGlobalProxy::SizeWithEmbedderFields(0)); |
| 426 { | 426 { |
| 427 SnapshotData snapshot_data(partial_blob); | 427 SnapshotData snapshot_data(partial_blob); |
| 428 Deserializer deserializer(&snapshot_data); | 428 Deserializer deserializer(&snapshot_data); |
| 429 root = deserializer | 429 root = deserializer |
| 430 .DeserializePartial(isolate, global_proxy, | 430 .DeserializePartial(isolate, global_proxy, |
| 431 v8::DeserializeInternalFieldsCallback()) | 431 v8::DeserializeEmbedderFieldsCallback()) |
| 432 .ToHandleChecked(); | 432 .ToHandleChecked(); |
| 433 CHECK(root->IsContext()); | 433 CHECK(root->IsContext()); |
| 434 CHECK(Handle<Context>::cast(root)->global_proxy() == *global_proxy); | 434 CHECK(Handle<Context>::cast(root)->global_proxy() == *global_proxy); |
| 435 } | 435 } |
| 436 | 436 |
| 437 Handle<Object> root2; | 437 Handle<Object> root2; |
| 438 { | 438 { |
| 439 SnapshotData snapshot_data(partial_blob); | 439 SnapshotData snapshot_data(partial_blob); |
| 440 Deserializer deserializer(&snapshot_data); | 440 Deserializer deserializer(&snapshot_data); |
| 441 root2 = deserializer | 441 root2 = deserializer |
| 442 .DeserializePartial(isolate, global_proxy, | 442 .DeserializePartial(isolate, global_proxy, |
| 443 v8::DeserializeInternalFieldsCallback()) | 443 v8::DeserializeEmbedderFieldsCallback()) |
| 444 .ToHandleChecked(); | 444 .ToHandleChecked(); |
| 445 CHECK(root2->IsContext()); | 445 CHECK(root2->IsContext()); |
| 446 CHECK(!root.is_identical_to(root2)); | 446 CHECK(!root.is_identical_to(root2)); |
| 447 } | 447 } |
| 448 partial_blob.Dispose(); | 448 partial_blob.Dispose(); |
| 449 } | 449 } |
| 450 v8_isolate->Dispose(); | 450 v8_isolate->Dispose(); |
| 451 } | 451 } |
| 452 | 452 |
| 453 static void PartiallySerializeCustomContext( | 453 static void PartiallySerializeCustomContext( |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 510 | 510 |
| 511 env.Reset(); | 511 env.Reset(); |
| 512 | 512 |
| 513 SnapshotByteSink startup_sink; | 513 SnapshotByteSink startup_sink; |
| 514 StartupSerializer startup_serializer( | 514 StartupSerializer startup_serializer( |
| 515 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); | 515 isolate, v8::SnapshotCreator::FunctionCodeHandling::kClear); |
| 516 startup_serializer.SerializeStrongReferences(); | 516 startup_serializer.SerializeStrongReferences(); |
| 517 | 517 |
| 518 SnapshotByteSink partial_sink; | 518 SnapshotByteSink partial_sink; |
| 519 PartialSerializer partial_serializer(isolate, &startup_serializer, | 519 PartialSerializer partial_serializer(isolate, &startup_serializer, |
| 520 v8::SerializeInternalFieldsCallback()); | 520 v8::SerializeEmbedderFieldsCallback()); |
| 521 partial_serializer.Serialize(&raw_context, false); | 521 partial_serializer.Serialize(&raw_context, false); |
| 522 startup_serializer.SerializeWeakReferencesAndDeferred(); | 522 startup_serializer.SerializeWeakReferencesAndDeferred(); |
| 523 | 523 |
| 524 SnapshotData startup_snapshot(&startup_serializer); | 524 SnapshotData startup_snapshot(&startup_serializer); |
| 525 SnapshotData partial_snapshot(&partial_serializer); | 525 SnapshotData partial_snapshot(&partial_serializer); |
| 526 | 526 |
| 527 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 527 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
| 528 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 528 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
| 529 } | 529 } |
| 530 v8_isolate->Dispose(); | 530 v8_isolate->Dispose(); |
| 531 } | 531 } |
| 532 | 532 |
| 533 UNINITIALIZED_TEST(PartialSerializerCustomContext) { | 533 UNINITIALIZED_TEST(PartialSerializerCustomContext) { |
| 534 DisableAlwaysOpt(); | 534 DisableAlwaysOpt(); |
| 535 Vector<const byte> startup_blob; | 535 Vector<const byte> startup_blob; |
| 536 Vector<const byte> partial_blob; | 536 Vector<const byte> partial_blob; |
| 537 PartiallySerializeCustomContext(&startup_blob, &partial_blob); | 537 PartiallySerializeCustomContext(&startup_blob, &partial_blob); |
| 538 | 538 |
| 539 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 539 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
| 540 CHECK(v8_isolate); | 540 CHECK(v8_isolate); |
| 541 startup_blob.Dispose(); | 541 startup_blob.Dispose(); |
| 542 { | 542 { |
| 543 v8::Isolate::Scope isolate_scope(v8_isolate); | 543 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 544 | 544 |
| 545 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 545 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
| 546 HandleScope handle_scope(isolate); | 546 HandleScope handle_scope(isolate); |
| 547 Handle<Object> root; | 547 Handle<Object> root; |
| 548 Handle<JSGlobalProxy> global_proxy = | 548 Handle<JSGlobalProxy> global_proxy = |
| 549 isolate->factory()->NewUninitializedJSGlobalProxy( | 549 isolate->factory()->NewUninitializedJSGlobalProxy( |
| 550 JSGlobalProxy::SizeWithInternalFields(0)); | 550 JSGlobalProxy::SizeWithEmbedderFields(0)); |
| 551 { | 551 { |
| 552 SnapshotData snapshot_data(partial_blob); | 552 SnapshotData snapshot_data(partial_blob); |
| 553 Deserializer deserializer(&snapshot_data); | 553 Deserializer deserializer(&snapshot_data); |
| 554 root = deserializer | 554 root = deserializer |
| 555 .DeserializePartial(isolate, global_proxy, | 555 .DeserializePartial(isolate, global_proxy, |
| 556 v8::DeserializeInternalFieldsCallback()) | 556 v8::DeserializeEmbedderFieldsCallback()) |
| 557 .ToHandleChecked(); | 557 .ToHandleChecked(); |
| 558 CHECK(root->IsContext()); | 558 CHECK(root->IsContext()); |
| 559 Handle<Context> context = Handle<Context>::cast(root); | 559 Handle<Context> context = Handle<Context>::cast(root); |
| 560 | 560 |
| 561 // Add context to the weak native context list | 561 // Add context to the weak native context list |
| 562 context->set(Context::NEXT_CONTEXT_LINK, | 562 context->set(Context::NEXT_CONTEXT_LINK, |
| 563 isolate->heap()->native_contexts_list(), | 563 isolate->heap()->native_contexts_list(), |
| 564 UPDATE_WEAK_WRITE_BARRIER); | 564 UPDATE_WEAK_WRITE_BARRIER); |
| 565 isolate->heap()->set_native_contexts_list(*context); | 565 isolate->heap()->set_native_contexts_list(*context); |
| 566 | 566 |
| (...skipping 1508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2075 ExpectInt32("f()", 42); | 2075 ExpectInt32("f()", 42); |
| 2076 | 2076 |
| 2077 creator.SetDefaultContext(context); | 2077 creator.SetDefaultContext(context); |
| 2078 } | 2078 } |
| 2079 v8::StartupData blob = | 2079 v8::StartupData blob = |
| 2080 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); | 2080 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); |
| 2081 | 2081 |
| 2082 delete[] blob.data; | 2082 delete[] blob.data; |
| 2083 } | 2083 } |
| 2084 | 2084 |
| 2085 struct InternalFieldData { | 2085 struct EmbedderFieldData { |
| 2086 uint32_t data; | 2086 uint32_t data; |
| 2087 }; | 2087 }; |
| 2088 | 2088 |
| 2089 v8::StartupData SerializeInternalFields(v8::Local<v8::Object> holder, int index, | 2089 v8::StartupData SerializeEmbedderFields(v8::Local<v8::Object> holder, int index, |
| 2090 void* data) { | 2090 void* data) { |
| 2091 CHECK_EQ(reinterpret_cast<void*>(2016), data); | 2091 CHECK_EQ(reinterpret_cast<void*>(2016), data); |
| 2092 InternalFieldData* internal_field = static_cast<InternalFieldData*>( | 2092 EmbedderFieldData* embedder_field = static_cast<EmbedderFieldData*>( |
| 2093 holder->GetAlignedPointerFromInternalField(index)); | 2093 holder->GetAlignedPointerFromEmbedderField(index)); |
| 2094 int size = sizeof(*internal_field); | 2094 int size = sizeof(*embedder_field); |
| 2095 char* payload = new char[size]; | 2095 char* payload = new char[size]; |
| 2096 // We simply use memcpy to serialize the content. | 2096 // We simply use memcpy to serialize the content. |
| 2097 memcpy(payload, internal_field, size); | 2097 memcpy(payload, embedder_field, size); |
| 2098 return {payload, size}; | 2098 return {payload, size}; |
| 2099 } | 2099 } |
| 2100 | 2100 |
| 2101 std::vector<InternalFieldData*> deserialized_data; | 2101 std::vector<EmbedderFieldData*> deserialized_data; |
| 2102 | 2102 |
| 2103 void DeserializeInternalFields(v8::Local<v8::Object> holder, int index, | 2103 void DeserializeEmbedderFields(v8::Local<v8::Object> holder, int index, |
| 2104 v8::StartupData payload, void* data) { | 2104 v8::StartupData payload, void* data) { |
| 2105 CHECK_EQ(reinterpret_cast<void*>(2017), data); | 2105 CHECK_EQ(reinterpret_cast<void*>(2017), data); |
| 2106 InternalFieldData* internal_field = new InternalFieldData{0}; | 2106 EmbedderFieldData* embedder_field = new EmbedderFieldData{0}; |
| 2107 memcpy(internal_field, payload.data, payload.raw_size); | 2107 memcpy(embedder_field, payload.data, payload.raw_size); |
| 2108 holder->SetAlignedPointerInInternalField(index, internal_field); | 2108 holder->SetAlignedPointerInEmbedderField(index, embedder_field); |
| 2109 deserialized_data.push_back(internal_field); | 2109 deserialized_data.push_back(embedder_field); |
| 2110 } | 2110 } |
| 2111 | 2111 |
| 2112 TEST(SnapshotCreatorTemplates) { | 2112 TEST(SnapshotCreatorTemplates) { |
| 2113 DisableAlwaysOpt(); | 2113 DisableAlwaysOpt(); |
| 2114 v8::StartupData blob; | 2114 v8::StartupData blob; |
| 2115 | 2115 |
| 2116 { | 2116 { |
| 2117 InternalFieldData* a1 = new InternalFieldData{11}; | 2117 EmbedderFieldData* a1 = new EmbedderFieldData{11}; |
| 2118 InternalFieldData* b0 = new InternalFieldData{20}; | 2118 EmbedderFieldData* b0 = new EmbedderFieldData{20}; |
| 2119 InternalFieldData* c0 = new InternalFieldData{30}; | 2119 EmbedderFieldData* c0 = new EmbedderFieldData{30}; |
| 2120 | 2120 |
| 2121 v8::SnapshotCreator creator(original_external_references); | 2121 v8::SnapshotCreator creator(original_external_references); |
| 2122 v8::Isolate* isolate = creator.GetIsolate(); | 2122 v8::Isolate* isolate = creator.GetIsolate(); |
| 2123 { | 2123 { |
| 2124 v8::HandleScope handle_scope(isolate); | 2124 v8::HandleScope handle_scope(isolate); |
| 2125 v8::ExtensionConfiguration* no_extension = nullptr; | 2125 v8::ExtensionConfiguration* no_extension = nullptr; |
| 2126 v8::Local<v8::ObjectTemplate> global_template = | 2126 v8::Local<v8::ObjectTemplate> global_template = |
| 2127 v8::ObjectTemplate::New(isolate); | 2127 v8::ObjectTemplate::New(isolate); |
| 2128 v8::Local<v8::FunctionTemplate> callback = | 2128 v8::Local<v8::FunctionTemplate> callback = |
| 2129 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2129 v8::FunctionTemplate::New(isolate, SerializedCallback); |
| 2130 global_template->Set(v8_str("f"), callback); | 2130 global_template->Set(v8_str("f"), callback); |
| 2131 v8::Local<v8::Context> context = | 2131 v8::Local<v8::Context> context = |
| 2132 v8::Context::New(isolate, no_extension, global_template); | 2132 v8::Context::New(isolate, no_extension, global_template); |
| 2133 creator.SetDefaultContext(context); | 2133 creator.SetDefaultContext(context); |
| 2134 context = v8::Context::New(isolate, no_extension, global_template); | 2134 context = v8::Context::New(isolate, no_extension, global_template); |
| 2135 v8::Local<v8::ObjectTemplate> object_template = | 2135 v8::Local<v8::ObjectTemplate> object_template = |
| 2136 v8::ObjectTemplate::New(isolate); | 2136 v8::ObjectTemplate::New(isolate); |
| 2137 object_template->SetInternalFieldCount(3); | 2137 object_template->SetEmbedderFieldCount(3); |
| 2138 | 2138 |
| 2139 v8::Context::Scope context_scope(context); | 2139 v8::Context::Scope context_scope(context); |
| 2140 ExpectInt32("f()", 42); | 2140 ExpectInt32("f()", 42); |
| 2141 | 2141 |
| 2142 v8::Local<v8::Object> a = | 2142 v8::Local<v8::Object> a = |
| 2143 object_template->NewInstance(context).ToLocalChecked(); | 2143 object_template->NewInstance(context).ToLocalChecked(); |
| 2144 v8::Local<v8::Object> b = | 2144 v8::Local<v8::Object> b = |
| 2145 object_template->NewInstance(context).ToLocalChecked(); | 2145 object_template->NewInstance(context).ToLocalChecked(); |
| 2146 v8::Local<v8::Object> c = | 2146 v8::Local<v8::Object> c = |
| 2147 object_template->NewInstance(context).ToLocalChecked(); | 2147 object_template->NewInstance(context).ToLocalChecked(); |
| 2148 v8::Local<v8::External> null_external = | 2148 v8::Local<v8::External> null_external = |
| 2149 v8::External::New(isolate, nullptr); | 2149 v8::External::New(isolate, nullptr); |
| 2150 v8::Local<v8::External> field_external = | 2150 v8::Local<v8::External> field_external = |
| 2151 v8::External::New(isolate, &serialized_static_field); | 2151 v8::External::New(isolate, &serialized_static_field); |
| 2152 a->SetInternalField(0, b); | 2152 a->SetEmbedderField(0, b); |
| 2153 a->SetAlignedPointerInInternalField(1, a1); | 2153 a->SetAlignedPointerInEmbedderField(1, a1); |
| 2154 b->SetAlignedPointerInInternalField(0, b0); | 2154 b->SetAlignedPointerInEmbedderField(0, b0); |
| 2155 b->SetInternalField(1, c); | 2155 b->SetEmbedderField(1, c); |
| 2156 c->SetAlignedPointerInInternalField(0, c0); | 2156 c->SetAlignedPointerInEmbedderField(0, c0); |
| 2157 c->SetInternalField(1, null_external); | 2157 c->SetEmbedderField(1, null_external); |
| 2158 c->SetInternalField(2, field_external); | 2158 c->SetEmbedderField(2, field_external); |
| 2159 CHECK(context->Global()->Set(context, v8_str("a"), a).FromJust()); | 2159 CHECK(context->Global()->Set(context, v8_str("a"), a).FromJust()); |
| 2160 | 2160 |
| 2161 CHECK_EQ(0u, | 2161 CHECK_EQ(0u, |
| 2162 creator.AddContext(context, v8::SerializeInternalFieldsCallback( | 2162 creator.AddContext(context, v8::SerializeEmbedderFieldsCallback( |
| 2163 SerializeInternalFields, | 2163 SerializeEmbedderFields, |
| 2164 reinterpret_cast<void*>(2016)))); | 2164 reinterpret_cast<void*>(2016)))); |
| 2165 CHECK_EQ(0u, creator.AddTemplate(callback)); | 2165 CHECK_EQ(0u, creator.AddTemplate(callback)); |
| 2166 CHECK_EQ(1u, creator.AddTemplate(global_template)); | 2166 CHECK_EQ(1u, creator.AddTemplate(global_template)); |
| 2167 } | 2167 } |
| 2168 blob = | 2168 blob = |
| 2169 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); | 2169 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); |
| 2170 | 2170 |
| 2171 delete a1; | 2171 delete a1; |
| 2172 delete b0; | 2172 delete b0; |
| 2173 delete c0; | 2173 delete c0; |
| 2174 } | 2174 } |
| 2175 | 2175 |
| 2176 { | 2176 { |
| 2177 v8::Isolate::CreateParams params; | 2177 v8::Isolate::CreateParams params; |
| 2178 params.snapshot_blob = &blob; | 2178 params.snapshot_blob = &blob; |
| 2179 params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 2179 params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| 2180 params.external_references = original_external_references; | 2180 params.external_references = original_external_references; |
| 2181 v8::Isolate* isolate = v8::Isolate::New(params); | 2181 v8::Isolate* isolate = v8::Isolate::New(params); |
| 2182 { | 2182 { |
| 2183 v8::Isolate::Scope isolate_scope(isolate); | 2183 v8::Isolate::Scope isolate_scope(isolate); |
| 2184 { | 2184 { |
| 2185 // Create a new context without a new object template. | 2185 // Create a new context without a new object template. |
| 2186 v8::HandleScope handle_scope(isolate); | 2186 v8::HandleScope handle_scope(isolate); |
| 2187 v8::Local<v8::Context> context = | 2187 v8::Local<v8::Context> context = |
| 2188 v8::Context::FromSnapshot( | 2188 v8::Context::FromSnapshot( |
| 2189 isolate, 0, | 2189 isolate, 0, |
| 2190 v8::DeserializeInternalFieldsCallback( | 2190 v8::DeserializeEmbedderFieldsCallback( |
| 2191 DeserializeInternalFields, reinterpret_cast<void*>(2017))) | 2191 DeserializeEmbedderFields, reinterpret_cast<void*>(2017))) |
| 2192 .ToLocalChecked(); | 2192 .ToLocalChecked(); |
| 2193 v8::Context::Scope context_scope(context); | 2193 v8::Context::Scope context_scope(context); |
| 2194 ExpectInt32("f()", 42); | 2194 ExpectInt32("f()", 42); |
| 2195 | 2195 |
| 2196 // Retrieve the snapshotted object template. | 2196 // Retrieve the snapshotted object template. |
| 2197 v8::Local<v8::ObjectTemplate> obj_template = | 2197 v8::Local<v8::ObjectTemplate> obj_template = |
| 2198 v8::ObjectTemplate::FromSnapshot(isolate, 1).ToLocalChecked(); | 2198 v8::ObjectTemplate::FromSnapshot(isolate, 1).ToLocalChecked(); |
| 2199 CHECK(!obj_template.IsEmpty()); | 2199 CHECK(!obj_template.IsEmpty()); |
| 2200 v8::Local<v8::Object> object = | 2200 v8::Local<v8::Object> object = |
| 2201 obj_template->NewInstance(context).ToLocalChecked(); | 2201 obj_template->NewInstance(context).ToLocalChecked(); |
| 2202 CHECK(context->Global()->Set(context, v8_str("o"), object).FromJust()); | 2202 CHECK(context->Global()->Set(context, v8_str("o"), object).FromJust()); |
| 2203 ExpectInt32("o.f()", 42); | 2203 ExpectInt32("o.f()", 42); |
| 2204 // Check that it instantiates to the same prototype. | 2204 // Check that it instantiates to the same prototype. |
| 2205 ExpectTrue("o.f.prototype === f.prototype"); | 2205 ExpectTrue("o.f.prototype === f.prototype"); |
| 2206 | 2206 |
| 2207 // Retrieve the snapshotted function template. | 2207 // Retrieve the snapshotted function template. |
| 2208 v8::Local<v8::FunctionTemplate> fun_template = | 2208 v8::Local<v8::FunctionTemplate> fun_template = |
| 2209 v8::FunctionTemplate::FromSnapshot(isolate, 0).ToLocalChecked(); | 2209 v8::FunctionTemplate::FromSnapshot(isolate, 0).ToLocalChecked(); |
| 2210 CHECK(!fun_template.IsEmpty()); | 2210 CHECK(!fun_template.IsEmpty()); |
| 2211 v8::Local<v8::Function> fun = | 2211 v8::Local<v8::Function> fun = |
| 2212 fun_template->GetFunction(context).ToLocalChecked(); | 2212 fun_template->GetFunction(context).ToLocalChecked(); |
| 2213 CHECK(context->Global()->Set(context, v8_str("g"), fun).FromJust()); | 2213 CHECK(context->Global()->Set(context, v8_str("g"), fun).FromJust()); |
| 2214 ExpectInt32("g()", 42); | 2214 ExpectInt32("g()", 42); |
| 2215 // Check that it instantiates to the same prototype. | 2215 // Check that it instantiates to the same prototype. |
| 2216 ExpectTrue("g.prototype === f.prototype"); | 2216 ExpectTrue("g.prototype === f.prototype"); |
| 2217 | 2217 |
| 2218 // Retrieve internal fields. | 2218 // Retrieve embedder fields. |
| 2219 v8::Local<v8::Object> a = context->Global() | 2219 v8::Local<v8::Object> a = context->Global() |
| 2220 ->Get(context, v8_str("a")) | 2220 ->Get(context, v8_str("a")) |
| 2221 .ToLocalChecked() | 2221 .ToLocalChecked() |
| 2222 ->ToObject(context) | 2222 ->ToObject(context) |
| 2223 .ToLocalChecked(); | 2223 .ToLocalChecked(); |
| 2224 v8::Local<v8::Object> b = | 2224 v8::Local<v8::Object> b = |
| 2225 a->GetInternalField(0)->ToObject(context).ToLocalChecked(); | 2225 a->GetEmbedderField(0)->ToObject(context).ToLocalChecked(); |
| 2226 InternalFieldData* a1 = reinterpret_cast<InternalFieldData*>( | 2226 EmbedderFieldData* a1 = reinterpret_cast<EmbedderFieldData*>( |
| 2227 a->GetAlignedPointerFromInternalField(1)); | 2227 a->GetAlignedPointerFromEmbedderField(1)); |
| 2228 v8::Local<v8::Value> a2 = a->GetInternalField(2); | 2228 v8::Local<v8::Value> a2 = a->GetEmbedderField(2); |
| 2229 | 2229 |
| 2230 InternalFieldData* b0 = reinterpret_cast<InternalFieldData*>( | 2230 EmbedderFieldData* b0 = reinterpret_cast<EmbedderFieldData*>( |
| 2231 b->GetAlignedPointerFromInternalField(0)); | 2231 b->GetAlignedPointerFromEmbedderField(0)); |
| 2232 v8::Local<v8::Object> c = | 2232 v8::Local<v8::Object> c = |
| 2233 b->GetInternalField(1)->ToObject(context).ToLocalChecked(); | 2233 b->GetEmbedderField(1)->ToObject(context).ToLocalChecked(); |
| 2234 v8::Local<v8::Value> b2 = b->GetInternalField(2); | 2234 v8::Local<v8::Value> b2 = b->GetEmbedderField(2); |
| 2235 | 2235 |
| 2236 InternalFieldData* c0 = reinterpret_cast<InternalFieldData*>( | 2236 EmbedderFieldData* c0 = reinterpret_cast<EmbedderFieldData*>( |
| 2237 c->GetAlignedPointerFromInternalField(0)); | 2237 c->GetAlignedPointerFromEmbedderField(0)); |
| 2238 v8::Local<v8::Value> c1 = c->GetInternalField(1); | 2238 v8::Local<v8::Value> c1 = c->GetEmbedderField(1); |
| 2239 v8::Local<v8::Value> c2 = c->GetInternalField(2); | 2239 v8::Local<v8::Value> c2 = c->GetEmbedderField(2); |
| 2240 | 2240 |
| 2241 CHECK_EQ(11u, a1->data); | 2241 CHECK_EQ(11u, a1->data); |
| 2242 CHECK(a2->IsUndefined()); | 2242 CHECK(a2->IsUndefined()); |
| 2243 CHECK_EQ(20u, b0->data); | 2243 CHECK_EQ(20u, b0->data); |
| 2244 CHECK(b2->IsUndefined()); | 2244 CHECK(b2->IsUndefined()); |
| 2245 CHECK_EQ(30u, c0->data); | 2245 CHECK_EQ(30u, c0->data); |
| 2246 CHECK(c1->IsExternal()); | 2246 CHECK(c1->IsExternal()); |
| 2247 CHECK_NULL(v8::Local<v8::External>::Cast(c1)->Value()); | 2247 CHECK_NULL(v8::Local<v8::External>::Cast(c1)->Value()); |
| 2248 CHECK_EQ(static_cast<void*>(&serialized_static_field), | 2248 CHECK_EQ(static_cast<void*>(&serialized_static_field), |
| 2249 v8::Local<v8::External>::Cast(c2)->Value()); | 2249 v8::Local<v8::External>::Cast(c2)->Value()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2298 { | 2298 { |
| 2299 // Add additional context. This context implicitly *does* serialize | 2299 // Add additional context. This context implicitly *does* serialize |
| 2300 // the global proxy, and upon deserialization one has to be created | 2300 // the global proxy, and upon deserialization one has to be created |
| 2301 // in the bootstrapper from the global object template. | 2301 // in the bootstrapper from the global object template. |
| 2302 // Side effects from extensions are persisted. | 2302 // Side effects from extensions are persisted. |
| 2303 v8::HandleScope handle_scope(isolate); | 2303 v8::HandleScope handle_scope(isolate); |
| 2304 v8::Local<v8::ObjectTemplate> global_template = | 2304 v8::Local<v8::ObjectTemplate> global_template = |
| 2305 v8::ObjectTemplate::New(isolate); | 2305 v8::ObjectTemplate::New(isolate); |
| 2306 v8::Local<v8::FunctionTemplate> callback = | 2306 v8::Local<v8::FunctionTemplate> callback = |
| 2307 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2307 v8::FunctionTemplate::New(isolate, SerializedCallback); |
| 2308 global_template->SetInternalFieldCount(3); | 2308 global_template->SetEmbedderFieldCount(3); |
| 2309 global_template->Set(v8_str("f"), callback); | 2309 global_template->Set(v8_str("f"), callback); |
| 2310 global_template->SetHandler(v8::NamedPropertyHandlerConfiguration( | 2310 global_template->SetHandler(v8::NamedPropertyHandlerConfiguration( |
| 2311 NamedPropertyGetterForSerialization)); | 2311 NamedPropertyGetterForSerialization)); |
| 2312 global_template->SetAccessor(v8_str("y"), AccessorForSerialization); | 2312 global_template->SetAccessor(v8_str("y"), AccessorForSerialization); |
| 2313 v8::Local<v8::Private> priv = | 2313 v8::Local<v8::Private> priv = |
| 2314 v8::Private::ForApi(isolate, v8_str("cached")); | 2314 v8::Private::ForApi(isolate, v8_str("cached")); |
| 2315 global_template->SetAccessorProperty( | 2315 global_template->SetAccessorProperty( |
| 2316 v8_str("cached"), | 2316 v8_str("cached"), |
| 2317 v8::FunctionTemplate::NewWithCache(isolate, SerializedCallback, priv, | 2317 v8::FunctionTemplate::NewWithCache(isolate, SerializedCallback, priv, |
| 2318 v8::Local<v8::Value>())); | 2318 v8::Local<v8::Value>())); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2335 ExpectInt32("o.p", 7); | 2335 ExpectInt32("o.p", 7); |
| 2336 ExpectInt32("x", 2016); | 2336 ExpectInt32("x", 2016); |
| 2337 ExpectInt32("y", 2017); | 2337 ExpectInt32("y", 2017); |
| 2338 CHECK(v8_str("hidden string") | 2338 CHECK(v8_str("hidden string") |
| 2339 ->Equals(context, context->Global() | 2339 ->Equals(context, context->Global() |
| 2340 ->GetPrivate(context, hidden) | 2340 ->GetPrivate(context, hidden) |
| 2341 .ToLocalChecked()) | 2341 .ToLocalChecked()) |
| 2342 .FromJust()); | 2342 .FromJust()); |
| 2343 | 2343 |
| 2344 CHECK_EQ(0u, | 2344 CHECK_EQ(0u, |
| 2345 creator.AddContext(context, v8::SerializeInternalFieldsCallback( | 2345 creator.AddContext(context, v8::SerializeEmbedderFieldsCallback( |
| 2346 SerializeInternalFields, | 2346 SerializeEmbedderFields, |
| 2347 reinterpret_cast<void*>(2016)))); | 2347 reinterpret_cast<void*>(2016)))); |
| 2348 } | 2348 } |
| 2349 blob = | 2349 blob = |
| 2350 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); | 2350 creator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kClear); |
| 2351 } | 2351 } |
| 2352 | 2352 |
| 2353 { | 2353 { |
| 2354 v8::Isolate::CreateParams params; | 2354 v8::Isolate::CreateParams params; |
| 2355 params.snapshot_blob = &blob; | 2355 params.snapshot_blob = &blob; |
| 2356 params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 2356 params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 2383 CHECK(CompileRun("x").IsEmpty()); | 2383 CHECK(CompileRun("x").IsEmpty()); |
| 2384 CHECK(try_catch.HasCaught()); | 2384 CHECK(try_catch.HasCaught()); |
| 2385 } | 2385 } |
| 2386 { | 2386 { |
| 2387 // Create a new context from first additional context snapshot. This | 2387 // Create a new context from first additional context snapshot. This |
| 2388 // will use the global object from the snapshot, including interceptor. | 2388 // will use the global object from the snapshot, including interceptor. |
| 2389 v8::HandleScope handle_scope(isolate); | 2389 v8::HandleScope handle_scope(isolate); |
| 2390 v8::Local<v8::Context> context = | 2390 v8::Local<v8::Context> context = |
| 2391 v8::Context::FromSnapshot( | 2391 v8::Context::FromSnapshot( |
| 2392 isolate, 0, | 2392 isolate, 0, |
| 2393 v8::DeserializeInternalFieldsCallback( | 2393 v8::DeserializeEmbedderFieldsCallback( |
| 2394 DeserializeInternalFields, reinterpret_cast<void*>(2017))) | 2394 DeserializeEmbedderFields, reinterpret_cast<void*>(2017))) |
| 2395 .ToLocalChecked(); | 2395 .ToLocalChecked(); |
| 2396 | 2396 |
| 2397 { | 2397 { |
| 2398 v8::Context::Scope context_scope(context); | 2398 v8::Context::Scope context_scope(context); |
| 2399 ExpectInt32("f()", 42); | 2399 ExpectInt32("f()", 42); |
| 2400 ExpectInt32("g()", 12); | 2400 ExpectInt32("g()", 12); |
| 2401 ExpectInt32("h()", 13); | 2401 ExpectInt32("h()", 13); |
| 2402 ExpectInt32("i()", 24); | 2402 ExpectInt32("i()", 24); |
| 2403 ExpectInt32("j()", 25); | 2403 ExpectInt32("j()", 25); |
| 2404 ExpectInt32("o.p", 8); | 2404 ExpectInt32("o.p", 8); |
| 2405 ExpectInt32("x", 2016); | 2405 ExpectInt32("x", 2016); |
| 2406 v8::Local<v8::Private> hidden = | 2406 v8::Local<v8::Private> hidden = |
| 2407 v8::Private::ForApi(isolate, v8_str("hidden")); | 2407 v8::Private::ForApi(isolate, v8_str("hidden")); |
| 2408 CHECK(v8_str("hidden string") | 2408 CHECK(v8_str("hidden string") |
| 2409 ->Equals(context, context->Global() | 2409 ->Equals(context, context->Global() |
| 2410 ->GetPrivate(context, hidden) | 2410 ->GetPrivate(context, hidden) |
| 2411 .ToLocalChecked()) | 2411 .ToLocalChecked()) |
| 2412 .FromJust()); | 2412 .FromJust()); |
| 2413 ExpectString("cached", "cached string"); | 2413 ExpectString("cached", "cached string"); |
| 2414 } | 2414 } |
| 2415 | 2415 |
| 2416 v8::Local<v8::Object> global = context->Global(); | 2416 v8::Local<v8::Object> global = context->Global(); |
| 2417 CHECK_EQ(3, global->InternalFieldCount()); | 2417 CHECK_EQ(3, global->EmbedderFieldCount()); |
| 2418 context->DetachGlobal(); | 2418 context->DetachGlobal(); |
| 2419 | 2419 |
| 2420 // New context, but reuse global proxy. | 2420 // New context, but reuse global proxy. |
| 2421 v8::ExtensionConfiguration* no_extensions = nullptr; | 2421 v8::ExtensionConfiguration* no_extensions = nullptr; |
| 2422 v8::Local<v8::Context> context2 = | 2422 v8::Local<v8::Context> context2 = |
| 2423 v8::Context::FromSnapshot( | 2423 v8::Context::FromSnapshot( |
| 2424 isolate, 0, | 2424 isolate, 0, |
| 2425 v8::DeserializeInternalFieldsCallback( | 2425 v8::DeserializeEmbedderFieldsCallback( |
| 2426 DeserializeInternalFields, reinterpret_cast<void*>(2017)), | 2426 DeserializeEmbedderFields, reinterpret_cast<void*>(2017)), |
| 2427 no_extensions, global) | 2427 no_extensions, global) |
| 2428 .ToLocalChecked(); | 2428 .ToLocalChecked(); |
| 2429 { | 2429 { |
| 2430 v8::Context::Scope context_scope(context2); | 2430 v8::Context::Scope context_scope(context2); |
| 2431 ExpectInt32("f()", 42); | 2431 ExpectInt32("f()", 42); |
| 2432 ExpectInt32("g()", 12); | 2432 ExpectInt32("g()", 12); |
| 2433 ExpectInt32("h()", 13); | 2433 ExpectInt32("h()", 13); |
| 2434 ExpectInt32("i()", 24); | 2434 ExpectInt32("i()", 24); |
| 2435 ExpectInt32("j()", 25); | 2435 ExpectInt32("j()", 25); |
| 2436 ExpectInt32("o.p", 8); | 2436 ExpectInt32("o.p", 8); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2459 } | 2459 } |
| 2460 delete[] blob.data; | 2460 delete[] blob.data; |
| 2461 } | 2461 } |
| 2462 | 2462 |
| 2463 TEST(SerializationMemoryStats) { | 2463 TEST(SerializationMemoryStats) { |
| 2464 FLAG_profile_deserialization = true; | 2464 FLAG_profile_deserialization = true; |
| 2465 FLAG_always_opt = false; | 2465 FLAG_always_opt = false; |
| 2466 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); | 2466 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); |
| 2467 delete[] blob.data; | 2467 delete[] blob.data; |
| 2468 } | 2468 } |
| OLD | NEW |