Chromium Code Reviews| Index: lib/src/codegen/js_codegen.dart |
| diff --git a/lib/src/codegen/js_codegen.dart b/lib/src/codegen/js_codegen.dart |
| index 20a1eccf4d49d92187b63aa90a9ec7f991c0259e..b33fd70b6f5f84e4d6247405fe6b480f5e3277e0 100644 |
| --- a/lib/src/codegen/js_codegen.dart |
| +++ b/lib/src/codegen/js_codegen.dart |
| @@ -1476,7 +1476,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| id = lhs.identifier; |
| } |
| - if (target != null && rules.isDynamicTarget(target)) { |
| + if (target != null && DynamicInvoke.get(target)) { |
| return js.call('dart.$DPUT(#, #, #)', [ |
| _visit(target), |
| _emitMemberName(id.name, type: getStaticType(target)), |
| @@ -1517,7 +1517,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| String code; |
| if (target == null || isLibraryPrefix(target)) { |
| - if (rules.isDynamicCall(node.methodName)) { |
| + if (DynamicInvoke.get(node.methodName)) { |
| code = 'dart.$DCALL(#, #)'; |
| } else { |
| code = '#(#)'; |
| @@ -1532,9 +1532,9 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| bool isStatic = element is ExecutableElement && element.isStatic; |
| var memberName = _emitMemberName(name, type: type, isStatic: isStatic); |
| - if (rules.isDynamicTarget(target)) { |
| + if (DynamicInvoke.get(target)) { |
| code = 'dart.$DSEND(#, #, #)'; |
| - } else if (rules.isDynamicCall(node.methodName)) { |
| + } else if (DynamicInvoke.get(node.methodName)) { |
| // This is a dynamic call to a statically know target. For example: |
| // class Foo { Function bar; } |
| // new Foo().bar(); // dynamic call |
| @@ -1576,7 +1576,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| JS.Expression visitFunctionExpressionInvocation( |
| FunctionExpressionInvocation node) { |
| var code; |
| - if (rules.isDynamicCall(node.function)) { |
| + if (DynamicInvoke.get(node.function)) { |
| code = 'dart.$DCALL(#, #)'; |
| } else { |
| code = '#(#)'; |
| @@ -1987,6 +1987,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| new SimpleIdentifier(new StringToken(TokenType.IDENTIFIER, name, -1)); |
| id.staticElement = new TemporaryVariableElement.forNode(id); |
| id.staticType = type; |
| + DynamicInvoke.set(id, type.isDynamic); |
|
Jennifer Messerly
2015/06/12 18:18:09
this is the downside, it's one more bit to copy ..
|
| return id; |
| } |
| @@ -2014,25 +2015,30 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| /// needed. |
| Expression _bindLeftHandSide( |
| Map<String, JS.Expression> scope, Expression expr, {Expression context}) { |
| + Expression result; |
| if (expr is IndexExpression) { |
| IndexExpression index = expr; |
| - return new IndexExpression.forTarget( |
| + result = new IndexExpression.forTarget( |
| _bindValue(scope, 'o', index.target, context: context), |
| index.leftBracket, |
| _bindValue(scope, 'i', index.index, context: context), |
| - index.rightBracket)..staticType = expr.staticType; |
| + index.rightBracket); |
| } else if (expr is PropertyAccess) { |
| PropertyAccess prop = expr; |
| - return new PropertyAccess( |
| + result = new PropertyAccess( |
| _bindValue(scope, 'o', _getTarget(prop), context: context), |
| - prop.operator, prop.propertyName)..staticType = expr.staticType; |
| + prop.operator, prop.propertyName); |
| } else if (expr is PrefixedIdentifier) { |
| PrefixedIdentifier ident = expr; |
| - return new PrefixedIdentifier( |
| + result = new PrefixedIdentifier( |
| _bindValue(scope, 'o', ident.prefix, context: context), ident.period, |
| - ident.identifier)..staticType = expr.staticType; |
| + ident.identifier); |
| + } else { |
| + return expr as SimpleIdentifier; |
| } |
| - return expr as SimpleIdentifier; |
| + result.staticType = expr.staticType; |
| + DynamicInvoke.set(result, DynamicInvoke.get(expr)); |
| + return result; |
| } |
| /// Creates a temporary to contain the value of [expr]. The temporary can be |
| @@ -2208,7 +2214,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| } |
| var name = _emitMemberName(memberId.name, |
| type: getStaticType(target), isStatic: isStatic); |
| - if (rules.isDynamicTarget(target)) { |
| + if (DynamicInvoke.get(target)) { |
| return js.call('dart.$DLOAD(#, #)', [_visit(target), name]); |
| } |
| @@ -2238,7 +2244,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor { |
| Expression target, String name, List<Expression> args) { |
| var type = getStaticType(target); |
| var memberName = _emitMemberName(name, unary: args.isEmpty, type: type); |
| - if (rules.isDynamicTarget(target)) { |
| + if (DynamicInvoke.get(target)) { |
| // dynamic dispatch |
| var dynamicHelper = const {'[]': DINDEX, '[]=': DSETINDEX}[name]; |
| if (dynamicHelper != null) { |