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 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 // Grab root library before calling CheckpointBeforeReload. | 434 // Grab root library before calling CheckpointBeforeReload. |
435 const Library& root_lib = Library::Handle(object_store()->root_library()); | 435 const Library& root_lib = Library::Handle(object_store()->root_library()); |
436 ASSERT(!root_lib.IsNull()); | 436 ASSERT(!root_lib.IsNull()); |
437 const String& root_lib_url = String::Handle(root_lib.url()); | 437 const String& root_lib_url = String::Handle(root_lib.url()); |
438 | 438 |
439 // Check to see which libraries have been modified. | 439 // Check to see which libraries have been modified. |
440 modified_libs_ = FindModifiedLibraries(force_reload); | 440 modified_libs_ = FindModifiedLibraries(force_reload); |
441 if (!modified_libs_->Contains(root_lib.index())) { | 441 if (!modified_libs_->Contains(root_lib.index())) { |
442 ASSERT(modified_libs_->IsEmpty()); | 442 ASSERT(modified_libs_->IsEmpty()); |
443 reload_skipped_ = true; | 443 reload_skipped_ = true; |
444 TIR_Print("Skipping reload. No libraries were modified\n"); | 444 TIR_Print("---- SKIPPING RELOAD (No libraries were modified)\n"); |
445 return; | 445 return; |
446 } | 446 } |
447 | 447 |
| 448 TIR_Print("---- STARTING RELOAD\n"); |
| 449 |
448 // Preallocate storage for maps. | 450 // Preallocate storage for maps. |
449 old_classes_set_storage_ = | 451 old_classes_set_storage_ = |
450 HashTables::New<UnorderedHashSet<ClassMapTraits> >(4); | 452 HashTables::New<UnorderedHashSet<ClassMapTraits> >(4); |
451 class_map_storage_ = | 453 class_map_storage_ = |
452 HashTables::New<UnorderedHashMap<ClassMapTraits> >(4); | 454 HashTables::New<UnorderedHashMap<ClassMapTraits> >(4); |
453 old_libraries_set_storage_ = | 455 old_libraries_set_storage_ = |
454 HashTables::New<UnorderedHashSet<LibraryMapTraits> >(4); | 456 HashTables::New<UnorderedHashSet<LibraryMapTraits> >(4); |
455 library_map_storage_ = | 457 library_map_storage_ = |
456 HashTables::New<UnorderedHashMap<LibraryMapTraits> >(4); | 458 HashTables::New<UnorderedHashMap<LibraryMapTraits> >(4); |
457 become_map_storage_ = | 459 become_map_storage_ = |
(...skipping 18 matching lines...) Expand all Loading... |
476 { | 478 { |
477 TransitionVMToNative transition(thread); | 479 TransitionVMToNative transition(thread); |
478 Api::Scope api_scope(thread); | 480 Api::Scope api_scope(thread); |
479 | 481 |
480 Dart_Handle retval = | 482 Dart_Handle retval = |
481 (I->library_tag_handler())(Dart_kScriptTag, | 483 (I->library_tag_handler())(Dart_kScriptTag, |
482 Api::NewHandle(thread, Library::null()), | 484 Api::NewHandle(thread, Library::null()), |
483 Api::NewHandle(thread, root_lib_url.raw())); | 485 Api::NewHandle(thread, root_lib_url.raw())); |
484 result = Api::UnwrapHandle(retval); | 486 result = Api::UnwrapHandle(retval); |
485 } | 487 } |
| 488 |
| 489 BackgroundCompiler::Enable(); |
| 490 |
486 if (result.IsUnwindError()) { | 491 if (result.IsUnwindError()) { |
487 // Ignore an unwind error because the isolate is dead. | 492 // Ignore an unwind error because the isolate is dead. |
488 return; | 493 return; |
489 } | 494 } |
| 495 |
490 if (result.IsError()) { | 496 if (result.IsError()) { |
491 FinalizeFailedLoad(Error::Cast(result)); | 497 FinalizeFailedLoad(Error::Cast(result)); |
492 } | 498 } |
493 } | 499 } |
494 | 500 |
495 | 501 |
496 void IsolateReloadContext::RegisterClass(const Class& new_cls) { | 502 void IsolateReloadContext::RegisterClass(const Class& new_cls) { |
497 const Class& old_cls = Class::Handle(OldClassOrNull(new_cls)); | 503 const Class& old_cls = Class::Handle(OldClassOrNull(new_cls)); |
498 if (old_cls.IsNull()) { | 504 if (old_cls.IsNull()) { |
499 I->class_table()->Register(new_cls); | 505 I->class_table()->Register(new_cls); |
(...skipping 19 matching lines...) Expand all Loading... |
519 } | 525 } |
520 | 526 |
521 | 527 |
522 // FinalizeLoading will be called *before* Reload() returns but will not be | 528 // FinalizeLoading will be called *before* Reload() returns but will not be |
523 // called if the embedder fails to load sources. | 529 // called if the embedder fails to load sources. |
524 void IsolateReloadContext::FinalizeLoading() { | 530 void IsolateReloadContext::FinalizeLoading() { |
525 if (reload_skipped_) { | 531 if (reload_skipped_) { |
526 return; | 532 return; |
527 } | 533 } |
528 BuildLibraryMapping(); | 534 BuildLibraryMapping(); |
529 TIR_Print("---- DONE FINALIZING\n"); | 535 TIR_Print("---- LOAD SUCCEEDED\n"); |
530 if (ValidateReload()) { | 536 if (ValidateReload()) { |
531 Commit(); | 537 Commit(); |
532 PostCommit(); | 538 PostCommit(); |
533 isolate()->set_last_reload_timestamp(reload_timestamp_); | 539 isolate()->set_last_reload_timestamp(reload_timestamp_); |
534 } else { | 540 } else { |
535 ReportReasonsForCancelling(); | 541 ReportReasonsForCancelling(); |
536 Rollback(); | 542 Rollback(); |
537 } | 543 } |
538 // ValidateReload mutates the direct subclass information and does | 544 // ValidateReload mutates the direct subclass information and does |
539 // not remove dead subclasses. Rebuild the direct subclass | 545 // not remove dead subclasses. Rebuild the direct subclass |
540 // information from scratch. | 546 // information from scratch. |
541 RebuildDirectSubclasses(); | 547 RebuildDirectSubclasses(); |
542 | 548 |
543 CommonFinalizeTail(); | 549 CommonFinalizeTail(); |
544 } | 550 } |
545 | 551 |
546 | 552 |
547 // FinalizeFailedLoad will be called *before* Reload() returns and will only | 553 // FinalizeFailedLoad will be called *before* Reload() returns and will only |
548 // be called if the embedder fails to load sources. | 554 // be called if the embedder fails to load sources. |
549 void IsolateReloadContext::FinalizeFailedLoad(const Error& error) { | 555 void IsolateReloadContext::FinalizeFailedLoad(const Error& error) { |
| 556 TIR_Print("---- LOAD FAILED, ABORTING RELOAD\n"); |
550 AddReasonForCancelling(new Aborted(zone_, error)); | 557 AddReasonForCancelling(new Aborted(zone_, error)); |
551 ReportReasonsForCancelling(); | 558 ReportReasonsForCancelling(); |
552 Rollback(); | 559 Rollback(); |
553 CommonFinalizeTail(); | 560 CommonFinalizeTail(); |
554 } | 561 } |
555 | 562 |
556 | 563 |
557 void IsolateReloadContext::CommonFinalizeTail() { | 564 void IsolateReloadContext::CommonFinalizeTail() { |
558 BackgroundCompiler::Enable(); | |
559 ReportOnJSON(js_); | 565 ReportOnJSON(js_); |
560 } | 566 } |
561 | 567 |
| 568 |
562 void IsolateReloadContext::ReportOnJSON(JSONStream* stream) { | 569 void IsolateReloadContext::ReportOnJSON(JSONStream* stream) { |
563 JSONObject jsobj(stream); | 570 JSONObject jsobj(stream); |
564 jsobj.AddProperty("type", "ReloadReport"); | 571 jsobj.AddProperty("type", "ReloadReport"); |
565 jsobj.AddProperty("success", !HasReasonsForCancelling()); | 572 jsobj.AddProperty("success", !HasReasonsForCancelling()); |
566 { | 573 { |
567 JSONObject details(&jsobj, "details"); | 574 JSONObject details(&jsobj, "details"); |
568 if (HasReasonsForCancelling()) { | 575 if (HasReasonsForCancelling()) { |
569 // Reload was rejected. | 576 // Reload was rejected. |
570 JSONArray array(&jsobj, "notices"); | 577 JSONArray array(&jsobj, "notices"); |
571 for (intptr_t i = 0; i < reasons_to_cancel_reload_.length(); i++) { | 578 for (intptr_t i = 0; i < reasons_to_cancel_reload_.length(); i++) { |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 } | 813 } |
807 } | 814 } |
808 } | 815 } |
809 | 816 |
810 return modified_libs; | 817 return modified_libs; |
811 } | 818 } |
812 | 819 |
813 | 820 |
814 void IsolateReloadContext::CheckpointLibraries() { | 821 void IsolateReloadContext::CheckpointLibraries() { |
815 TIMELINE_SCOPE(CheckpointLibraries); | 822 TIMELINE_SCOPE(CheckpointLibraries); |
816 | 823 TIR_Print("---- CHECKPOINTING LIBRARIES\n"); |
817 // Save the root library in case we abort the reload. | 824 // Save the root library in case we abort the reload. |
818 const Library& root_lib = | 825 const Library& root_lib = |
819 Library::Handle(object_store()->root_library()); | 826 Library::Handle(object_store()->root_library()); |
820 set_saved_root_library(root_lib); | 827 set_saved_root_library(root_lib); |
821 | 828 |
822 // Save the old libraries array in case we abort the reload. | 829 // Save the old libraries array in case we abort the reload. |
823 const GrowableObjectArray& libs = | 830 const GrowableObjectArray& libs = |
824 GrowableObjectArray::Handle(object_store()->libraries()); | 831 GrowableObjectArray::Handle(object_store()->libraries()); |
825 set_saved_libraries(libs); | 832 set_saved_libraries(libs); |
826 | 833 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 if (!saved_root_lib.IsNull()) { | 913 if (!saved_root_lib.IsNull()) { |
907 object_store()->set_root_library(saved_root_lib); | 914 object_store()->set_root_library(saved_root_lib); |
908 } | 915 } |
909 | 916 |
910 set_saved_root_library(Library::Handle()); | 917 set_saved_root_library(Library::Handle()); |
911 set_saved_libraries(GrowableObjectArray::Handle()); | 918 set_saved_libraries(GrowableObjectArray::Handle()); |
912 } | 919 } |
913 | 920 |
914 | 921 |
915 void IsolateReloadContext::Rollback() { | 922 void IsolateReloadContext::Rollback() { |
| 923 TIR_Print("---- ROLLING BACK"); |
916 RollbackClasses(); | 924 RollbackClasses(); |
917 RollbackLibraries(); | 925 RollbackLibraries(); |
918 } | 926 } |
919 | 927 |
920 | 928 |
921 #ifdef DEBUG | 929 #ifdef DEBUG |
922 void IsolateReloadContext::VerifyMaps() { | 930 void IsolateReloadContext::VerifyMaps() { |
923 TIMELINE_SCOPE(VerifyMaps); | 931 TIMELINE_SCOPE(VerifyMaps); |
924 Class& cls = Class::Handle(); | 932 Class& cls = Class::Handle(); |
925 Class& new_cls = Class::Handle(); | 933 Class& new_cls = Class::Handle(); |
(...skipping 23 matching lines...) Expand all Loading... |
949 } | 957 } |
950 } | 958 } |
951 class_map.Release(); | 959 class_map.Release(); |
952 reverse_class_map.Release(); | 960 reverse_class_map.Release(); |
953 } | 961 } |
954 #endif | 962 #endif |
955 | 963 |
956 | 964 |
957 void IsolateReloadContext::Commit() { | 965 void IsolateReloadContext::Commit() { |
958 TIMELINE_SCOPE(Commit); | 966 TIMELINE_SCOPE(Commit); |
959 TIR_Print("---- COMMITTING REVERSE MAP\n"); | 967 TIR_Print("---- COMMITTING RELOAD\n"); |
960 | 968 |
961 // Note that the object heap contains before and after instances | 969 // Note that the object heap contains before and after instances |
962 // used for morphing. It is therefore important that morphing takes | 970 // used for morphing. It is therefore important that morphing takes |
963 // place prior to any heap walking. | 971 // place prior to any heap walking. |
964 // So please keep this code at the top of Commit(). | 972 // So please keep this code at the top of Commit(). |
965 if (HasInstanceMorphers()) { | 973 if (HasInstanceMorphers()) { |
966 // Perform shape shifting of instances if necessary. | 974 // Perform shape shifting of instances if necessary. |
967 MorphInstances(); | 975 MorphInstances(); |
968 } | 976 } |
969 | 977 |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1219 free(saved_class_table_); | 1227 free(saved_class_table_); |
1220 saved_class_table_ = NULL; | 1228 saved_class_table_ = NULL; |
1221 Become::ElementsForwardIdentity(before, after); | 1229 Become::ElementsForwardIdentity(before, after); |
1222 } | 1230 } |
1223 | 1231 |
1224 | 1232 |
1225 bool IsolateReloadContext::ValidateReload() { | 1233 bool IsolateReloadContext::ValidateReload() { |
1226 TIMELINE_SCOPE(ValidateReload); | 1234 TIMELINE_SCOPE(ValidateReload); |
1227 if (reload_aborted()) return false; | 1235 if (reload_aborted()) return false; |
1228 | 1236 |
| 1237 TIR_Print("---- VALIDATING RELOAD\n"); |
| 1238 |
1229 // Validate libraries. | 1239 // Validate libraries. |
1230 { | 1240 { |
1231 ASSERT(library_map_storage_ != Array::null()); | 1241 ASSERT(library_map_storage_ != Array::null()); |
1232 UnorderedHashMap<LibraryMapTraits> map(library_map_storage_); | 1242 UnorderedHashMap<LibraryMapTraits> map(library_map_storage_); |
1233 UnorderedHashMap<LibraryMapTraits>::Iterator it(&map); | 1243 UnorderedHashMap<LibraryMapTraits>::Iterator it(&map); |
1234 Library& lib = Library::Handle(); | 1244 Library& lib = Library::Handle(); |
1235 Library& new_lib = Library::Handle(); | 1245 Library& new_lib = Library::Handle(); |
1236 while (it.MoveNext()) { | 1246 while (it.MoveNext()) { |
1237 const intptr_t entry = it.Current(); | 1247 const intptr_t entry = it.Current(); |
1238 new_lib = Library::RawCast(map.GetKey(entry)); | 1248 new_lib = Library::RawCast(map.GetKey(entry)); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1603 ASSERT(!super_cls.IsNull()); | 1613 ASSERT(!super_cls.IsNull()); |
1604 super_cls.AddDirectSubclass(cls); | 1614 super_cls.AddDirectSubclass(cls); |
1605 } | 1615 } |
1606 } | 1616 } |
1607 } | 1617 } |
1608 } | 1618 } |
1609 | 1619 |
1610 #endif // !PRODUCT | 1620 #endif // !PRODUCT |
1611 | 1621 |
1612 } // namespace dart | 1622 } // namespace dart |
OLD | NEW |