vala r2084 - in trunk: . vala



Author: juergbi
Date: Sat Nov 29 12:47:52 2008
New Revision: 2084
URL: http://svn.gnome.org/viewvc/vala?rev=2084&view=rev

Log:
2008-11-29  JÃrg Billeter  <j bitron ch>

	* vala/valaflowanalyzer.vala:

	Detect unreachable code in if and while statements


Modified:
   trunk/ChangeLog
   trunk/vala/valaflowanalyzer.vala

Modified: trunk/vala/valaflowanalyzer.vala
==============================================================================
--- trunk/vala/valaflowanalyzer.vala	(original)
+++ trunk/vala/valaflowanalyzer.vala	Sat Nov 29 12:47:52 2008
@@ -541,6 +541,16 @@
 		}
 	}
 
+	bool always_true (Expression condition) {
+		var literal = condition as BooleanLiteral;
+		return (literal != null && literal.value);
+	}
+
+	bool always_false (Expression condition) {
+		var literal = condition as BooleanLiteral;
+		return (literal != null && !literal.value);
+	}
+
 	public override void visit_if_statement (IfStatement stmt) {
 		if (unreachable (stmt)) {
 			return;
@@ -553,14 +563,24 @@
 
 		// true block
 		var last_block = current_block;
-		current_block = new BasicBlock ();
-		last_block.connect (current_block);
+		if (always_false (stmt.condition)) {
+			current_block = null;
+			unreachable_reported = false;
+		} else {
+			current_block = new BasicBlock ();
+			last_block.connect (current_block);
+		}
 		stmt.true_statement.accept (this);
 
 		// false block
 		var last_true_block = current_block;
-		current_block = new BasicBlock ();
-		last_block.connect (current_block);
+		if (always_true (stmt.condition)) {
+			current_block = null;
+			unreachable_reported = false;
+		} else {
+			current_block = new BasicBlock ();
+			last_block.connect (current_block);
+		}
 		if (stmt.false_statement != null) {
 			stmt.false_statement.accept (this);
 		}
@@ -652,8 +672,13 @@
 		handle_errors (stmt.condition);
 
 		// loop block
-		current_block = new BasicBlock ();
-		condition_block.connect (current_block);
+		if (always_false (stmt.condition)) {
+			current_block = null;
+			unreachable_reported = false;
+		} else {
+			current_block = new BasicBlock ();
+			condition_block.connect (current_block);
+		}
 		stmt.body.accept (this);
 		// end of loop block reachable?
 		if (current_block != null) {
@@ -661,8 +686,14 @@
 		}
 
 		// after loop
-		condition_block.connect (after_loop_block);
-		current_block = after_loop_block;
+		// reachable?
+		if (always_true (stmt.condition) && after_loop_block.get_predecessors ().size == 0) {
+			current_block = null;
+			unreachable_reported = false;
+		} else {
+			condition_block.connect (after_loop_block);
+			current_block = after_loop_block;
+		}
 
 		jump_stack.remove_at (jump_stack.size - 1);
 		jump_stack.remove_at (jump_stack.size - 1);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]