Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Unified Diff: frog/leg/ssa/builder.dart

Issue 9363022: Support finally. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/co19/co19-leg.status » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « no previous file | tests/co19/co19-leg.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698