| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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/isolate_reload.h" | 5 #include "vm/isolate_reload.h" |
| 6 | 6 |
| 7 #include "vm/become.h" | 7 #include "vm/become.h" |
| 8 #include "vm/bit_vector.h" | 8 #include "vm/bit_vector.h" |
| 9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 41 #define I (isolate()) | 41 #define I (isolate()) |
| 42 #define Z (thread->zone()) | 42 #define Z (thread->zone()) |
| 43 | 43 |
| 44 #define TIMELINE_SCOPE(name) \ | 44 #define TIMELINE_SCOPE(name) \ |
| 45 TimelineDurationScope tds##name(Thread::Current(), \ | 45 TimelineDurationScope tds##name(Thread::Current(), \ |
| 46 Timeline::GetIsolateStream(), \ | 46 Timeline::GetIsolateStream(), \ |
| 47 #name) | 47 #name) |
| 48 | 48 |
| 49 | 49 |
| 50 InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to) | 50 InstanceMorpher::InstanceMorpher(Zone* zone, const Class& from, const Class& to) |
| 51 : from_(from), to_(to), mapping_() { | 51 : from_(from), to_(to), mapping_(zone, 0) { |
| 52 ComputeMapping(); | 52 ComputeMapping(); |
| 53 before_ = new ZoneGrowableArray<const Instance*>(zone, 0); | 53 before_ = new(zone) ZoneGrowableArray<const Instance*>(zone, 0); |
| 54 after_ = new ZoneGrowableArray<const Instance*>(zone, 0); | 54 after_ = new(zone) ZoneGrowableArray<const Instance*>(zone, 0); |
| 55 ASSERT(from_.id() == to_.id()); | 55 ASSERT(from_.id() == to_.id()); |
| 56 cid_ = from_.id(); | 56 cid_ = from_.id(); |
| 57 } | 57 } |
| 58 | 58 |
| 59 | 59 |
| 60 void InstanceMorpher::AddObject(RawObject* object) const { | 60 void InstanceMorpher::AddObject(RawObject* object) const { |
| 61 ASSERT(object->GetClassId() == cid()); | 61 ASSERT(object->GetClassId() == cid()); |
| 62 const Instance& instance = Instance::Cast(Object::Handle(object)); | 62 const Instance& instance = Instance::Cast(Object::Handle(object)); |
| 63 before_->Add(&instance); | 63 before_->Add(&instance); |
| 64 } | 64 } |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 : zone_(Thread::Current()->zone()), | 362 : zone_(Thread::Current()->zone()), |
| 363 start_time_micros_(OS::GetCurrentMonotonicMicros()), | 363 start_time_micros_(OS::GetCurrentMonotonicMicros()), |
| 364 reload_timestamp_(OS::GetCurrentTimeMillis()), | 364 reload_timestamp_(OS::GetCurrentTimeMillis()), |
| 365 isolate_(isolate), | 365 isolate_(isolate), |
| 366 reload_skipped_(false), | 366 reload_skipped_(false), |
| 367 reload_aborted_(false), | 367 reload_aborted_(false), |
| 368 js_(js), | 368 js_(js), |
| 369 saved_num_cids_(-1), | 369 saved_num_cids_(-1), |
| 370 saved_class_table_(NULL), | 370 saved_class_table_(NULL), |
| 371 num_saved_libs_(-1), | 371 num_saved_libs_(-1), |
| 372 instance_morphers_(), | 372 instance_morphers_(zone_, 0), |
| 373 reasons_to_cancel_reload_(), | 373 reasons_to_cancel_reload_(zone_, 0), |
| 374 cid_mapper_(), | 374 cid_mapper_(), |
| 375 modified_libs_(NULL), | 375 modified_libs_(NULL), |
| 376 script_uri_(String::null()), | 376 script_uri_(String::null()), |
| 377 error_(Error::null()), | 377 error_(Error::null()), |
| 378 old_classes_set_storage_(Array::null()), | 378 old_classes_set_storage_(Array::null()), |
| 379 class_map_storage_(Array::null()), | 379 class_map_storage_(Array::null()), |
| 380 old_libraries_set_storage_(Array::null()), | 380 old_libraries_set_storage_(Array::null()), |
| 381 library_map_storage_(Array::null()), | 381 library_map_storage_(Array::null()), |
| 382 become_map_storage_(Array::null()), | 382 become_map_storage_(Array::null()), |
| 383 become_enum_mappings_(GrowableObjectArray::null()), | 383 become_enum_mappings_(GrowableObjectArray::null()), |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 { | 476 { |
| 477 TransitionVMToNative transition(thread); | 477 TransitionVMToNative transition(thread); |
| 478 Api::Scope api_scope(thread); | 478 Api::Scope api_scope(thread); |
| 479 | 479 |
| 480 Dart_Handle retval = | 480 Dart_Handle retval = |
| 481 (I->library_tag_handler())(Dart_kScriptTag, | 481 (I->library_tag_handler())(Dart_kScriptTag, |
| 482 Api::NewHandle(thread, Library::null()), | 482 Api::NewHandle(thread, Library::null()), |
| 483 Api::NewHandle(thread, root_lib_url.raw())); | 483 Api::NewHandle(thread, root_lib_url.raw())); |
| 484 result = Api::UnwrapHandle(retval); | 484 result = Api::UnwrapHandle(retval); |
| 485 } | 485 } |
| 486 if (result.IsUnwindError()) { |
| 487 // Ignore an unwind error because the isolate is dead. |
| 488 return; |
| 489 } |
| 486 if (result.IsError()) { | 490 if (result.IsError()) { |
| 487 const Error& error = Error::Cast(result); | 491 FinalizeFailedLoad(Error::Cast(result)); |
| 488 AddReasonForCancelling(new Aborted(zone_, error)); | |
| 489 // We call report on JSON here because we won't ever execute | |
| 490 // FinalizeLoading. | |
| 491 ReportOnJSON(js_); | |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 | 494 |
| 495 | 495 |
| 496 void IsolateReloadContext::RegisterClass(const Class& new_cls) { | 496 void IsolateReloadContext::RegisterClass(const Class& new_cls) { |
| 497 const Class& old_cls = Class::Handle(OldClassOrNull(new_cls)); | 497 const Class& old_cls = Class::Handle(OldClassOrNull(new_cls)); |
| 498 if (old_cls.IsNull()) { | 498 if (old_cls.IsNull()) { |
| 499 I->class_table()->Register(new_cls); | 499 I->class_table()->Register(new_cls); |
| 500 | 500 |
| 501 if (FLAG_identity_reload) { | 501 if (FLAG_identity_reload) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 512 isolate()->class_table()->SetAt(old_cls.id(), new_cls.raw()); | 512 isolate()->class_table()->SetAt(old_cls.id(), new_cls.raw()); |
| 513 if (!old_cls.is_enum_class()) { | 513 if (!old_cls.is_enum_class()) { |
| 514 new_cls.CopyCanonicalConstants(old_cls); | 514 new_cls.CopyCanonicalConstants(old_cls); |
| 515 } | 515 } |
| 516 new_cls.CopyCanonicalType(old_cls); | 516 new_cls.CopyCanonicalType(old_cls); |
| 517 AddBecomeMapping(old_cls, new_cls); | 517 AddBecomeMapping(old_cls, new_cls); |
| 518 AddClassMapping(new_cls, old_cls); | 518 AddClassMapping(new_cls, old_cls); |
| 519 } | 519 } |
| 520 | 520 |
| 521 | 521 |
| 522 // FinalizeLoading will be called *before* Reload() returns. | 522 // FinalizeLoading will be called *before* Reload() returns but will not be |
| 523 // called if the embedder fails to load sources. |
| 523 void IsolateReloadContext::FinalizeLoading() { | 524 void IsolateReloadContext::FinalizeLoading() { |
| 524 if (reload_skipped_) { | 525 if (reload_skipped_) { |
| 525 return; | 526 return; |
| 526 } | 527 } |
| 527 BuildLibraryMapping(); | 528 BuildLibraryMapping(); |
| 528 TIR_Print("---- DONE FINALIZING\n"); | 529 TIR_Print("---- DONE FINALIZING\n"); |
| 529 if (ValidateReload()) { | 530 if (ValidateReload()) { |
| 530 Commit(); | 531 Commit(); |
| 531 PostCommit(); | 532 PostCommit(); |
| 532 isolate()->set_last_reload_timestamp(reload_timestamp_); | 533 isolate()->set_last_reload_timestamp(reload_timestamp_); |
| 533 } else { | 534 } else { |
| 534 ReportReasonsForCancelling(); | 535 ReportReasonsForCancelling(); |
| 535 Rollback(); | 536 Rollback(); |
| 536 } | 537 } |
| 537 // ValidateReload mutates the direct subclass information and does | 538 // ValidateReload mutates the direct subclass information and does |
| 538 // not remove dead subclasses. Rebuild the direct subclass | 539 // not remove dead subclasses. Rebuild the direct subclass |
| 539 // information from scratch. | 540 // information from scratch. |
| 540 RebuildDirectSubclasses(); | 541 RebuildDirectSubclasses(); |
| 541 | 542 |
| 542 BackgroundCompiler::Enable(); | 543 CommonFinalizeTail(); |
| 543 } | 544 } |
| 544 | 545 |
| 545 | 546 |
| 547 // FinalizeFailedLoad will be called *before* Reload() returns and will only |
| 548 // be called if the embedder fails to load sources. |
| 549 void IsolateReloadContext::FinalizeFailedLoad(const Error& error) { |
| 550 AddReasonForCancelling(new Aborted(zone_, error)); |
| 551 ReportReasonsForCancelling(); |
| 552 Rollback(); |
| 553 CommonFinalizeTail(); |
| 554 } |
| 555 |
| 556 |
| 557 void IsolateReloadContext::CommonFinalizeTail() { |
| 558 BackgroundCompiler::Enable(); |
| 559 ReportOnJSON(js_); |
| 560 } |
| 561 |
| 546 void IsolateReloadContext::ReportOnJSON(JSONStream* stream) { | 562 void IsolateReloadContext::ReportOnJSON(JSONStream* stream) { |
| 547 JSONObject jsobj(stream); | 563 JSONObject jsobj(stream); |
| 548 jsobj.AddProperty("type", "ReloadReport"); | 564 jsobj.AddProperty("type", "ReloadReport"); |
| 549 jsobj.AddProperty("success", !HasReasonsForCancelling()); | 565 jsobj.AddProperty("success", !HasReasonsForCancelling()); |
| 550 { | 566 { |
| 551 JSONObject details(&jsobj, "details"); | 567 JSONObject details(&jsobj, "details"); |
| 552 if (HasReasonsForCancelling()) { | 568 if (HasReasonsForCancelling()) { |
| 553 // Reload was rejected. | 569 // Reload was rejected. |
| 554 JSONArray array(&jsobj, "notices"); | 570 JSONArray array(&jsobj, "notices"); |
| 555 for (intptr_t i = 0; i < reasons_to_cancel_reload_.length(); i++) { | 571 for (intptr_t i = 0; i < reasons_to_cancel_reload_.length(); i++) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 568 details.AddProperty("finalLibraryCount", final_library_count); | 584 details.AddProperty("finalLibraryCount", final_library_count); |
| 569 JSONArray array(&jsobj, "shapeChangeMappings"); | 585 JSONArray array(&jsobj, "shapeChangeMappings"); |
| 570 for (intptr_t i = 0; i < instance_morphers_.length(); i++) { | 586 for (intptr_t i = 0; i < instance_morphers_.length(); i++) { |
| 571 instance_morphers_.At(i)->AppendTo(&array); | 587 instance_morphers_.At(i)->AppendTo(&array); |
| 572 } | 588 } |
| 573 } | 589 } |
| 574 } | 590 } |
| 575 } | 591 } |
| 576 | 592 |
| 577 | 593 |
| 578 void IsolateReloadContext::AbortReload(const Error& error) { | |
| 579 AddReasonForCancelling(new Aborted(zone_, error)); | |
| 580 ReportReasonsForCancelling(); | |
| 581 Rollback(); | |
| 582 } | |
| 583 | |
| 584 | |
| 585 void IsolateReloadContext::EnsuredUnoptimizedCodeForStack() { | 594 void IsolateReloadContext::EnsuredUnoptimizedCodeForStack() { |
| 586 TIMELINE_SCOPE(EnsuredUnoptimizedCodeForStack); | 595 TIMELINE_SCOPE(EnsuredUnoptimizedCodeForStack); |
| 587 StackFrameIterator it(StackFrameIterator::kDontValidateFrames); | 596 StackFrameIterator it(StackFrameIterator::kDontValidateFrames); |
| 588 | 597 |
| 589 Function& func = Function::Handle(); | 598 Function& func = Function::Handle(); |
| 590 while (it.HasNextFrame()) { | 599 while (it.HasNextFrame()) { |
| 591 StackFrame* frame = it.NextFrame(); | 600 StackFrame* frame = it.NextFrame(); |
| 592 if (frame->IsDartFrame()) { | 601 if (frame->IsDartFrame()) { |
| 593 func = frame->LookupDartFunction(); | 602 func = frame->LookupDartFunction(); |
| 594 ASSERT(!func.IsNull()); | 603 ASSERT(!func.IsNull()); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 | 720 |
| 712 const GrowableObjectArray& libs = | 721 const GrowableObjectArray& libs = |
| 713 GrowableObjectArray::Handle(object_store()->libraries()); | 722 GrowableObjectArray::Handle(object_store()->libraries()); |
| 714 Library& lib = Library::Handle(); | 723 Library& lib = Library::Handle(); |
| 715 Array& scripts = Array::Handle(); | 724 Array& scripts = Array::Handle(); |
| 716 Script& script = Script::Handle(); | 725 Script& script = Script::Handle(); |
| 717 intptr_t num_libs = libs.Length(); | 726 intptr_t num_libs = libs.Length(); |
| 718 | 727 |
| 719 // Construct the imported-by graph. | 728 // Construct the imported-by graph. |
| 720 ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >* imported_by = | 729 ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >* imported_by = |
| 721 new ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >(zone_, num_libs); | 730 new(zone_) ZoneGrowableArray<ZoneGrowableArray<intptr_t>* >( |
| 731 zone_, num_libs); |
| 722 imported_by->SetLength(num_libs); | 732 imported_by->SetLength(num_libs); |
| 723 for (intptr_t i = 0; i < num_libs; i++) { | 733 for (intptr_t i = 0; i < num_libs; i++) { |
| 724 (*imported_by)[i] = new ZoneGrowableArray<intptr_t>(zone_, 0); | 734 (*imported_by)[i] = new(zone_) ZoneGrowableArray<intptr_t>(zone_, 0); |
| 725 } | 735 } |
| 726 Array& ports = Array::Handle(); | 736 Array& ports = Array::Handle(); |
| 727 Namespace& ns = Namespace::Handle(); | 737 Namespace& ns = Namespace::Handle(); |
| 728 Library& target = Library::Handle(); | 738 Library& target = Library::Handle(); |
| 729 | 739 |
| 730 for (intptr_t lib_idx = 0; lib_idx < num_libs; lib_idx++) { | 740 for (intptr_t lib_idx = 0; lib_idx < num_libs; lib_idx++) { |
| 731 lib ^= libs.At(lib_idx); | 741 lib ^= libs.At(lib_idx); |
| 732 ASSERT(lib_idx == lib.index()); | 742 ASSERT(lib_idx == lib.index()); |
| 733 if (lib.is_dart_scheme()) { | 743 if (lib.is_dart_scheme()) { |
| 734 // We don't care about imports among dart scheme libraries. | 744 // We don't care about imports among dart scheme libraries. |
| (...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1593 ASSERT(!super_cls.IsNull()); | 1603 ASSERT(!super_cls.IsNull()); |
| 1594 super_cls.AddDirectSubclass(cls); | 1604 super_cls.AddDirectSubclass(cls); |
| 1595 } | 1605 } |
| 1596 } | 1606 } |
| 1597 } | 1607 } |
| 1598 } | 1608 } |
| 1599 | 1609 |
| 1600 #endif // !PRODUCT | 1610 #endif // !PRODUCT |
| 1601 | 1611 |
| 1602 } // namespace dart | 1612 } // namespace dart |
| OLD | NEW |