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..e94448b88651b16d91d7bcb844d881007985294d 100644 |
| --- a/runtime/vm/kernel_to_il.cc |
| +++ b/runtime/vm/kernel_to_il.cc |
| @@ -4073,6 +4073,28 @@ 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); |
| + 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); |
| + return elide_initialization ? Fragment() : instructions; |
|
Florian Schneider
2017/03/30 19:42:59
dbc: If the explicit store is not present, you hav
Dmitry Olshansky
2017/03/31 14:19:50
Done.
|
| +} |
| + |
| + |
| Fragment FlowGraphBuilder::TranslateInitializers( |
| Class* kernel_klass, |
| List<Initializer>* initializers) { |
| @@ -4086,13 +4108,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 +4124,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); |