Chromium Code Reviews| Index: dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| diff --git a/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| index 48dd75987ec7b1cb9ee4089227b4d814277a7a11..13204e733c33b22f617dd268f60715da083f9a31 100644 |
| --- a/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| +++ b/dart/sdk/lib/_internal/compiler/implementation/ssa/builder.dart |
| @@ -4027,7 +4027,7 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
| // The iterator is shared between initializer, condition and body. |
| HInstruction iterator; |
| void buildInitializer() { |
| - Selector selector = elements.getIteratorSelector(node); |
| + Selector selector = compiler.iteratorSelector; |
| Set<ClassElement> interceptedClasses = |
| backend.getInterceptedClassesOn(selector.name); |
| visit(node.expression); |
| @@ -4048,29 +4048,42 @@ class SsaBuilder extends ResolvedVisitor implements Visitor { |
| add(iterator); |
| } |
| HInstruction buildCondition() { |
| - Selector selector = elements.getMoveNextSelector(node); |
| + Selector selector = compiler.moveNextSelector; |
| push(new HInvokeDynamicMethod(selector, <HInstruction>[iterator])); |
| return popBoolified(); |
| } |
| void buildBody() { |
| - Selector call = elements.getCurrentSelector(node); |
| + Selector call = compiler.currentSelector; |
| bool hasGetter = compiler.world.hasAnyUserDefinedGetter(call); |
| push(new HInvokeDynamicGetter(call, null, iterator, !hasGetter)); |
| - Element variable; |
| - if (node.declaredIdentifier.asSend() != null) { |
| - variable = elements[node.declaredIdentifier]; |
| - } else { |
| - assert(node.declaredIdentifier.asVariableDefinitions() != null); |
| - VariableDefinitions variableDefinitions = node.declaredIdentifier; |
| - variable = elements[variableDefinitions.definitions.nodes.head]; |
| - } |
| + Element variable = elements[node.declaredIdentifier]; |
| + Selector selector = elements.getSelector(node.declaredIdentifier); |
| + |
| HInstruction oldVariable = pop(); |
| - if (variable.isErroneous()) { |
| - generateThrowNoSuchMethod(node, |
| - getTargetName(variable, 'set'), |
| - argumentValues: <HInstruction>[oldVariable]); |
| - pop(); |
| + if (Elements.isUnresolved(variable)) { |
| + bool hasSetter = compiler.world.hasAnyUserDefinedSetter(selector); |
| + Set<ClassElement> interceptedClasses = |
| + backend.getInterceptedClassesOn(selector.name); |
| + HInstruction receiver = localsHandler.readThis(); |
| + if (interceptedClasses != null) { |
| + // If we're using an interceptor class, emit a call to the |
| + // getInterceptor method and then the actual dynamic call on the |
| + // interceptor object. |
| + HInstruction instruction = |
| + invokeInterceptor(interceptedClasses, receiver, null); |
| + instruction = new HInvokeDynamicSetter( |
| + selector, null, instruction, receiver, !hasSetter); |
| + // Add the value as an argument to the setter call on the |
| + // interceptor. |
| + instruction.inputs.add(oldVariable); |
| + addWithPosition(instruction, node.declaredIdentifier); |
| + } else { |
| + addWithPosition( |
|
kasperl
2013/04/10 08:34:54
Maybe compute the instruction before calling addWi
ahe
2013/04/10 15:02:19
I rewrote generateInstanceSetterWithCompiledReceiv
|
| + new HInvokeDynamicSetter( |
| + selector, null, receiver, oldVariable, !hasSetter), |
| + node.declaredIdentifier); |
| + } |
| } else { |
| localsHandler.updateLocal(variable, oldVariable); |
| } |