]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix error handling in constructors, patch by Jared Moore, fixes bug 543156
authorJürg Billeter <j@bitron.ch>
Tue, 16 Sep 2008 13:48:51 +0000 (13:48 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Tue, 16 Sep 2008 13:48:51 +0000 (13:48 +0000)
2008-09-16  Jürg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala:
* gobject/valaccodegenerator.vala:

Fix error handling in constructors, patch by Jared Moore,
fixes bug 543156

svn path=/trunk/; revision=1772

ChangeLog
THANKS
gobject/valaccodegenerator.vala
vala/valasemanticanalyzer.vala

index 5f20f754a97706d37984b30fe6aea342e600418f..0bf26a21726e2df5b58453e2fce2e1e6d0cbd562 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-09-16  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valasemanticanalyzer.vala:
+       * gobject/valaccodegenerator.vala:
+
+       Fix error handling in constructors, patch by Jared Moore,
+       fixes bug 543156
+
 2008-09-16  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodeinvocationexpressionbinding.vala:
diff --git a/THANKS b/THANKS
index 46829e06fc394e57a9b5dfa0c096baf698990ac2..f2116b9cb75103ef457291a2c938b5cf58188770 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -51,6 +51,7 @@ Rob Taylor
 Roberto Majadas
 Roland Hostettler
 Ross Burton
+Sam Liddicott
 Samuel Cormier-Iijima
 Stéphan Kochen
 Tai Chi Minh Ralph Eastwood
index ecbaf1ef5c559cff2f81b205c917574dc3fcc0b6..995cb47966e8621e3c26ac5ec8f013ebfe7f92a1 100644 (file)
@@ -1066,7 +1066,17 @@ public class Vala.CCodeGenerator : CodeGenerator {
 
                        source_type_member_declaration.append (base_init.copy ());
 
-                       base_init.block = (CCodeBlock) c.body.ccodenode;
+                       var block = (CCodeBlock) c.body.ccodenode;
+                       if (current_method_inner_error) {
+                               /* always separate error parameter and inner_error local variable
+                                * as error may be set to NULL but we're always interested in inner errors
+                                */
+                               var cdecl = new CCodeDeclaration ("GError *");
+                               cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("inner_error", new CCodeConstant ("NULL")));
+                               block.prepend_statement (cdecl);
+                       }
+
+                       base_init.block = block;
                
                        source_type_member_definition.append (base_init);
                } else if (c.binding == MemberBinding.STATIC) {
index b6871eb4ebadfd391f5e428f2ed689c27ae40b7c..6ef08fd26518361d069ab5813b4bee9586c386e9 100644 (file)
@@ -729,6 +729,10 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
 
                c.accept_children (this);
 
+               foreach (DataType body_error_type in c.body.get_error_types ()) {
+                       Report.warning (body_error_type.source_reference, "unhandled error `%s'".printf (body_error_type.to_string()));
+               }
+
                current_symbol = current_symbol.parent_symbol;
        }
 
@@ -1222,6 +1226,11 @@ public class Vala.SemanticAnalyzer : CodeVisitor {
                stmt.error_expression.target_type.value_owned = true;
 
                stmt.accept_children (this);
+
+               var error_type = stmt.error_expression.value_type.copy ();
+               error_type.source_reference = stmt.source_reference;
+
+               stmt.add_error_type (error_type);
        }
 
        public override void visit_try_statement (TryStatement stmt) {