Index: sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart |
index f48b741241a12d7781163088c6ad5450792a9012..42e84ecbd61435adfe0e9fc363b0098f0f1698b2 100644 |
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart |
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart |
@@ -71,7 +71,7 @@ class ContainerBuilder extends CodeEmitterHelper { |
if (isInterceptedMethod) { |
count++; |
parametersBuffer[0] = new jsAst.Parameter(receiverArgumentName); |
- argumentsBuffer[0] = js(receiverArgumentName); |
+ argumentsBuffer[0] = js('#', receiverArgumentName); |
task.interceptorEmitter.interceptorInvocationNames.add(invocationName); |
} |
@@ -88,14 +88,14 @@ class ContainerBuilder extends CodeEmitterHelper { |
assert(jsName != receiverArgumentName); |
if (count < optionalParameterStart) { |
parametersBuffer[count] = new jsAst.Parameter(jsName); |
- argumentsBuffer[count] = js(jsName); |
+ argumentsBuffer[count] = js('#', jsName); |
} else { |
int index = names.indexOf(element.name); |
if (index != -1) { |
indexOfLastOptionalArgumentInParameters = count; |
// The order of the named arguments is not the same as the |
// one in the real method (which is in Dart source order). |
- argumentsBuffer[count] = js(jsName); |
+ argumentsBuffer[count] = js('#', jsName); |
parametersBuffer[optionalParameterStart + index] = |
new jsAst.Parameter(jsName); |
} else { |
@@ -115,7 +115,7 @@ class ContainerBuilder extends CodeEmitterHelper { |
count++; |
}); |
- List body; |
+ var body; // List or jsAst.Statement. |
if (member.hasFixedBackendName()) { |
body = task.nativeEmitter.generateParameterStubStatements( |
member, isInterceptedMethod, invocationName, |
@@ -129,19 +129,21 @@ class ContainerBuilder extends CodeEmitterHelper { |
// We thus can't just invoke `this.foo$1.call(filledInArguments)`. |
// Instead we need to call the statically resolved target. |
// `<class>.prototype.bar$1.call(this, argument0, ...)`. |
- body = [js.return_( |
- backend.namer.elementAccess(superClass)['prototype'][methodName] |
- ["call"](["this"]..addAll(argumentsBuffer)))]; |
+ body = js.statement( |
+ 'return #.prototype.#.call(this, #);', |
+ [backend.namer.elementAccess(superClass), methodName, |
+ argumentsBuffer]); |
} else { |
- body = [js.return_( |
- js('this') |
- [namer.getNameOfInstanceMember(member)](argumentsBuffer))]; |
+ body = js.statement( |
+ 'return this.#(#);', |
+ [namer.getNameOfInstanceMember(member), argumentsBuffer]); |
} |
} else { |
- body = [js.return_(namer.elementAccess(member)(argumentsBuffer))]; |
+ body = js.statement('return #(#)', |
+ [namer.elementAccess(member), argumentsBuffer]); |
} |
- jsAst.Fun function = js.fun(parametersBuffer, body); |
+ jsAst.Fun function = js('function(#) { #; }', [parametersBuffer, body]); |
addStub(selector, function); |
} |
@@ -267,12 +269,14 @@ class ContainerBuilder extends CodeEmitterHelper { |
if (member.isGetter()) { |
String getterName = namer.getterName(member); |
if (isInterceptedMethod) { |
- return js('this')[getterName](<jsAst.Expression>[receiver]); |
+ //return js('this')[getterName](<jsAst.Expression>[receiver]); |
floitsch
2014/04/22 16:11:18
dead code.
sra1
2014/04/23 02:33:50
Done.
|
+ return js('this.#(#)', [getterName, receiver]); |
} |
- return receiver[getterName](<jsAst.Expression>[]); |
+ //return receiver[getterName](<jsAst.Expression>[]); |
floitsch
2014/04/22 16:11:18
ditto.
sra1
2014/04/23 02:33:50
Done.
|
+ return js('#.#()', [receiver, getterName]); |
} else { |
String fieldName = namer.instanceFieldPropertyName(member); |
- return receiver[fieldName]; |
+ return js('#.#', [receiver, fieldName]); |
} |
} |
@@ -299,12 +303,12 @@ class ContainerBuilder extends CodeEmitterHelper { |
for (int i = 0; i < selector.argumentCount; i++) { |
String name = 'arg$i'; |
parameters.add(new jsAst.Parameter(name)); |
- arguments.add(js(name)); |
+ arguments.add(js('#', name)); |
} |
- jsAst.Fun function = js.fun( |
- parameters, |
- js.return_(buildGetter()[closureCallName](arguments))); |
+ jsAst.Fun function = js( |
+ 'function(#) { return #.#(#); }', |
+ [ parameters, buildGetter(), closureCallName, arguments]); |
addProperty(invocationName, function); |
} |
@@ -424,7 +428,7 @@ class ContainerBuilder extends CodeEmitterHelper { |
// TODO(ahe): Consider one of the parameter counts can be replaced by the |
// length property of the JavaScript function object. |
- List expressions = []; |
+ List<jsAst.Expression> expressions = <jsAst.Expression>[]; |
String callSelectorString = 'null'; |
if (member.isFunction()) { |
@@ -443,6 +447,7 @@ class ContainerBuilder extends CodeEmitterHelper { |
expressions.add(code); |
+ // TODO(sra): Don't use LiteralString for non-strings. |
List tearOffInfo = [new jsAst.LiteralString(callSelectorString)]; |
if (needsStubs || canTearOff) { |
@@ -453,7 +458,7 @@ class ContainerBuilder extends CodeEmitterHelper { |
compiler.codegenWorld.invokedNames[member.name]; |
expressions.add(js.string(namer.invocationName(selector))); |
} else { |
- expressions.add("null"); |
+ expressions.add(js('null')); |
// TOOD(ahe): Since we know when reading static data versus instance |
// data, we can eliminate this element. |
} |
@@ -484,7 +489,7 @@ class ContainerBuilder extends CodeEmitterHelper { |
backend.rti.getSignatureEncoding(memberType, thisAccess); |
} else { |
memberTypeExpression = |
- js.toExpression(task.metadataEmitter.reifyType(memberType)); |
+ js.number(task.metadataEmitter.reifyType(memberType)); |
} |
} else { |
memberTypeExpression = js('null'); |
@@ -494,14 +499,16 @@ class ContainerBuilder extends CodeEmitterHelper { |
..addAll(tearOffInfo) |
..add((tearOffName == null || member.isAccessor()) |
? js("null") : js.string(tearOffName)) |
- ..add(requiredParameterCount) |
- ..add(optionalParameterCount) |
+ ..add(js.number(requiredParameterCount)) |
+ ..add(js.number(optionalParameterCount)) |
..add(memberTypeExpression) |
- ..addAll(task.metadataEmitter.reifyDefaultArguments(member)); |
+ ..addAll( |
+ task.metadataEmitter.reifyDefaultArguments(member).map(js.number)); |
if (canBeReflected || canBeApplied) { |
parameters.forEachParameter((Element parameter) { |
- expressions.add(task.metadataEmitter.reifyName(parameter.name)); |
+ expressions.add( |
+ js.number(task.metadataEmitter.reifyName(parameter.name))); |
if (backend.mustRetainMetadata) { |
List<MetadataAnnotation> annotations = parameter.metadata.toList(); |
Iterable<int> metadataIndices = |
@@ -511,8 +518,8 @@ class ContainerBuilder extends CodeEmitterHelper { |
backend.constants.addCompileTimeConstantForEmission(constant); |
return task.metadataEmitter.reifyMetadata(annotation); |
}); |
- expressions.add(metadataIndices.isNotEmpty ? metadataIndices.toList() |
- : js('[]')); |
+ expressions.add( |
+ new jsAst.ArrayInitializer.from(metadataIndices.map(js.number))); |
} |
}); |
} |
@@ -528,12 +535,11 @@ class ContainerBuilder extends CodeEmitterHelper { |
} |
expressions |
..add(reflectionName) |
- ..addAll(task.metadataEmitter.computeMetadata(member)); |
+ ..addAll(task.metadataEmitter.computeMetadata(member).map(js.number)); |
} else if (isClosure && canBeApplied) { |
expressions.add(js.string(member.name)); |
} |
- |
- builder.addProperty(name, js.toExpression(expressions)); |
+ builder.addProperty(name, new jsAst.ArrayInitializer.from(expressions)); |
} |
void addMemberField(VariableElement member, ClassBuilder builder) { |