Chromium Code Reviews| Index: pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart |
| diff --git a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart |
| index 0639b9127411b8569aed4bc216e8b1798bf627d6..1da49af039387e30978d8090a34f6f356b69ca4d 100644 |
| --- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart |
| +++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart |
| @@ -278,6 +278,11 @@ class StatementRewriter extends Transformer implements Pass { |
| // it means we are looking at the first use. |
| assert(unseenUses[node.variable] < node.variable.readCount); |
| assert(unseenUses[node.variable] >= 0); |
| + |
| + // We cannot reliably find the first dynamic use of a variable that is |
| + // accessed from a JS function in a foreign code fragment. |
| + if (node.variable.isCaptured) return node; |
| + |
| bool isFirstUse = unseenUses[node.variable] == 0; |
| // Propagate constant to use site. |
| @@ -1139,15 +1144,25 @@ class StatementRewriter extends Transformer implements Pass { |
| return polarity ? node.thenStatement : node.elseStatement; |
| } |
| + void handleForeignCode(ForeignCode node) { |
| + // Arguments will get inserted in a JS code template. The arguments will |
| + // not always be evaluated (e.g. if the template is '# && #'). |
| + // TODO(asgerf): We could analyze the JS AST to see if arguments are |
| + // definitely evaluated left-to-right. |
|
sra1
2015/11/12 02:30:08
We need to do this. The cost on code quality of no
asgerf
2015/11/12 12:09:46
I think we can encode the whole thing with an inte
|
| + inEmptyEnvironment(() { |
| + _rewriteList(node.arguments); |
| + }); |
| + } |
| + |
| @override |
| Expression visitForeignExpression(ForeignExpression node) { |
| - _rewriteList(node.arguments); |
| + handleForeignCode(node); |
| return node; |
| } |
| @override |
| Statement visitForeignStatement(ForeignStatement node) { |
| - _rewriteList(node.arguments); |
| + handleForeignCode(node); |
| return node; |
| } |