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

Side by Side Diff: src/api.cc

Issue 2585693002: [serializer] allocate global proxy with the expected size. (Closed)
Patch Set: Created 4 years 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
« no previous file with comments | « no previous file | src/bootstrapper.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 } 544 }
545 545
546 StartupData SnapshotCreator::CreateBlob( 546 StartupData SnapshotCreator::CreateBlob(
547 SnapshotCreator::FunctionCodeHandling function_code_handling, 547 SnapshotCreator::FunctionCodeHandling function_code_handling,
548 SerializeInternalFieldsCallback callback) { 548 SerializeInternalFieldsCallback callback) {
549 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_); 549 SnapshotCreatorData* data = SnapshotCreatorData::cast(data_);
550 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_); 550 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(data->isolate_);
551 DCHECK(!data->created_); 551 DCHECK(!data->created_);
552 DCHECK(!data->default_context_.IsEmpty()); 552 DCHECK(!data->default_context_.IsEmpty());
553 553
554 int num_additional_contexts = static_cast<int>(data->contexts_.Size());
555
554 { 556 {
555 int num_templates = static_cast<int>(data->templates_.Size()); 557 int num_templates = static_cast<int>(data->templates_.Size());
556 i::HandleScope scope(isolate); 558 i::HandleScope scope(isolate);
557 i::Handle<i::FixedArray> templates = 559 i::Handle<i::FixedArray> templates =
558 isolate->factory()->NewFixedArray(num_templates, i::TENURED); 560 isolate->factory()->NewFixedArray(num_templates, i::TENURED);
559 for (int i = 0; i < num_templates; i++) { 561 for (int i = 0; i < num_templates; i++) {
560 templates->set(i, *v8::Utils::OpenHandle(*data->templates_.Get(i))); 562 templates->set(i, *v8::Utils::OpenHandle(*data->templates_.Get(i)));
561 } 563 }
562 isolate->heap()->SetSerializedTemplates(*templates); 564 isolate->heap()->SetSerializedTemplates(*templates);
563 data->templates_.Clear(); 565 data->templates_.Clear();
566
567 // We need to store the global proxy size upfront in case we need the
568 // bootstrapper to create a global proxy before we deserialize the context.
569 i::Handle<i::FixedArray> global_proxy_sizes =
570 isolate->factory()->NewFixedArray(num_additional_contexts, i::TENURED);
571 for (int i = 0; i < num_additional_contexts; i++) {
572 i::Handle<i::Context> context =
573 v8::Utils::OpenHandle(*data->contexts_.Get(i));
574 global_proxy_sizes->set(i,
575 i::Smi::FromInt(context->global_proxy()->Size()));
576 }
577 isolate->heap()->SetSerializedGlobalProxySizes(*global_proxy_sizes);
564 } 578 }
565 579
566 // If we don't do this then we end up with a stray root pointing at the 580 // If we don't do this then we end up with a stray root pointing at the
567 // context even after we have disposed of the context. 581 // context even after we have disposed of the context.
568 isolate->heap()->CollectAllAvailableGarbage( 582 isolate->heap()->CollectAllAvailableGarbage(
569 i::GarbageCollectionReason::kSnapshotCreator); 583 i::GarbageCollectionReason::kSnapshotCreator);
570 isolate->heap()->CompactWeakFixedArrays(); 584 isolate->heap()->CompactWeakFixedArrays();
571 585
572 i::DisallowHeapAllocation no_gc_from_here_on; 586 i::DisallowHeapAllocation no_gc_from_here_on;
573 587
574 int num_additional_contexts = static_cast<int>(data->contexts_.Size());
575 i::List<i::Object*> contexts(num_additional_contexts); 588 i::List<i::Object*> contexts(num_additional_contexts);
576 i::Object* default_context; 589 i::Object* default_context;
577 { 590 {
578 i::HandleScope scope(isolate); 591 i::HandleScope scope(isolate);
579 default_context = 592 default_context =
580 *v8::Utils::OpenHandle(*data->default_context_.Get(data->isolate_)); 593 *v8::Utils::OpenHandle(*data->default_context_.Get(data->isolate_));
581 data->default_context_.Reset(); 594 data->default_context_.Reset();
582 for (int i = 0; i < num_additional_contexts; i++) { 595 for (int i = 0; i < num_additional_contexts; i++) {
583 i::Handle<i::Context> context = 596 i::Handle<i::Context> context =
584 v8::Utils::OpenHandle(*data->contexts_.Get(i)); 597 v8::Utils::OpenHandle(*data->contexts_.Get(i));
(...skipping 9311 matching lines...) Expand 10 before | Expand all | Expand 10 after
9896 Address callback_address = 9909 Address callback_address =
9897 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9910 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
9898 VMState<EXTERNAL> state(isolate); 9911 VMState<EXTERNAL> state(isolate);
9899 ExternalCallbackScope call_scope(isolate, callback_address); 9912 ExternalCallbackScope call_scope(isolate, callback_address);
9900 callback(info); 9913 callback(info);
9901 } 9914 }
9902 9915
9903 9916
9904 } // namespace internal 9917 } // namespace internal
9905 } // namespace v8 9918 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/bootstrapper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698