| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library code_generator; | 5 library code_generator; |
| 6 | 6 |
| 7 import 'glue.dart'; | 7 import 'glue.dart'; |
| 8 | 8 |
| 9 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir; | 9 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir; |
| 10 import '../../js/js.dart' as js; | 10 import '../../js/js.dart' as js; |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 // [Entity]s or add a specialized Tree-IR node for interceptor calls. | 200 // [Entity]s or add a specialized Tree-IR node for interceptor calls. |
| 201 registry.registerUseInterceptor(); | 201 registry.registerUseInterceptor(); |
| 202 js.VariableUse interceptorLibrary = glue.getInterceptorLibrary(); | 202 js.VariableUse interceptorLibrary = glue.getInterceptorLibrary(); |
| 203 return js.propertyCall(interceptorLibrary, selector.name, arguments); | 203 return js.propertyCall(interceptorLibrary, selector.name, arguments); |
| 204 } else { | 204 } else { |
| 205 js.Expression elementAccess = glue.staticFunctionAccess(target); | 205 js.Expression elementAccess = glue.staticFunctionAccess(target); |
| 206 return new js.Call(elementAccess, arguments); | 206 return new js.Call(elementAccess, arguments); |
| 207 } | 207 } |
| 208 } | 208 } |
| 209 | 209 |
| 210 List<js.Expression> compileStaticArgumentList( |
| 211 Selector selector, |
| 212 Element target, /* TODO(karlklose): this should be the signature. */ |
| 213 List<tree_ir.Expression> arguments) { |
| 214 return selector.makeArgumentsList( |
| 215 target.implementation, |
| 216 visitArguments(arguments), |
| 217 compileConstant); |
| 218 } |
| 219 |
| 210 @override | 220 @override |
| 211 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { | 221 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { |
| 212 checkStaticTargetIsValid(node, node.target); | 222 checkStaticTargetIsValid(node, node.target); |
| 213 | 223 |
| 214 if (node.constant != null) return giveup(node); | 224 if (node.constant != null) return giveup(node); |
| 215 registry.registerInstantiatedClass(node.target.enclosingClass); | 225 registry.registerInstantiatedClass(node.target.enclosingClass); |
| 216 Selector selector = node.selector; | 226 Selector selector = node.selector; |
| 217 FunctionElement target = node.target; | 227 FunctionElement target = node.target; |
| 218 List<js.Expression> arguments = visitArguments(node.arguments); | 228 List<js.Expression> arguments = |
| 229 compileStaticArgumentList(selector, target, node.arguments); |
| 219 return buildStaticInvoke(selector, target, arguments); | 230 return buildStaticInvoke(selector, target, arguments); |
| 220 } | 231 } |
| 221 | 232 |
| 222 void registerMethodInvoke(tree_ir.InvokeMethod node) { | 233 void registerMethodInvoke(tree_ir.InvokeMethod node) { |
| 223 Selector selector = node.selector; | 234 Selector selector = node.selector; |
| 224 if (selector.isGetter) { | 235 if (selector.isGetter) { |
| 225 registry.registerDynamicGetter(selector); | 236 registry.registerDynamicGetter(selector); |
| 226 } else if (selector.isSetter) { | 237 } else if (selector.isSetter) { |
| 227 registry.registerDynamicSetter(selector); | 238 registry.registerDynamicSetter(selector); |
| 228 } else { | 239 } else { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 271 |
| 261 @override | 272 @override |
| 262 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { | 273 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { |
| 263 checkStaticTargetIsValid(node, node.target); | 274 checkStaticTargetIsValid(node, node.target); |
| 264 | 275 |
| 265 if (node.target is! FunctionElement) { | 276 if (node.target is! FunctionElement) { |
| 266 giveup(node, 'static getters and setters are not supported.'); | 277 giveup(node, 'static getters and setters are not supported.'); |
| 267 } | 278 } |
| 268 Selector selector = node.selector; | 279 Selector selector = node.selector; |
| 269 FunctionElement target = node.target; | 280 FunctionElement target = node.target; |
| 270 List<js.Expression> arguments = visitArguments(node.arguments); | 281 List<js.Expression> arguments = |
| 282 compileStaticArgumentList(selector, target, node.arguments); |
| 271 return buildStaticInvoke(selector, target, arguments); | 283 return buildStaticInvoke(selector, target, arguments); |
| 272 } | 284 } |
| 273 | 285 |
| 274 @override | 286 @override |
| 275 js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) { | 287 js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) { |
| 276 registry.registerDirectInvocation(node.target.declaration); | 288 registry.registerDirectInvocation(node.target.declaration); |
| 277 if (node.target is ConstructorBodyElement) { | 289 if (node.target is ConstructorBodyElement) { |
| 278 // A constructor body cannot be overriden or intercepted, so we can | 290 // A constructor body cannot be overriden or intercepted, so we can |
| 279 // use the short form for this invocation. | 291 // use the short form for this invocation. |
| 280 // TODO(asgerf): prevent name clash between constructor bodies. | 292 // TODO(asgerf): prevent name clash between constructor bodies. |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 void visitSetField(tree_ir.SetField node) { | 535 void visitSetField(tree_ir.SetField node) { |
| 524 js.PropertyAccess field = | 536 js.PropertyAccess field = |
| 525 new js.PropertyAccess.field( | 537 new js.PropertyAccess.field( |
| 526 visitExpression(node.object), | 538 visitExpression(node.object), |
| 527 glue.instanceFieldPropertyName(node.field)); | 539 glue.instanceFieldPropertyName(node.field)); |
| 528 js.Assignment asn = new js.Assignment(field, visitExpression(node.value)); | 540 js.Assignment asn = new js.Assignment(field, visitExpression(node.value)); |
| 529 accumulator.add(new js.ExpressionStatement(asn)); | 541 accumulator.add(new js.ExpressionStatement(asn)); |
| 530 visitStatement(node.next); | 542 visitStatement(node.next); |
| 531 } | 543 } |
| 532 } | 544 } |
| OLD | NEW |