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

Unified Diff: sdk/lib/_internal/compiler/implementation/ssa/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/ssa/builder.dart
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 1b78e3ce6328526839e14962ad4058196994b10a..0e43ef7ecdcd2097232ccbac5545d3c703e8d34e 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -146,7 +146,7 @@ class LocalsHandler {
// TODO(floitsch): Clean up this hack. Should we create a box-object by
// just creating an empty object literal?
JavaScriptBackend backend = builder.backend;
- HInstruction box = new HForeign(new js.ObjectInitializer([]),
+ HInstruction box = new HForeign(js.js.parseForeignJS('{}'),
backend.nonNullType,
<HInstruction>[]);
builder.add(box);
@@ -3058,7 +3058,7 @@ class SsaBuilder extends ResolvedVisitor {
return interceptor;
}
- HForeign createForeign(js.Expression code,
+ HForeign createForeign(js.Template code,
TypeMask type,
List<HInstruction> inputs) {
return new HForeign(code, type, inputs);
@@ -3088,7 +3088,9 @@ class SsaBuilder extends ResolvedVisitor {
}));
}
String template = '[${templates.join(', ')}]';
- js.Expression code = js.js.parseForeignJS(template);
+ // TODO(sra): This is a fresh template each time. We can't let the
+ // template manager build them.
+ js.Template code = js.js.uncachedExpressionTemplate(template);
HInstruction representation =
createForeign(code, backend.readableArrayType, inputs);
return representation;
@@ -3317,9 +3319,18 @@ class SsaBuilder extends ResolvedVisitor {
TypeMask ssaType =
TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler);
- push(new HForeign(nativeBehavior.codeAst, ssaType, inputs,
- effects: nativeBehavior.sideEffects,
- nativeBehavior: nativeBehavior));
+
+ if (nativeBehavior.codeTemplate.isExpression) {
+ push(new HForeign(nativeBehavior.codeTemplate, ssaType, inputs,
+ effects: nativeBehavior.sideEffects,
+ nativeBehavior: nativeBehavior));
+ } else {
+ push(new HForeign(nativeBehavior.codeTemplate, ssaType, inputs,
+ isStatement: true,
+ effects: nativeBehavior.sideEffects,
+ nativeBehavior: nativeBehavior,
+ canThrow: true));
floitsch 2014/04/22 16:11:18 Unless I'm missing something, this is an optimizat
sra1 2014/04/23 02:33:50 It is not an optimization. It is getting JS('','t
+ }
}
void handleJsStringConcat(ast.Send node) {
@@ -3341,7 +3352,7 @@ class SsaBuilder extends ResolvedVisitor {
// If the isolate library is not used, we just generate code
// to fetch the current isolate.
String name = backend.namer.currentIsolate;
- push(new HForeign(new js.LiteralString(name),
+ push(new HForeign(js.js.parseForeignJS(name),
backend.dynamicType,
<HInstruction>[]));
} else {
@@ -3496,7 +3507,8 @@ class SsaBuilder extends ResolvedVisitor {
}
compiler.enqueuer.codegen.registerStaticUse(element);
- push(new HForeign(backend.namer.elementAccess(element),
+ push(new HForeign(js.js.expressionTemplateYielding(
+ backend.namer.elementAccess(element)),
backend.dynamicType,
<HInstruction>[]));
return params;
@@ -3518,7 +3530,7 @@ class SsaBuilder extends ResolvedVisitor {
String isolateName = backend.namer.currentIsolate;
SideEffects sideEffects = new SideEffects.empty();
sideEffects.setAllSideEffects();
- push(new HForeign(js.js("$isolateName = #"),
+ push(new HForeign(js.js.parseForeignJS("$isolateName = #"),
backend.dynamicType,
<HInstruction>[pop()],
effects: sideEffects));
@@ -3529,7 +3541,7 @@ class SsaBuilder extends ResolvedVisitor {
compiler.internalError(node.argumentsNode, 'Too many arguments.');
}
String constructorName = backend.namer.isolateName;
- push(new HForeign(js.js("new $constructorName()"),
+ push(new HForeign(js.js.parseForeignJS("new $constructorName()"),
backend.dynamicType,
<HInstruction>[]));
}
@@ -3538,8 +3550,8 @@ class SsaBuilder extends ResolvedVisitor {
if (!node.arguments.isEmpty) {
compiler.internalError(node.argumentsNode, 'Too many arguments.');
}
- String jsClassReference = backend.namer.isolateAccess(compiler.objectClass);
- push(new HForeign(new js.LiteralString(jsClassReference),
+ push(new HForeign(js.js.expressionTemplateYielding(
+ backend.namer.elementAccess(compiler.objectClass)),
backend.dynamicType,
<HInstruction>[]));
}
@@ -3548,7 +3560,7 @@ class SsaBuilder extends ResolvedVisitor {
if (!node.arguments.isEmpty) {
compiler.internalError(node.argumentsNode, 'Too many arguments.');
}
- push(new HForeign(new js.LiteralString(backend.namer.currentIsolate),
+ push(new HForeign(js.js.parseForeignJS(backend.namer.currentIsolate),
backend.dynamicType,
<HInstruction>[]));
}
@@ -3854,7 +3866,7 @@ class SsaBuilder extends ResolvedVisitor {
inputs.add(addTypeVariableReference(variable));
});
- js.Expression code = js.js.parseForeignJS(template);
+ js.Template code = js.js.uncachedExpressionTemplate(template);
HInstruction result = createForeign(code, backend.stringType, inputs);
add(result);
return result;
@@ -4006,7 +4018,7 @@ class SsaBuilder extends ResolvedVisitor {
add(conversion);
inputs[0] = conversion;
}
- js.Expression code = js.js.parseForeignJS('Array(#)');
+ js.Template code = js.js.parseForeignJS('Array(#)');
var behavior = new native.NativeBehavior();
behavior.typesReturned.add(expectedType);
// The allocation can throw only if the given length is a double
@@ -4022,7 +4034,7 @@ class SsaBuilder extends ResolvedVisitor {
push(foreign);
TypesInferrer inferrer = compiler.typesTask.typesInferrer;
if (inferrer.isFixedArrayCheckedForGrowable(send)) {
- js.Expression code = js.js.parseForeignJS(r'#.fixed$length = init');
+ js.Template code = js.js.parseForeignJS(r'#.fixed$length = init');
// We set the instruction as [canThrow] to avoid it being dead code.
// We need a finer grained side effect.
add(new HForeign(
@@ -5319,7 +5331,7 @@ class SsaBuilder extends ResolvedVisitor {
// If the switch statement has no default case, surround the loop with
// a test of the target.
void buildCondition() {
- js.Expression code = js.js.parseForeignJS('#');
+ js.Template code = js.js.parseForeignJS('#');
push(createForeign(code,
backend.boolType,
[localsHandler.readLocal(switchTarget)]));

Powered by Google App Engine
This is Rietveld 408576698