don't emit unreachable code, patch by Ondrej Jirman
authorJuerg Billeter <j@bitron.ch>
Sat, 1 Dec 2007 16:45:54 +0000 (16:45 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 1 Dec 2007 16:45:54 +0000 (16:45 +0000)
2007-12-01  Juerg Billeter  <j@bitron.ch>

* ccode/valaccodeblock.vala: don't emit unreachable code,
  patch by Ondrej Jirman

svn path=/trunk/; revision=744

ChangeLog
ccode/valaccodeblock.vala

index 9d25b2f..cc9d6d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2007-12-01  Jürg Billeter  <j@bitron.ch>
 
+       * ccode/valaccodeblock.vala: don't emit unreachable code,
+         patch by Ondřej Jirman
+
+2007-12-01  Jürg Billeter  <j@bitron.ch>
+
        * vala/parser.y, vala/valaclass.vala, vala/valacreationmethod.vala,
          vala/valainterfacewriter.vala, vala/valamemberaccess.vala,
          vala/valasemanticanalyzer.vala, vala/valastruct.vala: don't let named
index d3df316..8ac4d74 100644 (file)
@@ -55,9 +55,28 @@ public class Vala.CCodeBlock : CCodeStatement {
                foreach (CCodeNode statement in statements) {
                        statement.write_declaration (writer);
                }
+
+               // compute last reachable statement
+               CCodeNode last_statement = null;
+               foreach (CCodeNode statement in statements) {
+                       if (statement is CCodeReturnStatement || statement is CCodeGotoStatement
+                       || statement is CCodeContinueStatement || statement is CCodeBreakStatement) {
+                               last_statement = statement;
+                       }
+                       if (statement is CCodeLabel) {
+                               last_statement = null;
+                       }
+               }
+
                foreach (CCodeNode statement in statements) {
                        statement.write (writer);
+
+                       // only output reachable code
+                       if (statement == last_statement) {
+                               break;
+                       }
                }
+
                writer.write_end_block ();
 
                if (!suppress_newline) {