Index: pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
index ec9ff8d303853f0cc3b7d224b10b80ae76237691..708e376bf88fa230f471dcbc90ca6095f9c2476d 100644 |
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
@@ -168,13 +168,13 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
js.Expression buildStaticInvoke(Selector selector, |
Element target, |
- List<tree_ir.Expression> arguments) { |
+ List<js.Expression> arguments) { |
registry.registerStaticInvocation(target.declaration); |
js.Expression elementAccess = glue.elementAccess(target); |
List<js.Expression> compiledArguments = |
- selector.makeArgumentsList(arguments, target.implementation, |
- visitExpression, |
+ selector.makeArgumentsList(target.implementation, |
+ arguments, |
compileConstant); |
return new js.Call(elementAccess, compiledArguments); |
} |
@@ -182,7 +182,9 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
@override |
js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { |
if (node.constant != null) return giveup(node); |
- return buildStaticInvoke(node.selector, node.target, node.arguments); |
+ return buildStaticInvoke(node.selector, |
+ node.target, |
+ visitArguments(node.arguments)); |
} |
void registerMethodInvoke(tree_ir.InvokeMethod node) { |
@@ -209,7 +211,9 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
@override |
js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { |
- return buildStaticInvoke(node.selector, node.target, node.arguments); |
+ return buildStaticInvoke(node.selector, |
+ node.target, |
+ visitArguments(node.arguments)); |
} |
@override |
@@ -229,8 +233,26 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
@override |
js.Expression visitLiteralMap(tree_ir.LiteralMap node) { |
- return giveup(node); |
- // TODO: implement visitLiteralMap |
+ ConstructorElement constructor; |
+ if (node.entries.isEmpty) { |
+ constructor = glue.mapLiteralConstructorEmpty; |
+ } else { |
+ constructor = glue.mapLiteralConstructor; |
+ } |
+ List<js.ArrayElement> entries = new List<js.ArrayElement>(); |
floitsch
2014/11/27 15:57:27
I prefer to allocate the right size and to use a f
sigurdm
2014/11/28 09:24:24
Done.
|
+ int i = 0; |
+ for (tree_ir.LiteralMapEntry entry in node.entries) { |
+ entries.add(new js.ArrayElement(i, visitExpression(entry.key))); |
+ ++i; |
+ entries.add(new js.ArrayElement(i, visitExpression(entry.value))); |
+ ++i; |
+ } |
+ List<js.Expression> args = |
+ <js.Expression>[new js.ArrayInitializer(i, entries)]; |
+ return buildStaticInvoke( |
+ new Selector.call(constructor.name, constructor.library, 2), |
+ constructor, |
+ args); |
} |
@override |