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