]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix error propagation in constructor chain up
authorJürg Billeter <j@bitron.ch>
Mon, 28 Jun 2010 20:21:59 +0000 (22:21 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 28 Jun 2010 20:21:59 +0000 (22:21 +0200)
Fixes bug 623049.

codegen/valaccodemethodcallmodule.vala
codegen/valagerrormodule.vala
tests/Makefile.am
tests/errors/bug623049.vala [new file with mode: 0644]
vala/valamethodcall.vala

index 5defe46ee8d4ce8c94c16ebbffdee7f89c4210b7..e6218fa8a9fd4c4ab8b49400b0e12e3c1b56cb8f 100644 (file)
@@ -636,9 +636,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        }
                }
 
-               if (m is CreationMethod && m.get_error_types ().size > 0) {
-                       out_arg_map.set (get_param_pos (-1), new CCodeIdentifier ("error"));
-               } else if (expr.tree_can_fail) {
+               if (expr.tree_can_fail) {
                        // method can fail
                        current_method_inner_error = true;
                        // add &inner_error before the ellipsis arguments
index 36c63ec1c958b46afd69e14be6c1b88737010960..b86cfa6765f7e211252e6ed204cf6671d2b1046d 100644 (file)
@@ -117,8 +117,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
 
                if (current_method is CreationMethod) {
                        var cl = current_method.parent_symbol as Class;
-                       var unref_call = new CCodeFunctionCall (new CCodeIdentifier (cl.get_unref_function ()));
-                       unref_call.add_argument (new CCodeIdentifier ("self"));
+                       var unref_call = get_unref_expression (new CCodeIdentifier ("self"), new ObjectType (cl), null);
                        cerror_block.add_statement (new CCodeExpressionStatement (unref_call));
                        cerror_block.add_statement (new CCodeReturnStatement (new CCodeConstant ("NULL")));
                } else if (current_method != null && current_method.coroutine) {
index 236e316ba79c68e33bd9d1d5f85468b1418bd0af..dcaf3f029b4c8ffd7d8679d1ec03b672be30f432 100644 (file)
@@ -71,6 +71,7 @@ TESTS = \
        errors/bug567181.vala \
        errors/bug579101.vala \
        errors/bug596228.vala \
+       errors/bug623049.vala \
        asynchronous/bug595735.vala \
        asynchronous/bug595755.vala \
        asynchronous/bug596177.vala \
diff --git a/tests/errors/bug623049.vala b/tests/errors/bug623049.vala
new file mode 100644 (file)
index 0000000..913f6cd
--- /dev/null
@@ -0,0 +1,25 @@
+public errordomain Foo {
+       BAR
+}
+
+class ClsA : Object {
+       public ClsA () throws Error {
+               throw new Foo.BAR ("Test");
+       }
+}
+
+class ClsB: ClsA {
+       public ClsB () throws Error {
+               base ();
+
+               assert_not_reached ();
+       }
+}
+
+void main () {
+       try {
+               new ClsB ();
+       } catch (Error e) {
+               debug ("Propagated error");
+       }
+}
index a148699860888f381182b70ea42d19725f505105..79b7ecf1320eecfd39d58f95639e22c44bb11108 100644 (file)
@@ -615,6 +615,19 @@ public class Vala.MethodCall : Expression {
                                        value_type = formal_value_type.get_actual_type (target_object_type, call as MemberAccess, this);
                                }
                        }
+               } else if (mtype is ObjectType) {
+                       // constructor
+                       var cl = (Class) ((ObjectType) mtype).type_symbol;
+                       var m = cl.default_construction_method;
+                       foreach (DataType error_type in m.get_error_types ()) {
+                               may_throw = true;
+
+                               // ensure we can trace back which expression may throw errors of this type
+                               var call_error_type = error_type.copy ();
+                               call_error_type.source_reference = source_reference;
+
+                               add_error_type (call_error_type);
+                       }
                } else if (mtype is DelegateType) {
                        var d = ((DelegateType) mtype).delegate_symbol;
                        foreach (DataType error_type in d.get_error_types ()) {