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

Side by Side Diff: runtime/vm/dart.cc

Issue 2485993002: VM: Support bootstrapping core libraries from Kernel binaries instead of source. (Closed)
Patch Set: Done Created 4 years, 1 month 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 (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/dart.h" 5 #include "vm/dart.h"
6 6
7 #include "vm/become.h" 7 #include "vm/become.h"
8 #include "vm/clustered_snapshot.h" 8 #include "vm/clustered_snapshot.h"
9 #include "vm/code_observers.h" 9 #include "vm/code_observers.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 484
485 485
486 Isolate* Dart::CreateIsolate(const char* name_prefix, 486 Isolate* Dart::CreateIsolate(const char* name_prefix,
487 const Dart_IsolateFlags& api_flags) { 487 const Dart_IsolateFlags& api_flags) {
488 // Create a new isolate. 488 // Create a new isolate.
489 Isolate* isolate = Isolate::Init(name_prefix, api_flags); 489 Isolate* isolate = Isolate::Init(name_prefix, api_flags);
490 return isolate; 490 return isolate;
491 } 491 }
492 492
493 493
494 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) { 494 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer,
495 intptr_t snapshot_length,
496 bool from_kernel,
497 void* data) {
495 // Initialize the new isolate. 498 // Initialize the new isolate.
496 Thread* T = Thread::Current(); 499 Thread* T = Thread::Current();
497 Isolate* I = T->isolate(); 500 Isolate* I = T->isolate();
498 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(), 501 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
499 "InitializeIsolate"); 502 "InitializeIsolate");
500 tds.SetNumArguments(1); 503 tds.SetNumArguments(1);
501 tds.CopyArgument(0, "isolateName", I->name());) 504 tds.CopyArgument(0, "isolateName", I->name());)
502 ASSERT(I != NULL); 505 ASSERT(I != NULL);
503 StackZone zone(T); 506 StackZone zone(T);
504 HandleScope handle_scope(T); 507 HandleScope handle_scope(T);
505 { 508 {
506 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(), 509 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
507 "ObjectStore::Init")); 510 "ObjectStore::Init"));
508 ObjectStore::Init(I); 511 ObjectStore::Init(I);
509 } 512 }
510 513
511 const Error& error = Error::Handle(Object::Init(I)); 514 Error& error = Error::Handle(T->zone());
515 if (from_kernel) {
516 ASSERT(snapshot_buffer != NULL);
517 ASSERT(snapshot_length > 0);
518 error = Object::Init(I, snapshot_buffer, snapshot_length);
519 } else {
520 error = Object::Init(I, NULL, -1);
521 }
512 if (!error.IsNull()) { 522 if (!error.IsNull()) {
513 return error.raw(); 523 return error.raw();
514 } 524 }
515 if (snapshot_buffer != NULL) { 525 if ((snapshot_buffer != NULL) && !from_kernel) {
516 // Read the snapshot and setup the initial state. 526 // Read the snapshot and setup the initial state.
517 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(), 527 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
518 "IsolateSnapshotReader")); 528 "IsolateSnapshotReader"));
519 // TODO(turnidge): Remove once length is not part of the snapshot. 529 // TODO(turnidge): Remove once length is not part of the snapshot.
520 const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer); 530 const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer);
521 if (snapshot == NULL) { 531 if (snapshot == NULL) {
522 const String& message = String::Handle(String::New("Invalid snapshot")); 532 const String& message = String::Handle(String::New("Invalid snapshot"));
523 return ApiError::New(message); 533 return ApiError::New(message);
524 } 534 }
525 if (snapshot->kind() != snapshot_kind_) { 535 if (snapshot->kind() != snapshot_kind_) {
(...skipping 20 matching lines...) Expand all
546 tds.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length()); 556 tds.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length());
547 tds.FormatArgument(1, "heapSize", "%" Pd64, 557 tds.FormatArgument(1, "heapSize", "%" Pd64,
548 I->heap()->UsedInWords(Heap::kOld) * kWordSize); 558 I->heap()->UsedInWords(Heap::kOld) * kWordSize);
549 } 559 }
550 #endif // !defined(PRODUCT) 560 #endif // !defined(PRODUCT)
551 if (FLAG_trace_isolates) { 561 if (FLAG_trace_isolates) {
552 I->heap()->PrintSizes(); 562 I->heap()->PrintSizes();
553 MegamorphicCacheTable::PrintSizes(I); 563 MegamorphicCacheTable::PrintSizes(I);
554 } 564 }
555 } else { 565 } else {
556 if (snapshot_kind_ != Snapshot::kNone) { 566 if ((snapshot_kind_ != Snapshot::kNone) && !from_kernel) {
557 const String& message = 567 const String& message =
558 String::Handle(String::New("Missing isolate snapshot")); 568 String::Handle(String::New("Missing isolate snapshot"));
559 return ApiError::New(message); 569 return ApiError::New(message);
560 } 570 }
561 } 571 }
562 572
563 Object::VerifyBuiltinVtables(); 573 Object::VerifyBuiltinVtables();
564 DEBUG_ONLY(I->heap()->Verify(kForbidMarked)); 574 DEBUG_ONLY(I->heap()->Verify(kForbidMarked));
565 575
566 { 576 {
567 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(), 577 NOT_IN_PRODUCT(TimelineDurationScope tds(T, Timeline::GetIsolateStream(),
568 "StubCode::Init")); 578 "StubCode::Init"));
569 StubCode::Init(I); 579 StubCode::Init(I);
570 } 580 }
571 581
572 #if !defined(DART_PRECOMPILED_RUNTIME) 582 #if !defined(DART_PRECOMPILED_RUNTIME)
573 // When running precompiled, the megamorphic miss function/code comes from the 583 // When running precompiled, the megamorphic miss function/code comes from the
574 // snapshot. 584 // snapshot.
575 if (!Snapshot::IncludesCode(Dart::snapshot_kind())) { 585 if (!Snapshot::IncludesCode(Dart::snapshot_kind())) {
576 MegamorphicCacheTable::InitMissHandler(I); 586 MegamorphicCacheTable::InitMissHandler(I);
577 } 587 }
578 #endif 588 #endif
579 589
580 const Code& miss_code = 590 const Code& miss_code =
581 Code::Handle(I->object_store()->megamorphic_miss_code()); 591 Code::Handle(I->object_store()->megamorphic_miss_code());
582 I->set_ic_miss_code(miss_code); 592 I->set_ic_miss_code(miss_code);
583 593
584 if (snapshot_buffer == NULL) { 594 if ((snapshot_buffer == NULL) || from_kernel) {
585 const Error& error = Error::Handle(I->object_store()->PreallocateObjects()); 595 const Error& error = Error::Handle(I->object_store()->PreallocateObjects());
586 if (!error.IsNull()) { 596 if (!error.IsNull()) {
587 return error.raw(); 597 return error.raw();
588 } 598 }
589 } 599 }
590 600
591 I->heap()->InitGrowthControl(); 601 I->heap()->InitGrowthControl();
592 I->set_init_callback_data(data); 602 I->set_init_callback_data(data);
593 Api::SetupAcquiredError(I); 603 Api::SetupAcquiredError(I);
594 if (FLAG_print_class_table) { 604 if (FLAG_print_class_table) {
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 return predefined_handles_->handles_.IsValidScopedHandle(address); 735 return predefined_handles_->handles_.IsValidScopedHandle(address);
726 } 736 }
727 737
728 738
729 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { 739 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) {
730 ASSERT(predefined_handles_ != NULL); 740 ASSERT(predefined_handles_ != NULL);
731 return predefined_handles_->api_handles_.IsValidHandle(handle); 741 return predefined_handles_->api_handles_.IsValidHandle(handle);
732 } 742 }
733 743
734 } // namespace dart 744 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698