Chromium Code Reviews| Index: runtime/vm/kernel_to_il.cc |
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
| index 1e0a4064281dc05de46799efd2c132fd3fa5ad7c..d6ab5088b4a4076d6e128cf4ef026786d05618f1 100644 |
| --- a/runtime/vm/kernel_to_il.cc |
| +++ b/runtime/vm/kernel_to_il.cc |
| @@ -4073,6 +4073,33 @@ JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { |
| } |
| +Fragment FlowGraphBuilder::TranslateFieldInitializer(Field* kernel_field, |
| + Expression* init) { |
| + dart::Field& field = |
| + dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field)); |
| + Fragment instructions; |
| + bool elide_initialization = false; |
| + instructions += LoadLocal(scopes_->this_variable); |
| + Fragment initializer = TranslateExpression(init); |
|
Vyacheslav Egorov (Google)
2017/03/31 15:00:56
Better init->IsNullLiteral() instead of this.
|
| + instructions += initializer; |
| + // Elide initialization if the expression is null. |
| + if (initializer.entry->IsConstant() && |
| + initializer.entry == initializer.current) { |
| + ConstantInstr* inst = initializer.entry->AsConstant(); |
| + if (inst->value().IsNull()) { |
| + elide_initialization = true; |
| + } |
| + } |
| + instructions += StoreInstanceFieldGuarded(field, true); |
| + if (elide_initialization) { |
| + field.RecordStore(Object::null_object()); |
| + return Fragment(); |
| + } else { |
| + return instructions; |
| + } |
| +} |
| + |
| + |
| Fragment FlowGraphBuilder::TranslateInitializers( |
| Class* kernel_klass, |
| List<Initializer>* initializers) { |
| @@ -4086,13 +4113,8 @@ Fragment FlowGraphBuilder::TranslateInitializers( |
| Field* kernel_field = kernel_klass->fields()[i]; |
| Expression* init = kernel_field->initializer(); |
| if (!kernel_field->IsStatic() && init != NULL) { |
| - dart::Field& field = |
| - dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field)); |
| - |
| EnterScope(kernel_field); |
| - instructions += LoadLocal(scopes_->this_variable); |
| - instructions += TranslateExpression(init); |
| - instructions += StoreInstanceFieldGuarded(field, true); |
| + instructions += TranslateFieldInitializer(kernel_field, init); |
| ExitScope(kernel_field); |
| } |
| } |
| @@ -4107,12 +4129,7 @@ Fragment FlowGraphBuilder::TranslateInitializers( |
| Initializer* initializer = (*initializers)[i]; |
| if (initializer->IsFieldInitializer()) { |
| FieldInitializer* init = FieldInitializer::Cast(initializer); |
| - dart::Field& field = |
| - dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(init->field())); |
| - |
| - instructions += LoadLocal(scopes_->this_variable); |
| - instructions += TranslateExpression(init->value()); |
| - instructions += StoreInstanceFieldGuarded(field, true); |
| + instructions += TranslateFieldInitializer(init->field(), init->value()); |
| } else if (initializer->IsSuperInitializer()) { |
| SuperInitializer* init = SuperInitializer::Cast(initializer); |