Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1006)

Unified Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart

Issue 701123002: Support local functions in analyzer2dart. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comment Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
index 162c38a7181493ed8f5709e4434af262a4bba4b7..ea790f9c05d8cb5995020aee42fe8d08221842d3 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_visitor.dart
@@ -431,35 +431,22 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
return visit(node.expression);
}
- ir.Primitive translateClosureCall(ir.Primitive receiver,
- Selector closureSelector,
- ast.NodeList arguments) {
- Selector namedCallSelector = new Selector(closureSelector.kind,
- "call",
- closureSelector.library,
- closureSelector.argumentCount,
- closureSelector.namedArguments);
- List<ir.Primitive> args = arguments.nodes.mapToList(visit, growable:false);
- return irBuilder.buildDynamicInvocation(receiver, namedCallSelector, args);
- }
-
ir.Primitive visitClosureSend(ast.Send node) {
assert(irBuilder.isOpen);
Element element = elements[node];
- ir.Primitive closureTarget;
+ Selector closureSelector = elements.getSelector(node);
if (element == null) {
- closureTarget = visit(node.selector);
- } else if (irBuilder.isClosureVariable(element)) {
- LocalElement local = element;
- closureTarget = new ir.GetClosureVariable(local);
- irBuilder.add(new ir.LetPrim(closureTarget));
+ ir.Primitive closureTarget = visit(node.selector);
+ List<ir.Primitive> args =
+ node.arguments.mapToList(visit, growable:false);
+ return irBuilder.buildFunctionExpressionInvocation(
+ closureTarget, elements.getSelector(node), args);
} else {
- assert(Elements.isLocal(element));
- closureTarget = irBuilder.environment.lookup(element);
+ List<ir.Primitive> args =
+ node.arguments.mapToList(visit, growable:false);
+ return irBuilder.buildLocalInvocation(
+ element, elements.getSelector(node), args);
}
- Selector closureSelector = elements.getSelector(node);
- return translateClosureCall(closureTarget, closureSelector,
- node.argumentsNode);
}
/// If [node] is null, returns this.
@@ -793,31 +780,17 @@ class IrBuilderVisitor extends ResolvedVisitor<ir.Primitive>
}
ir.FunctionDefinition makeSubFunction(ast.FunctionExpression node) {
- // TODO(johnniwinther): Share the visitor.
- return new IrBuilderVisitor(elements, compiler, sourceFile)
- .buildFunctionInternal(elements[node]);
+ return buildFunctionInternal(elements[node]);
}
ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
- FunctionElement element = elements[node];
- ir.FunctionDefinition inner = makeSubFunction(node);
- ir.CreateFunction prim = new ir.CreateFunction(inner);
- irBuilder.add(new ir.LetPrim(prim));
- return prim;
+ return irBuilder.buildFunctionExpression(makeSubFunction(node));
}
- ir.Primitive visitFunctionDeclaration(ast.FunctionDeclaration node) {
+ visitFunctionDeclaration(ast.FunctionDeclaration node) {
LocalFunctionElement element = elements[node.function];
ir.FunctionDefinition inner = makeSubFunction(node.function);
- if (irBuilder.isClosureVariable(element)) {
- irBuilder.add(new ir.DeclareFunction(element, inner));
- } else {
- ir.CreateFunction prim = new ir.CreateFunction(inner);
- irBuilder.add(new ir.LetPrim(prim));
- irBuilder.environment.extend(element, prim);
- prim.useElementAsHint(element);
- }
- return null;
+ irBuilder.declareLocalFunction(element, inner);
}
static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698