]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
D-Bus: Fix methods returning GLib.Value in dynamic clients
authorMichal Hruby <michal.mhr@gmail.com>
Sun, 21 Mar 2010 15:22:15 +0000 (16:22 +0100)
committerJürg Billeter <j@bitron.ch>
Sun, 21 Mar 2010 15:22:15 +0000 (16:22 +0100)
codegen/valadbusclientmodule.vala

index 990f8e3238c55c5724dd13602962df14a22fc65b..f3c97c3e3dffffaf280e40c49d5ef96cf9525e4a 100644 (file)
@@ -416,37 +416,44 @@ internal class Vala.DBusClientModule : DBusModule {
                                // structs are returned via out parameter
                                var st = (Struct) method.return_type.data_type;
 
-                               var cdecl = new CCodeDeclaration ("GValueArray*");
-                               cdecl.add_declarator (new CCodeVariableDeclarator ("dbus_result"));
-                               block.add_statement (cdecl);
+                               if (st.get_full_name () == "GLib.Value") {
+                                       ccall.add_argument (new CCodeIdentifier ("result"));
+                                       ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
 
-                               int i = 0;
-                               foreach (Field f in st.get_fields ()) {
-                                       if (f.binding != MemberBinding.INSTANCE) {
-                                               continue;
-                                       }
+                                       block.add_statement (new CCodeExpressionStatement (ccall));
+                               } else {
+                                       var cdecl = new CCodeDeclaration ("GValueArray*");
+                                       cdecl.add_declarator (new CCodeVariableDeclarator ("dbus_result"));
+                                       block.add_statement (cdecl);
 
-                                       var cget_call = new CCodeFunctionCall (new CCodeIdentifier (f.field_type.data_type.get_get_value_function ()));
-                                       cget_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeElementAccess (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_result"), "values"), new CCodeConstant (i.to_string ()))));
+                                       int i = 0;
+                                       foreach (Field f in st.get_fields ()) {
+                                               if (f.binding != MemberBinding.INSTANCE) {
+                                                       continue;
+                                               }
 
-                                       var converted_value = cget_call;
+                                               var cget_call = new CCodeFunctionCall (new CCodeIdentifier (f.field_type.data_type.get_get_value_function ()));
+                                               cget_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeElementAccess (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_result"), "values"), new CCodeConstant (i.to_string ()))));
 
-                                       if (requires_copy (f.field_type)) {
-                                               var dupexpr = get_dup_func_expression (f.field_type, expr.source_reference);
-                                               converted_value = new CCodeFunctionCall (dupexpr);
-                                               converted_value.add_argument (cget_call);
-                                       }
+                                               var converted_value = cget_call;
 
-                                       var assign = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("result"), f.name), converted_value);
-                                       out_marshalling_fragment.append (new CCodeExpressionStatement (assign));
+                                               if (requires_copy (f.field_type)) {
+                                                       var dupexpr = get_dup_func_expression (f.field_type, expr.source_reference);
+                                                       converted_value = new CCodeFunctionCall (dupexpr);
+                                                       converted_value.add_argument (cget_call);
+                                               }
 
-                                       i++;
-                               }
+                                               var assign = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("result"), f.name), converted_value);
+                                               out_marshalling_fragment.append (new CCodeExpressionStatement (assign));
 
-                               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("dbus_result")));
-                               ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+                                               i++;
+                                       }
 
-                               block.add_statement (new CCodeExpressionStatement (ccall));
+                                       ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("dbus_result")));
+                                       ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
+
+                                       block.add_statement (new CCodeExpressionStatement (ccall));
+                               }
 
                                // don't access result when error occured
                                var creturnblock = new CCodeBlock ();