| Index: frog/leg/ssa/builder.dart
|
| ===================================================================
|
| --- frog/leg/ssa/builder.dart (revision 4029)
|
| +++ frog/leg/ssa/builder.dart (working copy)
|
| @@ -1721,16 +1721,16 @@
|
| HBasicBlock enterBlock = graph.addNewBlock();
|
| close(new HGoto()).addSuccessor(enterBlock);
|
| open(enterBlock);
|
| - close(new HTry());
|
| + HTry tryInstruction = new HTry();
|
| + close(tryInstruction);
|
|
|
| HBasicBlock tryBody = graph.addNewBlock();
|
| enterBlock.addSuccessor(tryBody);
|
| open(tryBody);
|
| visit(node.tryBlock);
|
| - HBasicBlock endTryBody;
|
| - if (!isAborted()) endTryBody = close(new HGoto());
|
| + List<HBasicBlock> blocks = <HBasicBlock>[];
|
| + if (!isAborted()) blocks.add(close(new HGoto()));
|
|
|
| - List<HBasicBlock> catchBlocks = <HBasicBlock>[];
|
| int catchBlocksCount = 0;
|
| for (CatchBlock catchBlock in node.catchBlocks.nodes) {
|
| if (++catchBlocksCount != 1) {
|
| @@ -1740,27 +1740,29 @@
|
| enterBlock.addSuccessor(block);
|
| open(block);
|
| visit(catchBlock);
|
| - if (!isAborted()) {
|
| - close(new HGoto());
|
| - catchBlocks.add(block);
|
| - }
|
| + if (!isAborted()) blocks.add(close(new HGoto()));
|
| }
|
|
|
| - HBasicBlock exitBlock = graph.addNewBlock();
|
| -
|
| - if (endTryBody != null) {
|
| - endTryBody.addSuccessor(exitBlock);
|
| + if (node.finallyBlock != null) {
|
| + HBasicBlock finallyBlock = graph.addNewBlock();
|
| + enterBlock.addSuccessor(finallyBlock);
|
| + open(finallyBlock);
|
| + visit(node.finallyBlock);
|
| + if (!isAborted()) blocks.add(close(new HGoto()));
|
| + tryInstruction.finallyBlock = finallyBlock;
|
| }
|
|
|
| - for (HBasicBlock block in catchBlocks) {
|
| - block.addSuccessor(exitBlock);
|
| - }
|
| + // If no block is going to an exit block, the Dart code after the
|
| + // try is dead code.
|
| + if (!blocks.isEmpty()) {
|
| + HBasicBlock exitBlock = graph.addNewBlock();
|
|
|
| - if (node.finallyBlock != null) {
|
| - compiler.unimplemented('SsaBuilder finally block', node: node);
|
| + for (HBasicBlock block in blocks) {
|
| + block.addSuccessor(exitBlock);
|
| + }
|
| +
|
| + open(exitBlock);
|
| }
|
| -
|
| - open(exitBlock);
|
| }
|
|
|
| visitScriptTag(ScriptTag node) {
|
|
|