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

Unified Diff: sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart

Issue 237583014: JS templates (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: cleanup Created 6 years, 8 months 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
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) {

Powered by Google App Engine
This is Rietveld 408576698