Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <set> | 6 #include <set> |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "vm/kernel_to_il.h" | 9 #include "vm/kernel_to_il.h" |
| 10 | 10 |
| (...skipping 4055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4066 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry(intptr_t try_index) { | 4066 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry(intptr_t try_index) { |
| 4067 return new (Z) JoinEntryInstr(AllocateBlockId(), try_index); | 4067 return new (Z) JoinEntryInstr(AllocateBlockId(), try_index); |
| 4068 } | 4068 } |
| 4069 | 4069 |
| 4070 | 4070 |
| 4071 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { | 4071 JoinEntryInstr* FlowGraphBuilder::BuildJoinEntry() { |
| 4072 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex()); | 4072 return new (Z) JoinEntryInstr(AllocateBlockId(), CurrentTryIndex()); |
| 4073 } | 4073 } |
| 4074 | 4074 |
| 4075 | 4075 |
| 4076 Fragment FlowGraphBuilder::TranslateFieldInitializer(Field* kernel_field, | |
| 4077 Expression* init) { | |
| 4078 dart::Field& field = | |
| 4079 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field)); | |
| 4080 Fragment instructions; | |
| 4081 bool elide_initialization = false; | |
| 4082 instructions += LoadLocal(scopes_->this_variable); | |
| 4083 Fragment initializer = TranslateExpression(init); | |
| 4084 instructions += initializer; | |
| 4085 // Elide initialization if the expression is null. | |
| 4086 if (initializer.entry->IsConstant() && | |
| 4087 initializer.entry == initializer.current) { | |
| 4088 ConstantInstr* inst = initializer.entry->AsConstant(); | |
| 4089 if (inst->value().IsNull()) { | |
| 4090 elide_initialization = true; | |
| 4091 } | |
| 4092 } | |
| 4093 instructions += StoreInstanceFieldGuarded(field, true); | |
| 4094 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.
| |
| 4095 } | |
| 4096 | |
| 4097 | |
| 4076 Fragment FlowGraphBuilder::TranslateInitializers( | 4098 Fragment FlowGraphBuilder::TranslateInitializers( |
| 4077 Class* kernel_klass, | 4099 Class* kernel_klass, |
| 4078 List<Initializer>* initializers) { | 4100 List<Initializer>* initializers) { |
| 4079 Fragment instructions; | 4101 Fragment instructions; |
| 4080 | 4102 |
| 4081 // These come from: | 4103 // These come from: |
| 4082 // class A { | 4104 // class A { |
| 4083 // var x = (expr); | 4105 // var x = (expr); |
| 4084 // } | 4106 // } |
| 4085 for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) { | 4107 for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) { |
| 4086 Field* kernel_field = kernel_klass->fields()[i]; | 4108 Field* kernel_field = kernel_klass->fields()[i]; |
| 4087 Expression* init = kernel_field->initializer(); | 4109 Expression* init = kernel_field->initializer(); |
| 4088 if (!kernel_field->IsStatic() && init != NULL) { | 4110 if (!kernel_field->IsStatic() && init != NULL) { |
| 4089 dart::Field& field = | |
| 4090 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field)); | |
| 4091 | |
| 4092 EnterScope(kernel_field); | 4111 EnterScope(kernel_field); |
| 4093 instructions += LoadLocal(scopes_->this_variable); | 4112 instructions += TranslateFieldInitializer(kernel_field, init); |
| 4094 instructions += TranslateExpression(init); | |
| 4095 instructions += StoreInstanceFieldGuarded(field, true); | |
| 4096 ExitScope(kernel_field); | 4113 ExitScope(kernel_field); |
| 4097 } | 4114 } |
| 4098 } | 4115 } |
| 4099 | 4116 |
| 4100 // These to come from: | 4117 // These to come from: |
| 4101 // class A { | 4118 // class A { |
| 4102 // var x; | 4119 // var x; |
| 4103 // var y; | 4120 // var y; |
| 4104 // A(this.x) : super(expr), y = (expr); | 4121 // A(this.x) : super(expr), y = (expr); |
| 4105 // } | 4122 // } |
| 4106 for (intptr_t i = 0; i < initializers->length(); i++) { | 4123 for (intptr_t i = 0; i < initializers->length(); i++) { |
| 4107 Initializer* initializer = (*initializers)[i]; | 4124 Initializer* initializer = (*initializers)[i]; |
| 4108 if (initializer->IsFieldInitializer()) { | 4125 if (initializer->IsFieldInitializer()) { |
| 4109 FieldInitializer* init = FieldInitializer::Cast(initializer); | 4126 FieldInitializer* init = FieldInitializer::Cast(initializer); |
| 4110 dart::Field& field = | 4127 instructions += TranslateFieldInitializer(init->field(), init->value()); |
| 4111 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(init->field())); | |
| 4112 | |
| 4113 instructions += LoadLocal(scopes_->this_variable); | |
| 4114 instructions += TranslateExpression(init->value()); | |
| 4115 instructions += StoreInstanceFieldGuarded(field, true); | |
| 4116 } else if (initializer->IsSuperInitializer()) { | 4128 } else if (initializer->IsSuperInitializer()) { |
| 4117 SuperInitializer* init = SuperInitializer::Cast(initializer); | 4129 SuperInitializer* init = SuperInitializer::Cast(initializer); |
| 4118 | 4130 |
| 4119 instructions += LoadLocal(scopes_->this_variable); | 4131 instructions += LoadLocal(scopes_->this_variable); |
| 4120 instructions += PushArgument(); | 4132 instructions += PushArgument(); |
| 4121 | 4133 |
| 4122 ASSERT(init->arguments()->types().length() == 0); | 4134 ASSERT(init->arguments()->types().length() == 0); |
| 4123 Array& argument_names = Array::ZoneHandle(Z); | 4135 Array& argument_names = Array::ZoneHandle(Z); |
| 4124 instructions += TranslateArguments(init->arguments(), &argument_names); | 4136 instructions += TranslateArguments(init->arguments(), &argument_names); |
| 4125 | 4137 |
| (...skipping 2337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6463 thread->clear_sticky_error(); | 6475 thread->clear_sticky_error(); |
| 6464 return error.raw(); | 6476 return error.raw(); |
| 6465 } | 6477 } |
| 6466 } | 6478 } |
| 6467 | 6479 |
| 6468 | 6480 |
| 6469 } // namespace kernel | 6481 } // namespace kernel |
| 6470 } // namespace dart | 6482 } // namespace dart |
| 6471 | 6483 |
| 6472 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 6484 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |