Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(726)

Unified Diff: runtime/vm/isolate_reload.cc

Issue 2497673004: Rehash canonical constants table for each class that can be affected by the 'become' operation (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/isolate_reload.h ('k') | runtime/vm/verifier.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/isolate_reload.cc
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index 4370ab183970ca74b93c649e8a0f3d2361cca742..2e8ea6bd0ef38c0ad8b0243672ccf94589f18fc4 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -1156,21 +1156,8 @@ void IsolateReloadContext::Commit() {
}
}
- // Rehash constants map for all new classes and the closure class.
- Class& cls = Class::Handle(zone_);
- cls = I->class_table()->At(kClosureCid);
- cls.RehashConstants(zone_);
- {
- ASSERT(class_map_storage_ != Array::null());
- UnorderedHashMap<ClassMapTraits> map(class_map_storage_);
- UnorderedHashMap<ClassMapTraits>::Iterator it(&map);
- while (it.MoveNext()) {
- const intptr_t entry = it.Current();
- cls = Class::RawCast(map.GetKey(entry));
- cls.RehashConstants(zone_);
- }
- map.Release();
- }
+ // Rehash constants map for all classes.
+ RehashConstants();
#ifdef DEBUG
// Verify that all canonical instances are correctly setup in the
@@ -1183,6 +1170,27 @@ void IsolateReloadContext::Commit() {
}
+void IsolateReloadContext::RehashConstants() {
+ ClassTable* class_table = I->class_table();
+ Class& cls = Class::Handle(zone_);
+ const intptr_t top = class_table->NumCids();
+ for (intptr_t cid = kInstanceCid; cid < top; cid++) {
siva 2016/11/15 22:58:22 Should this be (kNumPredefinedCids + 1)
rmacnak 2016/11/15 23:13:33 No, we still need to rehash array, growable array,
+ if (!class_table->IsValidIndex(cid) || !class_table->HasValidClassAt(cid)) {
siva 2016/11/15 22:58:22 IsValidIndex(cid) is implicit right with the check
+ // Skip invalid classes.
+ continue;
+ }
+ if (RawObject::IsNumberClassId(cid) || RawObject::IsStringClassId(cid)) {
+ // Skip classes that cannot be affected by the 'become' operation.
+ continue;
+ }
siva 2016/11/15 22:58:22 By running from kNumPredefinedCids this check for
+ // Rehash constants.
+ cls = class_table->At(cid);
+ VTIR_Print("Rehashing constants in class `%s`\n", cls.ToCString());
+ cls.RehashConstants(zone_);
+ }
+}
+
+
bool IsolateReloadContext::IsDirty(const Library& lib) {
const intptr_t index = lib.index();
if (index == static_cast<classid_t>(-1)) {
« no previous file with comments | « runtime/vm/isolate_reload.h ('k') | runtime/vm/verifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698