Index: pkg/compiler/lib/src/ssa/builder.dart |
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart |
index 9f8c6819710a6c4d8a6ab808da2e178245211abd..b2b0dd7fbfe8da23ba0a8f63229472ed6b362946 100644 |
--- a/pkg/compiler/lib/src/ssa/builder.dart |
+++ b/pkg/compiler/lib/src/ssa/builder.dart |
@@ -3623,25 +3623,53 @@ class SsaBuilder extends NewResolvedVisitor { |
} |
} |
- visitClosureSend(ast.Send node) { |
- Selector selector = elements.getSelector(node); |
- assert(node.receiver == null); |
- Element element = elements[node]; |
- HInstruction closureTarget; |
- if (element == null) { |
- visit(node.selector); |
- closureTarget = pop(); |
- } else { |
- LocalElement local = element; |
- closureTarget = localsHandler.readLocal(local); |
- } |
- var inputs = <HInstruction>[]; |
- inputs.add(closureTarget); |
- addDynamicSendArgumentsToList(node, inputs); |
- Selector closureSelector = new Selector.callClosureFrom(selector); |
- pushWithPosition( |
- new HInvokeClosure(closureSelector, inputs, backend.dynamicType), |
- node); |
+ @override |
+ visitExpressionInvoke( |
+ ast.Send node, |
+ ast.Node expression, |
+ ast.NodeList arguments, |
+ Selector selector, |
+ _) { |
+ generateCallInvoke(node, visitAndPop(expression)); |
+ } |
+ |
+ @override |
+ visitThisInvoke( |
+ ast.Send node, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ generateCallInvoke(node, localsHandler.readThis()); |
+ } |
+ |
+ @override |
+ visitParameterInvoke( |
+ ast.Send node, |
+ ParameterElement parameter, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ generateCallInvoke(node, localsHandler.readLocal(parameter)); |
+ } |
+ |
+ @override |
+ visitLocalVariableInvoke( |
+ ast.Send node, |
+ LocalVariableElement variable, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ generateCallInvoke(node, localsHandler.readLocal(variable)); |
+ } |
+ |
+ @override |
+ visitLocalFunctionInvoke( |
+ ast.Send node, |
+ LocalFunctionElement function, |
+ ast.NodeList arguments, |
+ CallStructure callStructure, |
+ _) { |
+ generateCallInvoke(node, localsHandler.readLocal(function)); |
} |
void handleForeignJs(ast.Send node) { |
@@ -4773,11 +4801,17 @@ class SsaBuilder extends NewResolvedVisitor { |
// reference instead of creating a NoSuchMethodError to avoid pulling it |
// in if it is not used (e.g., in a try/catch). |
HInstruction target = pop(); |
+ generateCallInvoke(node, target); |
+ } |
+ |
+ /// Generate a '.call' invocation on [target]. |
+ void generateCallInvoke(ast.Send node, HInstruction target) { |
Selector selector = elements.getSelector(node); |
List<HInstruction> inputs = <HInstruction>[target]; |
addDynamicSendArgumentsToList(node, inputs); |
Selector closureSelector = new Selector.callClosureFrom(selector); |
- push(new HInvokeClosure(closureSelector, inputs, backend.dynamicType)); |
+ pushWithPosition( |
+ new HInvokeClosure(closureSelector, inputs, backend.dynamicType), node); |
} |
visitGetterSend(ast.Send node) { |