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