Chromium Code Reviews| 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) { |