| 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/code_generator.h" | 8 #include "vm/code_generator.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart_api_impl.h" | 10 #include "vm/dart_api_impl.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 : start_time_micros_(OS::GetCurrentMonotonicMicros()), | 177 : start_time_micros_(OS::GetCurrentMonotonicMicros()), |
| 178 isolate_(isolate), | 178 isolate_(isolate), |
| 179 test_mode_(test_mode), | 179 test_mode_(test_mode), |
| 180 has_error_(false), | 180 has_error_(false), |
| 181 saved_num_cids_(-1), | 181 saved_num_cids_(-1), |
| 182 saved_class_table_(NULL), | 182 saved_class_table_(NULL), |
| 183 num_saved_libs_(-1), | 183 num_saved_libs_(-1), |
| 184 script_uri_(String::null()), | 184 script_uri_(String::null()), |
| 185 error_(Error::null()), | 185 error_(Error::null()), |
| 186 clean_scripts_set_storage_(Array::null()), | 186 clean_scripts_set_storage_(Array::null()), |
| 187 compile_time_constants_(Array::null()), | |
| 188 old_classes_set_storage_(Array::null()), | 187 old_classes_set_storage_(Array::null()), |
| 189 class_map_storage_(Array::null()), | 188 class_map_storage_(Array::null()), |
| 190 old_libraries_set_storage_(Array::null()), | 189 old_libraries_set_storage_(Array::null()), |
| 191 library_map_storage_(Array::null()), | 190 library_map_storage_(Array::null()), |
| 192 become_map_storage_(Array::null()), | 191 become_map_storage_(Array::null()), |
| 193 saved_root_library_(Library::null()), | 192 saved_root_library_(Library::null()), |
| 194 saved_libraries_(GrowableObjectArray::null()) { | 193 saved_libraries_(GrowableObjectArray::null()) { |
| 195 // Preallocate storage for maps. | 194 // Preallocate storage for maps. |
| 196 clean_scripts_set_storage_ = | 195 clean_scripts_set_storage_ = |
| 197 HashTables::New<UnorderedHashSet<ScriptUrlSetTraits> >(4); | 196 HashTables::New<UnorderedHashSet<ScriptUrlSetTraits> >(4); |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 ASSERT(!script_url.IsNull()); | 499 ASSERT(!script_url.IsNull()); |
| 501 bool already_present = clean_scripts_set.Insert(script_url); | 500 bool already_present = clean_scripts_set.Insert(script_url); |
| 502 ASSERT(!already_present); | 501 ASSERT(!already_present); |
| 503 } | 502 } |
| 504 } | 503 } |
| 505 | 504 |
| 506 clean_scripts_set_storage_ = clean_scripts_set.Release().raw(); | 505 clean_scripts_set_storage_ = clean_scripts_set.Release().raw(); |
| 507 } | 506 } |
| 508 | 507 |
| 509 | 508 |
| 510 void IsolateReloadContext::FilterCompileTimeConstants() { | |
| 511 // Save the compile time constants array. | |
| 512 compile_time_constants_ = I->object_store()->compile_time_constants(); | |
| 513 // Clear the compile time constants array. This will be repopulated | |
| 514 // in the loop below. | |
| 515 I->object_store()->set_compile_time_constants(Array::Handle()); | |
| 516 | |
| 517 if (compile_time_constants_ == Array::null()) { | |
| 518 // Nothing to do. | |
| 519 return; | |
| 520 } | |
| 521 | |
| 522 // Iterate over the saved compile time constants map. | |
| 523 ConstantsMap old_constants(compile_time_constants_); | |
| 524 ConstantsMap::Iterator it(&old_constants); | |
| 525 | |
| 526 Array& key = Array::Handle(); | |
| 527 String& url = String::Handle(); | |
| 528 Smi& token_pos = Smi::Handle(); | |
| 529 Instance& value = Instance::Handle(); | |
| 530 | |
| 531 // We filter the compile time constants map so that after it only contains | |
| 532 // constants from scripts contained in this set. | |
| 533 UnorderedHashSet<ScriptUrlSetTraits> | |
| 534 clean_scripts_set(clean_scripts_set_storage_); | |
| 535 | |
| 536 while (it.MoveNext()) { | |
| 537 const intptr_t entry = it.Current(); | |
| 538 ASSERT(entry != -1); | |
| 539 key = Array::RawCast(old_constants.GetKey(entry)); | |
| 540 ASSERT(!key.IsNull()); | |
| 541 url = String::RawCast(key.At(0)); | |
| 542 ASSERT(!url.IsNull()); | |
| 543 if (clean_scripts_set.ContainsKey(url)) { | |
| 544 // We've found a cached constant from a clean script, add it to the | |
| 545 // compile time constants map again. | |
| 546 token_pos = Smi::RawCast(key.At(1)); | |
| 547 TokenPosition tp(token_pos.Value()); | |
| 548 // Use ^= because this might be null. | |
| 549 value ^= old_constants.GetPayload(entry, 0); | |
| 550 Parser::InsertCachedConstantValue(url, tp, value); | |
| 551 } | |
| 552 } | |
| 553 | |
| 554 old_constants.Release(); | |
| 555 clean_scripts_set.Release(); | |
| 556 } | |
| 557 | |
| 558 | |
| 559 // While reloading everything we do must be reversible so that we can abort | 509 // While reloading everything we do must be reversible so that we can abort |
| 560 // safely if the reload fails. This function stashes things to the side and | 510 // safely if the reload fails. This function stashes things to the side and |
| 561 // prepares the isolate for the reload attempt. | 511 // prepares the isolate for the reload attempt. |
| 562 void IsolateReloadContext::Checkpoint() { | 512 void IsolateReloadContext::Checkpoint() { |
| 563 TIMELINE_SCOPE(Checkpoint); | 513 TIMELINE_SCOPE(Checkpoint); |
| 564 CheckpointClasses(); | 514 CheckpointClasses(); |
| 565 CheckpointLibraries(); | 515 CheckpointLibraries(); |
| 566 BuildCleanScriptSet(); | 516 BuildCleanScriptSet(); |
| 567 FilterCompileTimeConstants(); | |
| 568 } | 517 } |
| 569 | 518 |
| 570 | 519 |
| 571 void IsolateReloadContext::RollbackClasses() { | 520 void IsolateReloadContext::RollbackClasses() { |
| 572 TIR_Print("---- ROLLING BACK CLASS TABLE\n"); | 521 TIR_Print("---- ROLLING BACK CLASS TABLE\n"); |
| 573 ASSERT(saved_num_cids_ > 0); | 522 ASSERT(saved_num_cids_ > 0); |
| 574 ASSERT(saved_class_table_ != NULL); | 523 ASSERT(saved_class_table_ != NULL); |
| 575 ClassTable* class_table = I->class_table(); | 524 ClassTable* class_table = I->class_table(); |
| 576 class_table->SetNumCids(saved_num_cids_); | 525 class_table->SetNumCids(saved_num_cids_); |
| 577 // Overwrite classes in class table with the saved classes. | 526 // Overwrite classes in class table with the saved classes. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 607 if (!saved_root_lib.IsNull()) { | 556 if (!saved_root_lib.IsNull()) { |
| 608 object_store()->set_root_library(saved_root_lib); | 557 object_store()->set_root_library(saved_root_lib); |
| 609 } | 558 } |
| 610 | 559 |
| 611 set_saved_root_library(Library::Handle()); | 560 set_saved_root_library(Library::Handle()); |
| 612 set_saved_libraries(GrowableObjectArray::Handle()); | 561 set_saved_libraries(GrowableObjectArray::Handle()); |
| 613 } | 562 } |
| 614 | 563 |
| 615 | 564 |
| 616 void IsolateReloadContext::Rollback() { | 565 void IsolateReloadContext::Rollback() { |
| 617 I->object_store()->set_compile_time_constants( | |
| 618 Array::Handle(compile_time_constants_)); | |
| 619 RollbackClasses(); | 566 RollbackClasses(); |
| 620 RollbackLibraries(); | 567 RollbackLibraries(); |
| 621 } | 568 } |
| 622 | 569 |
| 623 | 570 |
| 624 #ifdef DEBUG | 571 #ifdef DEBUG |
| 625 void IsolateReloadContext::VerifyMaps() { | 572 void IsolateReloadContext::VerifyMaps() { |
| 626 TIMELINE_SCOPE(VerifyMaps); | 573 TIMELINE_SCOPE(VerifyMaps); |
| 627 Class& cls = Class::Handle(); | 574 Class& cls = Class::Handle(); |
| 628 Class& new_cls = Class::Handle(); | 575 Class& new_cls = Class::Handle(); |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 ASSERT(!super_cls.IsNull()); | 1105 ASSERT(!super_cls.IsNull()); |
| 1159 super_cls.AddDirectSubclass(cls); | 1106 super_cls.AddDirectSubclass(cls); |
| 1160 } | 1107 } |
| 1161 } | 1108 } |
| 1162 } | 1109 } |
| 1163 } | 1110 } |
| 1164 | 1111 |
| 1165 #endif // !PRODUCT | 1112 #endif // !PRODUCT |
| 1166 | 1113 |
| 1167 } // namespace dart | 1114 } // namespace dart |
| OLD | NEW |