Add type arguments to lists in the code generator and make them fixed length.

R=johnniwinther@google.com

Review URL: https://codereview.chromium.org//1164563005
This commit is contained in:
Karl Klose
2015-06-03 13:49:02 +02:00
parent 5a843ebbf3
commit e9656e8db1
@@ -156,8 +156,11 @@ class CodeGenerator extends tree_ir.StatementVisitor
return name;
}
List<js.Expression> visitArguments(List<tree_ir.Expression> arguments) {
return arguments.map(visitExpression).toList();
List<js.Expression> visitExpressionList(
List<tree_ir.Expression> expressions) {
return new List<js.Expression>.generate(expressions.length,
(int index) => visitExpression(expressions[index]),
growable: false);
}
giveup(tree_ir.Node node,
@@ -242,7 +245,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
registry.registerInstantiatedType(node.type);
Selector selector = node.selector;
FunctionElement target = node.target;
List<js.Expression> arguments = visitArguments(node.arguments);
List<js.Expression> arguments = visitExpressionList(node.arguments);
return buildStaticInvoke(selector, target, arguments);
}
@@ -269,7 +272,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
registerMethodInvoke(node);
return js.propertyCall(visitExpression(node.receiver),
glue.invocationName(node.selector),
visitArguments(node.arguments));
visitExpressionList(node.arguments));
}
@override
@@ -277,7 +280,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
Selector selector = node.selector;
assert(selector.isGetter || selector.isSetter || selector.isCall);
FunctionElement target = node.target;
List<js.Expression> arguments = visitArguments(node.arguments);
List<js.Expression> arguments = visitExpressionList(node.arguments);
return buildStaticInvoke(selector, target, arguments,
sourceInformation: node.sourceInformation);
}
@@ -291,19 +294,19 @@ class CodeGenerator extends tree_ir.StatementVisitor
return js.js('#.#(#)',
[visitExpression(node.receiver),
glue.instanceMethodName(node.target),
visitArguments(node.arguments)]);
visitExpressionList(node.arguments)]);
}
return js.js('#.#.call(#, #)',
[glue.prototypeAccess(node.target.enclosingClass),
glue.invocationName(node.selector),
visitExpression(node.receiver),
visitArguments(node.arguments)]);
visitExpressionList(node.arguments)]);
}
@override
js.Expression visitLiteralList(tree_ir.LiteralList node) {
registry.registerInstantiatedClass(glue.listClass);
List<js.Expression> entries = node.values.map(visitExpression).toList();
List<js.Expression> entries = visitExpressionList(node.values);
return new js.ArrayInitializer(entries);
}
@@ -351,8 +354,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
@override
js.Expression visitTypeOperator(tree_ir.TypeOperator node) {
js.Expression value = visitExpression(node.value);
List<js.Expression> typeArguments =
node.typeArguments.map(visitExpression).toList();
List<js.Expression> typeArguments = visitExpressionList(node.typeArguments);
if (!node.isTypeTest) {
giveup(node, 'type casts not implemented.');
}
@@ -557,7 +559,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
@override
js.Expression visitCreateBox(tree_ir.CreateBox node) {
return new js.ObjectInitializer([]);
return new js.ObjectInitializer(const <js.Property>[]);
}
@override
@@ -570,7 +572,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
registry.registerInstantiatedClass(cls);
js.Expression instance = new js.New(
glue.constructorAccess(cls),
node.arguments.map(visitExpression).toList());
visitExpressionList(node.arguments));
List<tree_ir.Expression> typeInformation = node.typeInformation;
assert(typeInformation.isEmpty ||
@@ -578,7 +580,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
if (typeInformation.isNotEmpty) {
FunctionElement helper = glue.getAddRuntimeTypeInformation();
js.Expression typeArguments = new js.ArrayInitializer(
typeInformation.map(visitExpression).toList());
visitExpressionList(typeInformation));
return buildStaticHelperInvocation(helper,
<js.Expression>[instance, typeArguments]);
} else {
@@ -593,9 +595,9 @@ class CodeGenerator extends tree_ir.StatementVisitor
js.Expression internalName = js.string(glue.invocationName(node.selector));
js.Expression kind = js.number(node.selector.invocationMirrorKind);
js.Expression arguments = new js.ArrayInitializer(
node.arguments.map(visitExpression).toList());
visitExpressionList(node.arguments));
js.Expression argumentNames = new js.ArrayInitializer(
node.selector.namedArguments.map(js.string).toList());
node.selector.namedArguments.map(js.string).toList(growable: false));
return buildStaticHelperInvocation(glue.createInvocationMirrorMethod,
[name, internalName, kind, arguments, argumentNames]);
}
@@ -628,7 +630,8 @@ class CodeGenerator extends tree_ir.StatementVisitor
// Read a lazily initialized field.
registry.registerStaticUse(node.element.declaration);
js.Expression getter = glue.isolateLazyInitializerAccess(node.element);
return new js.Call(getter, [], sourceInformation: node.sourceInformation);
return new js.Call(getter, <js.Expression>[],
sourceInformation: node.sourceInformation);
}
// Read an eagerly initialized field.
registry.registerStaticUse(node.element.declaration);
@@ -678,8 +681,7 @@ class CodeGenerator extends tree_ir.StatementVisitor
@override
js.Expression visitTypeExpression(tree_ir.TypeExpression node) {
List<js.Expression> arguments =
node.arguments.map(visitExpression).toList(growable: false);
List<js.Expression> arguments = visitExpressionList(node.arguments);
return glue.generateTypeRepresentation(node.dartType, arguments);
}