vala r2084 - in trunk: . vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2084 - in trunk: . vala
- Date: Sat, 29 Nov 2008 12:47:52 +0000 (UTC)
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]