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 tree_ir_builder; | 5 library tree_ir_builder; |
6 | 6 |
7 import '../dart2jslib.dart' as dart2js; | 7 import '../dart2jslib.dart' as dart2js; |
8 import '../elements/elements.dart'; | 8 import '../elements/elements.dart'; |
9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; | 9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; |
10 import '../util/util.dart' show CURRENT_ELEMENT_SPANNABLE; | 10 import '../util/util.dart' show CURRENT_ELEMENT_SPANNABLE; |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 } | 260 } |
261 return first; | 261 return first; |
262 } | 262 } |
263 | 263 |
264 visit(cps_ir.Node node) => node.accept(this); | 264 visit(cps_ir.Node node) => node.accept(this); |
265 | 265 |
266 unexpectedNode(cps_ir.Node node) { | 266 unexpectedNode(cps_ir.Node node) { |
267 internalError(CURRENT_ELEMENT_SPANNABLE, 'Unexpected IR node: $node'); | 267 internalError(CURRENT_ELEMENT_SPANNABLE, 'Unexpected IR node: $node'); |
268 } | 268 } |
269 | 269 |
270 // JS-specific nodes are handled by a subclass. | 270 Statement visitSetField(cps_ir.SetField node) { |
271 visitSetField(cps_ir.SetField node) => unexpectedNode(node); | 271 return new ExpressionStatement( |
272 visitIdentical(cps_ir.Identical node) => unexpectedNode(node); | 272 new SetField(getVariableUse(node.object), |
273 visitInterceptor(cps_ir.Interceptor node) => unexpectedNode(node); | 273 node.field, |
274 visitCreateInstance(cps_ir.CreateInstance node) => unexpectedNode(node); | 274 getVariableUse(node.value)), |
275 visitGetField(cps_ir.GetField node) => unexpectedNode(node); | 275 visit(node.body)); |
276 visitCreateBox(cps_ir.CreateBox node) => unexpectedNode(node); | 276 } |
| 277 |
| 278 Expression visitInterceptor(cps_ir.Interceptor node) { |
| 279 return new Interceptor(getVariableUse(node.input), node.interceptedClasses); |
| 280 } |
| 281 |
| 282 Expression visitCreateInstance(cps_ir.CreateInstance node) { |
| 283 return new CreateInstance( |
| 284 node.classElement, |
| 285 translateArguments(node.arguments), |
| 286 translateArguments(node.typeInformation)); |
| 287 } |
| 288 |
| 289 Expression visitGetField(cps_ir.GetField node) { |
| 290 return new GetField(getVariableUse(node.object), node.field); |
| 291 } |
| 292 |
| 293 Expression visitCreateBox(cps_ir.CreateBox node) { |
| 294 return new CreateBox(); |
| 295 } |
| 296 |
277 visitCreateInvocationMirror(cps_ir.CreateInvocationMirror node) { | 297 visitCreateInvocationMirror(cps_ir.CreateInvocationMirror node) { |
278 return unexpectedNode(node); | 298 return new CreateInvocationMirror( |
| 299 node.selector, |
| 300 translateArguments(node.arguments)); |
279 } | 301 } |
280 | 302 |
281 // Executable definitions are not visited directly. They have 'build' | 303 // Executable definitions are not visited directly. They have 'build' |
282 // functions as entry points. | 304 // functions as entry points. |
283 visitFunctionDefinition(cps_ir.FunctionDefinition node) { | 305 visitFunctionDefinition(cps_ir.FunctionDefinition node) { |
284 return unexpectedNode(node); | 306 return unexpectedNode(node); |
285 } | 307 } |
286 | 308 |
287 Statement visitLetPrim(cps_ir.LetPrim node) { | 309 Statement visitLetPrim(cps_ir.LetPrim node) { |
288 Variable variable = getVariable(node.primitive); | 310 Variable variable = getVariable(node.primitive); |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
579 } | 601 } |
580 | 602 |
581 Expression visitApplyBuiltinOperator(cps_ir.ApplyBuiltinOperator node) { | 603 Expression visitApplyBuiltinOperator(cps_ir.ApplyBuiltinOperator node) { |
582 if (node.operator == BuiltinOperator.IsFalsy) { | 604 if (node.operator == BuiltinOperator.IsFalsy) { |
583 return new Not(getVariableUse(node.arguments.single)); | 605 return new Not(getVariableUse(node.arguments.single)); |
584 } | 606 } |
585 return new ApplyBuiltinOperator(node.operator, | 607 return new ApplyBuiltinOperator(node.operator, |
586 translateArguments(node.arguments)); | 608 translateArguments(node.arguments)); |
587 } | 609 } |
588 | 610 |
589 @override | 611 Statement visitForeignCode(cps_ir.ForeignCode node) { |
590 visitForeignCode(cps_ir.ForeignCode node) { | 612 if (node.codeTemplate.isExpression) { |
591 unexpectedNode(node); | 613 Expression foreignCode = new ForeignExpression( |
| 614 node.codeTemplate, |
| 615 node.type, |
| 616 node.arguments.map(getVariableUse).toList(growable: false), |
| 617 node.nativeBehavior, |
| 618 node.dependency); |
| 619 return continueWithExpression(node.continuation, foreignCode); |
| 620 } else { |
| 621 assert(node.continuation == null); |
| 622 return new ForeignStatement( |
| 623 node.codeTemplate, |
| 624 node.type, |
| 625 node.arguments.map(getVariableUse).toList(growable: false), |
| 626 node.nativeBehavior, |
| 627 node.dependency); |
| 628 } |
592 } | 629 } |
593 } | 630 } |
594 | 631 |
OLD | NEW |