| 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 '../dart_types.dart'; | |
| 9 import '../elements/elements.dart'; | 8 import '../elements/elements.dart'; |
| 10 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; | 9 import '../cps_ir/cps_ir_nodes.dart' as cps_ir; |
| 11 import '../util/util.dart' show CURRENT_ELEMENT_SPANNABLE; | 10 import '../util/util.dart' show CURRENT_ELEMENT_SPANNABLE; |
| 12 import 'tree_ir_nodes.dart'; | 11 import 'tree_ir_nodes.dart'; |
| 13 | 12 |
| 14 /** | 13 /** |
| 15 * Builder translates from CPS-based IR to direct-style Tree. | 14 * Builder translates from CPS-based IR to direct-style Tree. |
| 16 * | 15 * |
| 17 * A call `Invoke(fun, cont, args)`, where cont is a singly-referenced | 16 * A call `Invoke(fun, cont, args)`, where cont is a singly-referenced |
| 18 * non-exit continuation `Cont(v, body)` is translated into a direct-style call | 17 * non-exit continuation `Cont(v, body)` is translated into a direct-style call |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 | 377 |
| 379 Statement visitRethrow(cps_ir.Rethrow node) { | 378 Statement visitRethrow(cps_ir.Rethrow node) { |
| 380 return new Rethrow(); | 379 return new Rethrow(); |
| 381 } | 380 } |
| 382 | 381 |
| 383 Statement visitUnreachable(cps_ir.Unreachable node) { | 382 Statement visitUnreachable(cps_ir.Unreachable node) { |
| 384 return new Unreachable(); | 383 return new Unreachable(); |
| 385 } | 384 } |
| 386 | 385 |
| 387 Expression visitNonTailThrow(cps_ir.NonTailThrow node) { | 386 Expression visitNonTailThrow(cps_ir.NonTailThrow node) { |
| 388 unexpectedNode(node); | 387 return unexpectedNode(node); |
| 389 } | 388 } |
| 390 | 389 |
| 391 Statement continueWithExpression(cps_ir.Reference continuation, | 390 Statement continueWithExpression(cps_ir.Reference continuation, |
| 392 Expression expression) { | 391 Expression expression) { |
| 393 cps_ir.Continuation cont = continuation.definition; | 392 cps_ir.Continuation cont = continuation.definition; |
| 394 if (cont == returnContinuation) { | 393 if (cont == returnContinuation) { |
| 395 return new Return(expression); | 394 return new Return(expression); |
| 396 } else { | 395 } else { |
| 397 assert(cont.parameters.length == 1); | 396 assert(cont.parameters.length == 1); |
| 398 Function nextBuilder = cont.hasExactlyOneUse ? | 397 Function nextBuilder = cont.hasExactlyOneUse ? |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 }) | 518 }) |
| 520 ); | 519 ); |
| 521 } | 520 } |
| 522 | 521 |
| 523 FunctionDefinition makeSubFunction(cps_ir.FunctionDefinition function) { | 522 FunctionDefinition makeSubFunction(cps_ir.FunctionDefinition function) { |
| 524 return createInnerBuilder().buildFunction(function); | 523 return createInnerBuilder().buildFunction(function); |
| 525 } | 524 } |
| 526 | 525 |
| 527 Expression visitCreateFunction(cps_ir.CreateFunction node) { | 526 Expression visitCreateFunction(cps_ir.CreateFunction node) { |
| 528 FunctionDefinition def = makeSubFunction(node.definition); | 527 FunctionDefinition def = makeSubFunction(node.definition); |
| 529 FunctionType type = node.definition.element.type; | |
| 530 bool hasReturnType = !type.returnType.treatAsDynamic; | |
| 531 return new FunctionExpression(def); | 528 return new FunctionExpression(def); |
| 532 } | 529 } |
| 533 | 530 |
| 534 visitParameter(cps_ir.Parameter node) { | 531 visitParameter(cps_ir.Parameter node) { |
| 535 // Continuation parameters are not visited (continuations themselves are | 532 // Continuation parameters are not visited (continuations themselves are |
| 536 // not visited yet). | 533 // not visited yet). |
| 537 unexpectedNode(node); | 534 unexpectedNode(node); |
| 538 } | 535 } |
| 539 | 536 |
| 540 visitContinuation(cps_ir.Continuation node) { | 537 visitContinuation(cps_ir.Continuation node) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 | 578 |
| 582 Statement visitSetStatic(cps_ir.SetStatic node) { | 579 Statement visitSetStatic(cps_ir.SetStatic node) { |
| 583 SetStatic setStatic = new SetStatic( | 580 SetStatic setStatic = new SetStatic( |
| 584 node.element, | 581 node.element, |
| 585 getVariableUse(node.value), | 582 getVariableUse(node.value), |
| 586 node.sourceInformation); | 583 node.sourceInformation); |
| 587 return new ExpressionStatement(setStatic, visit(node.body)); | 584 return new ExpressionStatement(setStatic, visit(node.body)); |
| 588 } | 585 } |
| 589 } | 586 } |
| 590 | 587 |
| OLD | NEW |