]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GAsync: Fix propagating errors from async methods
authorJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 21:27:46 +0000 (23:27 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 21:27:46 +0000 (23:27 +0200)
codegen/valagasyncmodule.vala

index acc68def18408b5316689777075454958659a570..e59ce382a278f452221bc734b19f8addea9de7d5 100644 (file)
@@ -353,6 +353,20 @@ internal class Vala.GAsyncModule : GSignalModule {
                var simple_async_result_cast = new CCodeFunctionCall (new CCodeIdentifier ("G_SIMPLE_ASYNC_RESULT"));
                simple_async_result_cast.add_argument (new CCodeIdentifier ("_res_"));
 
+               if (m.get_error_types ().size > 0) {
+                       // propagate error from async method
+                       var propagate_error = new CCodeFunctionCall (new CCodeIdentifier ("g_simple_async_result_propagate_error"));
+                       propagate_error.add_argument (simple_async_result_cast);
+                       propagate_error.add_argument (new CCodeIdentifier ("error"));
+                       var errorblock = new CCodeBlock ();
+                       if (return_type is VoidType) {
+                               errorblock.add_statement (new CCodeReturnStatement ());
+                       } else {
+                               errorblock.add_statement (new CCodeReturnStatement (default_value_for_type (return_type, false)));
+                       }
+                       finishblock.add_statement (new CCodeIfStatement (propagate_error, errorblock));
+               }
+
                var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_simple_async_result_get_op_res_gpointer"));
                ccall.add_argument (simple_async_result_cast);
                finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (data_var, ccall)));