| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * A special element for the extra parameter taken by intercepted | 8 * A special element for the extra parameter taken by intercepted |
| 9 * methods. We need to override [Element.computeType] because our | 9 * methods. We need to override [Element.computeType] because our |
| 10 * optimizers may look at its declared type. | 10 * optimizers may look at its declared type. |
| (...skipping 4599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4610 HBasicBlock startTryBlock; | 4610 HBasicBlock startTryBlock; |
| 4611 HBasicBlock endTryBlock; | 4611 HBasicBlock endTryBlock; |
| 4612 HBasicBlock startCatchBlock; | 4612 HBasicBlock startCatchBlock; |
| 4613 HBasicBlock endCatchBlock; | 4613 HBasicBlock endCatchBlock; |
| 4614 HBasicBlock startFinallyBlock; | 4614 HBasicBlock startFinallyBlock; |
| 4615 HBasicBlock endFinallyBlock; | 4615 HBasicBlock endFinallyBlock; |
| 4616 | 4616 |
| 4617 startTryBlock = graph.addNewBlock(); | 4617 startTryBlock = graph.addNewBlock(); |
| 4618 open(startTryBlock); | 4618 open(startTryBlock); |
| 4619 visit(node.tryBlock); | 4619 visit(node.tryBlock); |
| 4620 if (!isAborted()) endTryBlock = close(new HGoto()); | 4620 // We use a [HExitTry] instead of a [HGoto] for the try block |
| 4621 // because it will have multiple successors: the join block, and |
| 4622 // the catch or finally block. |
| 4623 if (!isAborted()) endTryBlock = close(new HExitTry()); |
| 4621 SubGraph bodyGraph = new SubGraph(startTryBlock, lastOpenedBlock); | 4624 SubGraph bodyGraph = new SubGraph(startTryBlock, lastOpenedBlock); |
| 4622 SubGraph catchGraph = null; | 4625 SubGraph catchGraph = null; |
| 4623 HLocalValue exception = null; | 4626 HLocalValue exception = null; |
| 4624 | 4627 |
| 4625 if (!node.catchBlocks.isEmpty) { | 4628 if (!node.catchBlocks.isEmpty) { |
| 4626 localsHandler = new LocalsHandler.from(savedLocals); | 4629 localsHandler = new LocalsHandler.from(savedLocals); |
| 4627 startCatchBlock = graph.addNewBlock(); | 4630 startCatchBlock = graph.addNewBlock(); |
| 4628 open(startCatchBlock); | 4631 open(startCatchBlock); |
| 4629 // TODO(kasperl): Bad smell. We shouldn't be constructing elements here. | 4632 // TODO(kasperl): Bad smell. We shouldn't be constructing elements here. |
| 4630 // Note that the name of this element is irrelevant. | 4633 // Note that the name of this element is irrelevant. |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4769 enterBlock.addSuccessor(startTryBlock); | 4772 enterBlock.addSuccessor(startTryBlock); |
| 4770 addOptionalSuccessor(enterBlock, startCatchBlock); | 4773 addOptionalSuccessor(enterBlock, startCatchBlock); |
| 4771 addOptionalSuccessor(enterBlock, startFinallyBlock); | 4774 addOptionalSuccessor(enterBlock, startFinallyBlock); |
| 4772 enterBlock.addSuccessor(exitBlock); | 4775 enterBlock.addSuccessor(exitBlock); |
| 4773 | 4776 |
| 4774 // The body has either the catch or the finally block as successor. | 4777 // The body has either the catch or the finally block as successor. |
| 4775 if (endTryBlock != null) { | 4778 if (endTryBlock != null) { |
| 4776 assert(startCatchBlock != null || startFinallyBlock != null); | 4779 assert(startCatchBlock != null || startFinallyBlock != null); |
| 4777 endTryBlock.addSuccessor( | 4780 endTryBlock.addSuccessor( |
| 4778 startCatchBlock != null ? startCatchBlock : startFinallyBlock); | 4781 startCatchBlock != null ? startCatchBlock : startFinallyBlock); |
| 4782 endTryBlock.addSuccessor(exitBlock); |
| 4779 } | 4783 } |
| 4780 | 4784 |
| 4781 // The catch block has either the finally or the exit block as | 4785 // The catch block has either the finally or the exit block as |
| 4782 // successor. | 4786 // successor. |
| 4783 if (endCatchBlock != null) { | 4787 if (endCatchBlock != null) { |
| 4784 endCatchBlock.addSuccessor( | 4788 endCatchBlock.addSuccessor( |
| 4785 startFinallyBlock != null ? startFinallyBlock : exitBlock); | 4789 startFinallyBlock != null ? startFinallyBlock : exitBlock); |
| 4786 } | 4790 } |
| 4787 | 4791 |
| 4788 // The finally block has the exit block as successor. | 4792 // The finally block has the exit block as successor. |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5231 new HSubGraphBlockInformation(elseBranch.graph)); | 5235 new HSubGraphBlockInformation(elseBranch.graph)); |
| 5232 | 5236 |
| 5233 HBasicBlock conditionStartBlock = conditionBranch.block; | 5237 HBasicBlock conditionStartBlock = conditionBranch.block; |
| 5234 conditionStartBlock.setBlockFlow(info, joinBlock); | 5238 conditionStartBlock.setBlockFlow(info, joinBlock); |
| 5235 SubGraph conditionGraph = conditionBranch.graph; | 5239 SubGraph conditionGraph = conditionBranch.graph; |
| 5236 HIf branch = conditionGraph.end.last; | 5240 HIf branch = conditionGraph.end.last; |
| 5237 assert(branch is HIf); | 5241 assert(branch is HIf); |
| 5238 branch.blockInformation = conditionStartBlock.blockFlow; | 5242 branch.blockInformation = conditionStartBlock.blockFlow; |
| 5239 } | 5243 } |
| 5240 } | 5244 } |
| OLD | NEW |