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(); | 
| } | 
| } | 
| } |