Index: runtime/vm/kernel_to_il.cc |
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
index 5490abbadf9b7717e6eef858d384bac97fe46854..c344d6d0b8605e07aad12593718c900f77580b17 100644 |
--- a/runtime/vm/kernel_to_il.cc |
+++ b/runtime/vm/kernel_to_il.cc |
@@ -2360,10 +2360,22 @@ Fragment FlowGraphBuilder::LoadClassId() { |
} |
+const dart::Field& MayCloneField(Zone* zone, const dart::Field& field) { |
+ if ((Compiler::IsBackgroundCompilation() || |
+ FLAG_force_clone_compiler_objects) && |
+ field.IsOriginal()) { |
+ return dart::Field::ZoneHandle(zone, field.CloneFromOriginal()); |
+ } else { |
+ ASSERT(field.IsZoneHandle()); |
+ return field; |
+ } |
+} |
+ |
+ |
Fragment FlowGraphBuilder::LoadField(const dart::Field& field) { |
- LoadFieldInstr* load = new (Z) |
- LoadFieldInstr(Pop(), &field, AbstractType::ZoneHandle(Z, field.type()), |
- TokenPosition::kNoSource); |
+ LoadFieldInstr* load = new (Z) LoadFieldInstr( |
+ Pop(), &MayCloneField(Z, field), |
+ AbstractType::ZoneHandle(Z, field.type()), TokenPosition::kNoSource); |
Push(load); |
return Fragment(load); |
} |
@@ -2409,7 +2421,8 @@ Fragment FlowGraphBuilder::LoadLocal(LocalVariable* variable) { |
Fragment FlowGraphBuilder::InitStaticField(const dart::Field& field) { |
- InitStaticFieldInstr* init = new (Z) InitStaticFieldInstr(Pop(), field); |
+ InitStaticFieldInstr* init = |
+ new (Z) InitStaticFieldInstr(Pop(), MayCloneField(Z, field)); |
return Fragment(init); |
} |
@@ -2527,23 +2540,26 @@ Fragment FlowGraphBuilder::StoreInstanceField( |
if (value->BindsToConstant()) { |
emit_store_barrier = kNoStoreBarrier; |
} |
- StoreInstanceFieldInstr* store = new (Z) StoreInstanceFieldInstr( |
- field, Pop(), value, emit_store_barrier, TokenPosition::kNoSource); |
+ StoreInstanceFieldInstr* store = new (Z) |
+ StoreInstanceFieldInstr(MayCloneField(Z, field), Pop(), value, |
+ emit_store_barrier, TokenPosition::kNoSource); |
return Fragment(store); |
} |
Fragment FlowGraphBuilder::StoreInstanceFieldGuarded(const dart::Field& field) { |
Fragment instructions; |
+ const dart::Field& field_clone = MayCloneField(Z, field); |
if (FLAG_use_field_guards) { |
LocalVariable* store_expression = MakeTemporary(); |
instructions += LoadLocal(store_expression); |
- instructions += GuardFieldClass(field, Thread::Current()->GetNextDeoptId()); |
+ instructions += |
+ GuardFieldClass(field_clone, Thread::Current()->GetNextDeoptId()); |
instructions += LoadLocal(store_expression); |
instructions += |
- GuardFieldLength(field, Thread::Current()->GetNextDeoptId()); |
+ GuardFieldLength(field_clone, Thread::Current()->GetNextDeoptId()); |
} |
- instructions += StoreInstanceField(field); |
+ instructions += StoreInstanceField(field_clone); |
return instructions; |
} |
@@ -2580,8 +2596,8 @@ Fragment FlowGraphBuilder::StoreLocal(LocalVariable* variable) { |
Fragment FlowGraphBuilder::StoreStaticField(const dart::Field& field) { |
- return Fragment( |
- new (Z) StoreStaticFieldInstr(field, Pop(), TokenPosition::kNoSource)); |
+ return Fragment(new (Z) StoreStaticFieldInstr(MayCloneField(Z, field), Pop(), |
+ TokenPosition::kNoSource)); |
} |