[vala] Fix flow analysis in finally blocks



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]