]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Eliminate unnecessary error check after try statements
authorJürg Billeter <j@bitron.ch>
Thu, 25 Mar 2010 08:29:49 +0000 (09:29 +0100)
committerJürg Billeter <j@bitron.ch>
Thu, 25 Mar 2010 08:31:52 +0000 (09:31 +0100)
This fixes a C warning about missing return in non-void function.

codegen/valaccodemodule.vala
codegen/valagerrormodule.vala
vala/valaflowanalyzer.vala
vala/valatrystatement.vala

index 0355e0c2762a8734b805c00a9af7224cb4cac88f..523ac083d9786b5e20f38766c7d961e685fa1647 100644 (file)
@@ -431,7 +431,7 @@ public abstract class Vala.CCodeModule {
                return next.get_array_size_cexpression (array_expr);
        }
 
-       public virtual void add_simple_check (CodeNode node, CCodeFragment cfrag) {
-               next.add_simple_check (node, cfrag);
+       public virtual void add_simple_check (CodeNode node, CCodeFragment cfrag, bool always_fails = false) {
+               next.add_simple_check (node, cfrag, always_fails);
        }
 }
index 51c8132854d971f2dbed94d11e18ca897a73e1f8..1dc47fcafb650c3ebd837ac870f1f9b12613336c 100644 (file)
@@ -94,7 +94,7 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
                var cassign = new CCodeAssignment (get_variable_cexpression ("_inner_error_"), (CCodeExpression) stmt.error_expression.ccodenode);
                cfrag.append (new CCodeExpressionStatement (cassign));
 
-               head.add_simple_check (stmt, cfrag);
+               head.add_simple_check (stmt, cfrag, true);
 
                stmt.ccodenode = cfrag;
 
@@ -188,7 +188,7 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
                return false;
        }
 
-       public override void add_simple_check (CodeNode node, CCodeFragment cfrag) {
+       public override void add_simple_check (CodeNode node, CCodeFragment cfrag, bool always_fails = false) {
                current_method_inner_error = true;
 
                var inner_error = get_variable_cexpression ("_inner_error_");
@@ -309,7 +309,7 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
                        cerror_handler = uncaught_error_statement (inner_error);
                }
 
-               if (node is ThrowStatement) {
+               if (always_fails) {
                        // inner_error is always set, avoid unnecessary if statement
                        // eliminates C warnings
                        cfrag.append (cerror_handler);
@@ -364,7 +364,7 @@ internal class Vala.GErrorModule : CCodeDelegateModule {
 
                // check for errors not handled by this try statement
                // may be handled by outer try statements or propagated
-               add_simple_check (stmt, cfrag);
+               add_simple_check (stmt, cfrag, !stmt.after_try_block_reachable);
 
                stmt.ccodenode = cfrag;
        }
index 193f6103a59acfee073cceb56e3c8dd975c49aef..9a04e1ba059defa62dd2f254713b3fe59c909967 100644 (file)
@@ -1001,6 +1001,7 @@ public class Vala.FlowAnalyzer : CodeVisitor {
                if (after_try_block.get_predecessors ().size > 0) {
                        current_block = after_try_block;
                } else {
+                       stmt.after_try_block_reachable = false;
                        current_block = null;
                        unreachable_reported = false;
                }
index 4bf6e7a61fd9121979f3d3b2c063df6de0727be2..540af3e059fcdfff34c189a818b828b976365820 100644 (file)
@@ -1,6 +1,6 @@
 /* valatrystatement.vala
  *
- * Copyright (C) 2007-2008  Jürg Billeter
+ * Copyright (C) 2007-2010  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -49,6 +49,8 @@ public class Vala.TryStatement : CodeNode, Statement {
                }
        }
 
+       public bool after_try_block_reachable { get; set; default = true; }
+
        private Block _body;
        private Block _finally_body;
        private List<CatchClause> catch_clauses = new ArrayList<CatchClause> ();