Chromium Code Reviews| Index: runtime/vm/isolate_reload.cc |
| diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc |
| index 9a67be9f5369bfc3a842bc4857c033dc03e9fc69..eabaf2e550234a0b469e31d8769066c854bcddb3 100644 |
| --- a/runtime/vm/isolate_reload.cc |
| +++ b/runtime/vm/isolate_reload.cc |
| @@ -960,9 +960,14 @@ void IsolateReloadContext::Commit() { |
| // Copy static field values from the old classes to the new classes. |
| // Patch fields and functions in the old classes so that they retain |
| // the old script. |
| - Class& cls = Class::Handle(); |
| + Class& old_cls = Class::Handle(); |
| Class& new_cls = Class::Handle(); |
| - |
| + Array& functions = Array::Handle(); |
| + Function& old_func = Function::Handle(); |
| + String& selector = String::Handle(); |
| + Function& new_func = Function::Handle(); |
| + Instance& old_closure = Instance::Handle(); |
| + Instance& new_closure = Instance::Handle(); |
| UnorderedHashMap<ClassMapTraits> class_map(class_map_storage_); |
| { |
| @@ -970,15 +975,33 @@ void IsolateReloadContext::Commit() { |
| while (it.MoveNext()) { |
| const intptr_t entry = it.Current(); |
| new_cls = Class::RawCast(class_map.GetKey(entry)); |
| - cls = Class::RawCast(class_map.GetPayload(entry, 0)); |
| - if (new_cls.raw() != cls.raw()) { |
| - ASSERT(new_cls.is_enum_class() == cls.is_enum_class()); |
| + old_cls = Class::RawCast(class_map.GetPayload(entry, 0)); |
| + if (new_cls.raw() != old_cls.raw()) { |
| + ASSERT(new_cls.is_enum_class() == old_cls.is_enum_class()); |
| if (new_cls.is_enum_class() && new_cls.is_finalized()) { |
| - new_cls.ReplaceEnum(cls); |
| + new_cls.ReplaceEnum(old_cls); |
| } else { |
| - new_cls.CopyStaticFieldValues(cls); |
| + new_cls.CopyStaticFieldValues(old_cls); |
| + } |
| + old_cls.PatchFieldsAndFunctions(); |
| + |
| + // Map implicit static closures. |
| + functions = old_cls.functions(); |
|
Cutch
2016/08/01 22:26:04
please factor this into a function that lives in o
rmacnak
2016/08/02 00:43:45
Done.
|
| + for (intptr_t i = 0; i < functions.Length(); i++) { |
| + old_func ^= functions.At(i); |
| + if (old_func.is_static() && |
| + old_func.HasImplicitClosureFunction()) { |
| + selector = old_func.name(); |
| + new_func = new_cls.LookupFunction(selector); |
| + if (!new_func.IsNull() && new_func.is_static()) { |
| + old_func = old_func.ImplicitClosureFunction(); |
| + old_closure = old_func.ImplicitStaticClosure(); |
| + new_func = new_func.ImplicitClosureFunction(); |
| + new_closure = new_func.ImplicitStaticClosure(); |
| + AddBecomeMapping(old_closure, new_closure); |
| + } |
| + } |
| } |
|
turnidge
2016/08/01 21:04:28
Perhaps this should be implemented in a separate f
|
| - cls.PatchFieldsAndFunctions(); |
| } |
| } |
| } |