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