[vala] Fix flow analysis in finally blocks
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Subject: [vala] Fix flow analysis in finally blocks
- Date: Tue, 28 Jul 2009 22:02:45 +0000 (UTC)
commit 8bfd36a0f432bc668db05ac0d1627d33c3754e78
Author: Jürg Billeter <j bitron ch>
Date: Wed Jul 29 00:01:55 2009 +0200
Fix flow analysis in finally blocks
Fixes bug 590069.
vala/valaflowanalyzer.vala | 18 ++++++++++++++++--
1 files changed, 16 insertions(+), 2 deletions(-)
---
diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala
index 320b8f0..1dfceb1 100644
--- a/vala/valaflowanalyzer.vala
+++ b/vala/valaflowanalyzer.vala
@@ -62,6 +62,14 @@ public class Vala.FlowAnalyzer : CodeVisitor {
is_error_target = true;
}
+ public JumpTarget.any_target (BasicBlock basic_block) {
+ this.basic_block = basic_block;
+ is_break_target = true;
+ is_continue_target = true;
+ is_return_target = true;
+ is_error_target = true;
+ }
+
public JumpTarget.finally_clause (BasicBlock basic_block, BasicBlock last_block) {
this.basic_block = basic_block;
this.last_block = last_block;
@@ -873,14 +881,20 @@ public class Vala.FlowAnalyzer : CodeVisitor {
if (stmt.finally_body != null) {
finally_block = new BasicBlock ();
current_block = finally_block;
+
+ // trap all forbidden jumps
+ var invalid_block = new BasicBlock ();
+ jump_stack.add (new JumpTarget.any_target (invalid_block));
+
stmt.finally_body.accept (this);
- if (current_block == null) {
+ if (invalid_block.get_predecessors ().size > 0) {
// don't allow finally blocks with e.g. return statements
- Report.error (stmt.source_reference, "end of finally block not reachable");
+ Report.error (stmt.source_reference, "jump out of finally block not permitted");
stmt.error = true;
return;
}
+ jump_stack.remove_at (jump_stack.size - 1);
jump_stack.add (new JumpTarget.finally_clause (finally_block, current_block));
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]