Chromium Code Reviews| Index: runtime/vm/flow_graph_builder.cc |
| =================================================================== |
| --- runtime/vm/flow_graph_builder.cc (revision 10362) |
| +++ runtime/vm/flow_graph_builder.cc (working copy) |
| @@ -1791,11 +1791,23 @@ |
| void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) { |
| const String& getter_name = |
| String::Handle(Field::GetterName(node->field_name())); |
| - const Function& getter_function = |
| - Function::ZoneHandle(node->cls().LookupStaticFunction(getter_name)); |
| - ASSERT(!getter_function.IsNull()); |
| ZoneGrowableArray<PushArgumentInstr*>* arguments = |
| new ZoneGrowableArray<PushArgumentInstr*>(); |
| + Function& getter_function = Function::ZoneHandle(); |
| + if (!node->is_super_getter()) { |
|
srdjan
2012/08/08 16:44:34
Revert, use first the positive clause, is_super_ge
hausner
2012/08/08 17:42:02
Done.
|
| + getter_function = node->cls().LookupStaticFunction(getter_name); |
| + ASSERT(!getter_function.IsNull()); |
| + } else { |
| + // Statically resolved instance getter, i.e. "super getter". |
| + getter_function = |
| + Resolver::ResolveDynamicAnyParams(node->cls(), getter_name); |
| + ASSERT(!getter_function.IsNull()); |
| + ASSERT(node->receiver() != NULL); |
| + ValueGraphVisitor receiver_value(owner(), temp_index()); |
| + node->receiver()->Visit(&receiver_value); |
| + Append(receiver_value); |
| + arguments->Add(PushArgument(receiver_value.value())); |
| + } |
| StaticCallComp* call = new StaticCallComp(node->token_pos(), |
| owner()->try_index(), |
| getter_function, |
| @@ -1809,9 +1821,25 @@ |
| bool result_is_needed) { |
| const String& setter_name = |
| String::Handle(Field::SetterName(node->field_name())); |
| + // A super setter is an instance setter whose setter function is |
| + // resolved at compile time (in the caller instance getter's super class). |
| + // Unlike a static getter, a super getter has a receiver parameter. |
| + const bool is_super_setter = (node->receiver() != NULL); |
| const Function& setter_function = |
| - Function::ZoneHandle(node->cls().LookupStaticFunction(setter_name)); |
| + Function::ZoneHandle(is_super_setter |
| + ? Resolver::ResolveDynamicAnyParams(node->cls(), setter_name) |
| + : node->cls().LookupStaticFunction(setter_name)); |
| ASSERT(!setter_function.IsNull()); |
| + |
| + ZoneGrowableArray<PushArgumentInstr*>* arguments = |
| + new ZoneGrowableArray<PushArgumentInstr*>(1); |
| + if (is_super_setter) { |
| + // Add receiver of instance getter. |
| + ValueGraphVisitor for_receiver(owner(), temp_index()); |
| + node->receiver()->Visit(&for_receiver); |
| + Append(for_receiver); |
| + arguments->Add(PushArgument(for_receiver.value())); |
| + } |
| ValueGraphVisitor for_value(owner(), temp_index()); |
| node->value()->Visit(&for_value); |
| Append(for_value); |
| @@ -1823,9 +1851,8 @@ |
| } else { |
| value = for_value.value(); |
| } |
| - ZoneGrowableArray<PushArgumentInstr*>* arguments = |
| - new ZoneGrowableArray<PushArgumentInstr*>(1); |
| arguments->Add(PushArgument(value)); |
| + |
| StaticCallComp* call = new StaticCallComp(node->token_pos(), |
| owner()->try_index(), |
| setter_function, |