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)])); |