]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GAsync: Implement the finish function
authorDidier 'Ptitjes <ptitjes@free.fr>
Sun, 31 May 2009 02:37:33 +0000 (04:37 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 4 Jul 2009 19:18:07 +0000 (20:18 +0100)
The finish function returns the values stored in the closure as out
parameters and method return value.

Signed-off-by: Didier 'Ptitjes <ptitjes@free.fr>
codegen/valagasyncmodule.vala

index f2ab75d3426fb839d9949b7a741cc6885436b6bf..438cbab2609f17f22a40cca7ca67c320474cb03f 100644 (file)
@@ -220,12 +220,47 @@ internal class Vala.GAsyncModule : GSignalModule {
 
 
        CCodeFunction generate_finish_function (Method m) {
+               string dataname = Symbol.lower_case_to_camel_case (m.get_cname ()) + "Data";
+
                var finishfunc = new CCodeFunction (m.get_real_cname () + "_finish");
 
                var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
 
                var finishblock = new CCodeBlock ();
 
+               var return_type = m.return_type;
+               if (!(return_type is VoidType)) {
+                       var cdecl = new CCodeDeclaration (m.return_type.get_cname ());
+                       cdecl.add_declarator (new CCodeVariableDeclarator ("result"));
+                       finishblock.add_statement (cdecl);
+               }
+
+               var datadecl = new CCodeDeclaration (dataname + "*");
+               datadecl.add_declarator (new CCodeVariableDeclarator ("data"));
+               finishblock.add_statement (datadecl);
+
+               var simple_async_result_cast = new CCodeFunctionCall (new CCodeIdentifier ("G_SIMPLE_ASYNC_RESULT"));
+               simple_async_result_cast.add_argument (new CCodeIdentifier ("res"));
+
+               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 (new CCodeIdentifier ("data"), ccall)));
+
+               foreach (FormalParameter param in m.get_parameters ()) {
+                       if (param.direction != ParameterDirection.IN) {
+                               finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (param.name)), new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (param.name)))));
+                               finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (param.name)), new CCodeConstant ("NULL"))));
+                       }
+               }
+
+               if (!(return_type is VoidType)) {
+                       finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("result"), new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "result"))));
+                       if (!(return_type is ValueType) || return_type.nullable) {
+                               finishblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "result"), new CCodeConstant ("NULL"))));
+                       }
+                       finishblock.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("result")));
+               }
+
                cparam_map.set (get_param_pos (0.1), new CCodeFormalParameter ("res", "GAsyncResult*"));
 
                generate_cparameters (m, source_declarations, cparam_map, finishfunc, null, null, null, 2);