OLD | NEW |
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 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 | 488 |
489 | 489 |
490 Isolate* Dart::CreateIsolate(const char* name_prefix, | 490 Isolate* Dart::CreateIsolate(const char* name_prefix, |
491 const Dart_IsolateFlags& api_flags) { | 491 const Dart_IsolateFlags& api_flags) { |
492 // Create a new isolate. | 492 // Create a new isolate. |
493 Isolate* isolate = Isolate::Init(name_prefix, api_flags); | 493 Isolate* isolate = Isolate::Init(name_prefix, api_flags); |
494 return isolate; | 494 return isolate; |
495 } | 495 } |
496 | 496 |
497 | 497 |
498 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, void* data) { | 498 RawError* Dart::InitializeIsolate(const uint8_t* snapshot_buffer, |
| 499 intptr_t snapshot_length, |
| 500 bool from_kernel, |
| 501 void* data) { |
499 // Initialize the new isolate. | 502 // Initialize the new isolate. |
500 Thread* T = Thread::Current(); | 503 Thread* T = Thread::Current(); |
501 Isolate* I = T->isolate(); | 504 Isolate* I = T->isolate(); |
502 NOT_IN_PRODUCT( | 505 NOT_IN_PRODUCT( |
503 TimelineDurationScope tds(T, | 506 TimelineDurationScope tds(T, |
504 Timeline::GetIsolateStream(), | 507 Timeline::GetIsolateStream(), |
505 "InitializeIsolate"); | 508 "InitializeIsolate"); |
506 tds.SetNumArguments(1); | 509 tds.SetNumArguments(1); |
507 tds.CopyArgument(0, "isolateName", I->name()); | 510 tds.CopyArgument(0, "isolateName", I->name()); |
508 ) | 511 ) |
509 ASSERT(I != NULL); | 512 ASSERT(I != NULL); |
510 StackZone zone(T); | 513 StackZone zone(T); |
511 HandleScope handle_scope(T); | 514 HandleScope handle_scope(T); |
512 { | 515 { |
513 NOT_IN_PRODUCT(TimelineDurationScope tds(T, | 516 NOT_IN_PRODUCT(TimelineDurationScope tds(T, |
514 Timeline::GetIsolateStream(), "ObjectStore::Init")); | 517 Timeline::GetIsolateStream(), "ObjectStore::Init")); |
515 ObjectStore::Init(I); | 518 ObjectStore::Init(I); |
516 } | 519 } |
517 | 520 |
518 const Error& error = Error::Handle(Object::Init(I)); | 521 Error& error = Error::Handle(T->zone()); |
| 522 if (from_kernel) { |
| 523 ASSERT(snapshot_buffer != NULL); |
| 524 ASSERT(snapshot_length > 0); |
| 525 error = Object::Init(I, snapshot_buffer, snapshot_length); |
| 526 } else { |
| 527 error = Object::Init(I, NULL, -1); |
| 528 } |
519 if (!error.IsNull()) { | 529 if (!error.IsNull()) { |
520 return error.raw(); | 530 return error.raw(); |
521 } | 531 } |
522 if (snapshot_buffer != NULL) { | 532 if ((snapshot_buffer != NULL) && !from_kernel) { |
523 // Read the snapshot and setup the initial state. | 533 // Read the snapshot and setup the initial state. |
524 NOT_IN_PRODUCT(TimelineDurationScope tds(T, | 534 NOT_IN_PRODUCT(TimelineDurationScope tds(T, |
525 Timeline::GetIsolateStream(), "IsolateSnapshotReader")); | 535 Timeline::GetIsolateStream(), "IsolateSnapshotReader")); |
526 // TODO(turnidge): Remove once length is not part of the snapshot. | 536 // TODO(turnidge): Remove once length is not part of the snapshot. |
527 const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer); | 537 const Snapshot* snapshot = Snapshot::SetupFromBuffer(snapshot_buffer); |
528 if (snapshot == NULL) { | 538 if (snapshot == NULL) { |
529 const String& message = String::Handle( | 539 const String& message = String::Handle( |
530 String::New("Invalid snapshot")); | 540 String::New("Invalid snapshot")); |
531 return ApiError::New(message); | 541 return ApiError::New(message); |
532 } | 542 } |
(...skipping 16 matching lines...) Expand all Loading... |
549 tds.SetNumArguments(2); | 559 tds.SetNumArguments(2); |
550 tds.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length()); | 560 tds.FormatArgument(0, "snapshotSize", "%" Pd, snapshot->length()); |
551 tds.FormatArgument(1, "heapSize", "%" Pd64, | 561 tds.FormatArgument(1, "heapSize", "%" Pd64, |
552 I->heap()->UsedInWords(Heap::kOld) * kWordSize); | 562 I->heap()->UsedInWords(Heap::kOld) * kWordSize); |
553 }); | 563 }); |
554 if (FLAG_trace_isolates) { | 564 if (FLAG_trace_isolates) { |
555 I->heap()->PrintSizes(); | 565 I->heap()->PrintSizes(); |
556 MegamorphicCacheTable::PrintSizes(I); | 566 MegamorphicCacheTable::PrintSizes(I); |
557 } | 567 } |
558 } else { | 568 } else { |
559 if (snapshot_kind_ != Snapshot::kNone) { | 569 if ((snapshot_kind_ != Snapshot::kNone) && !from_kernel) { |
560 const String& message = String::Handle( | 570 const String& message = String::Handle( |
561 String::New("Missing isolate snapshot")); | 571 String::New("Missing isolate snapshot")); |
562 return ApiError::New(message); | 572 return ApiError::New(message); |
563 } | 573 } |
564 } | 574 } |
565 | 575 |
566 Object::VerifyBuiltinVtables(); | 576 Object::VerifyBuiltinVtables(); |
567 DEBUG_ONLY(I->heap()->Verify(kForbidMarked)); | 577 DEBUG_ONLY(I->heap()->Verify(kForbidMarked)); |
568 | 578 |
569 { | 579 { |
570 NOT_IN_PRODUCT(TimelineDurationScope tds(T, | 580 NOT_IN_PRODUCT(TimelineDurationScope tds(T, |
571 Timeline::GetIsolateStream(), "StubCode::Init")); | 581 Timeline::GetIsolateStream(), "StubCode::Init")); |
572 StubCode::Init(I); | 582 StubCode::Init(I); |
573 } | 583 } |
574 | 584 |
575 #if !defined(DART_PRECOMPILED_RUNTIME) | 585 #if !defined(DART_PRECOMPILED_RUNTIME) |
576 // When running precompiled, the megamorphic miss function/code comes from the | 586 // When running precompiled, the megamorphic miss function/code comes from the |
577 // snapshot. | 587 // snapshot. |
578 if (!Snapshot::IncludesCode(Dart::snapshot_kind())) { | 588 if (!Snapshot::IncludesCode(Dart::snapshot_kind())) { |
579 MegamorphicCacheTable::InitMissHandler(I); | 589 MegamorphicCacheTable::InitMissHandler(I); |
580 } | 590 } |
581 #endif | 591 #endif |
582 | 592 |
583 const Code& miss_code = | 593 const Code& miss_code = |
584 Code::Handle(I->object_store()->megamorphic_miss_code()); | 594 Code::Handle(I->object_store()->megamorphic_miss_code()); |
585 I->set_ic_miss_code(miss_code); | 595 I->set_ic_miss_code(miss_code); |
586 | 596 |
587 if (snapshot_buffer == NULL) { | 597 if ((snapshot_buffer == NULL) || from_kernel) { |
588 const Error& error = Error::Handle(I->object_store()->PreallocateObjects()); | 598 const Error& error = Error::Handle(I->object_store()->PreallocateObjects()); |
589 if (!error.IsNull()) { | 599 if (!error.IsNull()) { |
590 return error.raw(); | 600 return error.raw(); |
591 } | 601 } |
592 } | 602 } |
593 | 603 |
594 I->heap()->InitGrowthControl(); | 604 I->heap()->InitGrowthControl(); |
595 I->set_init_callback_data(data); | 605 I->set_init_callback_data(data); |
596 Api::SetupAcquiredError(I); | 606 Api::SetupAcquiredError(I); |
597 if (FLAG_print_class_table) { | 607 if (FLAG_print_class_table) { |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 return predefined_handles_->handles_.IsValidScopedHandle(address); | 739 return predefined_handles_->handles_.IsValidScopedHandle(address); |
730 } | 740 } |
731 | 741 |
732 | 742 |
733 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { | 743 bool Dart::IsReadOnlyApiHandle(Dart_Handle handle) { |
734 ASSERT(predefined_handles_ != NULL); | 744 ASSERT(predefined_handles_ != NULL); |
735 return predefined_handles_->api_handles_.IsValidHandle(handle); | 745 return predefined_handles_->api_handles_.IsValidHandle(handle); |
736 } | 746 } |
737 | 747 |
738 } // namespace dart | 748 } // namespace dart |
OLD | NEW |