Chromium Code Reviews| 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 } | |
|
asgerf
2015/02/09 14:44:30
Arguments with side effects would get reordered he
| |
| 219 | |
| 220 @override | 210 @override |
| 221 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { | 211 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { |
| 222 checkStaticTargetIsValid(node, node.target); | 212 checkStaticTargetIsValid(node, node.target); |
| 223 | 213 |
| 224 if (node.constant != null) return giveup(node); | 214 if (node.constant != null) return giveup(node); |
| 225 registry.registerInstantiatedClass(node.target.enclosingClass); | 215 registry.registerInstantiatedClass(node.target.enclosingClass); |
| 226 Selector selector = node.selector; | 216 Selector selector = node.selector; |
| 227 FunctionElement target = node.target; | 217 FunctionElement target = node.target; |
| 228 List<js.Expression> arguments = | 218 List<js.Expression> arguments = visitArguments(node.arguments); |
| 229 compileStaticArgumentList(selector, target, node.arguments); | |
| 230 return buildStaticInvoke(selector, target, arguments); | 219 return buildStaticInvoke(selector, target, arguments); |
| 231 } | 220 } |
| 232 | 221 |
| 233 void registerMethodInvoke(tree_ir.InvokeMethod node) { | 222 void registerMethodInvoke(tree_ir.InvokeMethod node) { |
| 234 Selector selector = node.selector; | 223 Selector selector = node.selector; |
| 235 if (selector.isGetter) { | 224 if (selector.isGetter) { |
| 236 registry.registerDynamicGetter(selector); | 225 registry.registerDynamicGetter(selector); |
| 237 } else if (selector.isSetter) { | 226 } else if (selector.isSetter) { |
| 238 registry.registerDynamicSetter(selector); | 227 registry.registerDynamicSetter(selector); |
| 239 } else { | 228 } else { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 271 | 260 |
| 272 @override | 261 @override |
| 273 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { | 262 js.Expression visitInvokeStatic(tree_ir.InvokeStatic node) { |
| 274 checkStaticTargetIsValid(node, node.target); | 263 checkStaticTargetIsValid(node, node.target); |
| 275 | 264 |
| 276 if (node.target is! FunctionElement) { | 265 if (node.target is! FunctionElement) { |
| 277 giveup(node, 'static getters and setters are not supported.'); | 266 giveup(node, 'static getters and setters are not supported.'); |
| 278 } | 267 } |
| 279 Selector selector = node.selector; | 268 Selector selector = node.selector; |
| 280 FunctionElement target = node.target; | 269 FunctionElement target = node.target; |
| 281 List<js.Expression> arguments = | 270 List<js.Expression> arguments = visitArguments(node.arguments); |
| 282 compileStaticArgumentList(selector, target, node.arguments); | |
| 283 return buildStaticInvoke(selector, target, arguments); | 271 return buildStaticInvoke(selector, target, arguments); |
| 284 } | 272 } |
| 285 | 273 |
| 286 @override | 274 @override |
| 287 js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) { | 275 js.Expression visitInvokeMethodDirectly(tree_ir.InvokeMethodDirectly node) { |
| 288 registry.registerDirectInvocation(node.target.declaration); | 276 registry.registerDirectInvocation(node.target.declaration); |
| 289 if (node.target is ConstructorBodyElement) { | 277 if (node.target is ConstructorBodyElement) { |
| 290 // A constructor body cannot be overriden or intercepted, so we can | 278 // A constructor body cannot be overriden or intercepted, so we can |
| 291 // use the short form for this invocation. | 279 // use the short form for this invocation. |
| 292 // TODO(asgerf): prevent name clash between constructor bodies. | 280 // TODO(asgerf): prevent name clash between constructor bodies. |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 535 void visitSetField(tree_ir.SetField node) { | 523 void visitSetField(tree_ir.SetField node) { |
| 536 js.PropertyAccess field = | 524 js.PropertyAccess field = |
| 537 new js.PropertyAccess.field( | 525 new js.PropertyAccess.field( |
| 538 visitExpression(node.object), | 526 visitExpression(node.object), |
| 539 glue.instanceFieldPropertyName(node.field)); | 527 glue.instanceFieldPropertyName(node.field)); |
| 540 js.Assignment asn = new js.Assignment(field, visitExpression(node.value)); | 528 js.Assignment asn = new js.Assignment(field, visitExpression(node.value)); |
| 541 accumulator.add(new js.ExpressionStatement(asn)); | 529 accumulator.add(new js.ExpressionStatement(asn)); |
| 542 visitStatement(node.next); | 530 visitStatement(node.next); |
| 543 } | 531 } |
| 544 } | 532 } |
| OLD | NEW |