]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add support for structs in D-Bus service and client methods, fixes bug
authorJürg Billeter <j@bitron.ch>
Sat, 31 May 2008 18:49:17 +0000 (18:49 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sat, 31 May 2008 18:49:17 +0000 (18:49 +0000)
2008-05-31  Jürg Billeter  <j@bitron.ch>

* vala/valastruct.vala:
* gobject/valaccodedynamicmethodbinding.vala:
* gobject/valaccodegeneratorsignal.vala:
* gobject/valaccodeobjecttypesymbolbinding.vala:

Add support for structs in D-Bus service and client methods,
fixes bug 534548 and bug 534549

svn path=/trunk/; revision=1520

ChangeLog
gobject/valaccodedynamicmethodbinding.vala
gobject/valaccodegeneratorsignal.vala
gobject/valaccodeobjecttypesymbolbinding.vala
vala/valastruct.vala

index f666df53c0e622f9809c385b52f1a9408f6f710b..23203f078cbd89cd99fa6218afe17f6901ac0d80 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-05-31  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valastruct.vala:
+       * gobject/valaccodedynamicmethodbinding.vala:
+       * gobject/valaccodegeneratorsignal.vala:
+       * gobject/valaccodeobjecttypesymbolbinding.vala:
+
+       Add support for structs in D-Bus service and client methods,
+       fixes bug 534548 and bug 534549
+
 2008-05-31  Jürg Billeter  <j@bitron.ch>
 
        * vapi/packages/gstreamer-0.10/:
index 5648e3043da23d04beeaa271663a863ecf45feeb..0417d26329f0b9a2fd4ada8638a7abd2a9c5f76b 100644 (file)
@@ -184,12 +184,119 @@ public class Vala.CCodeDynamicMethodBinding : CCodeMethodBinding {
                                break;
                        }
 
-                       ccall.add_argument (new CCodeIdentifier (param.parameter_type.data_type.get_type_id ()));
-                       ccall.add_argument (new CCodeIdentifier (param.name));
+                       if (param.direction != ParameterDirection.IN) {
+                               continue;
+                       }
+
+                       if (param.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               // struct parameter
+                               var st = (Struct) param.parameter_type.data_type;
+
+                               var array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_value_array_new"));
+                               array_construct.add_argument (new CCodeConstant ("0"));
+
+                               var cdecl = new CCodeDeclaration ("GValueArray*");
+                               cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("dbus_%s".printf (param.name), array_construct));
+                               block.add_statement (cdecl);
+
+                               var type_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_type_get_struct"));
+                               type_call.add_argument (new CCodeConstant ("\"GValueArray\""));
+
+                               foreach (Field f in st.get_fields ()) {
+                                       if (f.binding != MemberBinding.INSTANCE) {
+                                               continue;
+                                       }
+
+                                       string val_name = "val_%s_%s".printf (param.name, f.name);
+
+                                       // 0-initialize struct with struct initializer { 0 }
+                                       var cvalinit = new CCodeInitializerList ();
+                                       cvalinit.append (new CCodeConstant ("0"));
+
+                                       var cval_decl = new CCodeDeclaration ("GValue");
+                                       cval_decl.add_declarator (new CCodeVariableDeclarator.with_initializer (val_name, cvalinit));
+                                       block.add_statement (cval_decl);
+
+                                       var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (val_name));
+
+                                       var cinit_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init"));
+                                       cinit_call.add_argument (val_ptr);
+                                       cinit_call.add_argument (new CCodeIdentifier (f.field_type.data_type.get_type_id ()));
+                                       block.add_statement (new CCodeExpressionStatement (cinit_call));
+
+                                       var cset_call = new CCodeFunctionCall (new CCodeIdentifier (f.field_type.data_type.get_set_value_function ()));
+                                       cset_call.add_argument (val_ptr);
+                                       cset_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier (param.name), f.name));
+                                       block.add_statement (new CCodeExpressionStatement (cset_call));
+
+                                       var cappend_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_array_append"));
+                                       cappend_call.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
+                                       cappend_call.add_argument (val_ptr);
+                                       block.add_statement (new CCodeExpressionStatement (cappend_call));
+
+                                       type_call.add_argument (new CCodeIdentifier (f.field_type.data_type.get_type_id ()));
+                               }
+
+                               type_call.add_argument (new CCodeConstant ("G_TYPE_INVALID"));
+
+                               ccall.add_argument (type_call);
+                               ccall.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
+                       } else {
+                               ccall.add_argument (new CCodeIdentifier (param.parameter_type.data_type.get_type_id ()));
+                               ccall.add_argument (new CCodeIdentifier (param.name));
+                       }
                }
 
                ccall.add_argument (new CCodeIdentifier ("G_TYPE_INVALID"));
 
+               var out_marshalling_fragment = new CCodeFragment ();
+
+               foreach (FormalParameter param in method.get_parameters ()) {
+                       if (param.parameter_type is MethodType) {
+                               // callback parameter
+                               break;
+                       }
+
+                       if (param.direction != ParameterDirection.OUT) {
+                               continue;
+                       }
+
+                       if (param.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               // struct output parameter
+                               var st = (Struct) param.parameter_type.data_type;
+
+                               var cdecl = new CCodeDeclaration ("GValueArray*");
+                               cdecl.add_declarator (new CCodeVariableDeclarator ("dbus_%s".printf (param.name)));
+                               block.add_statement (cdecl);
+
+                               var type_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_type_get_struct"));
+                               type_call.add_argument (new CCodeConstant ("\"GValueArray\""));
+
+                               int i = 0;
+                               foreach (Field f in st.get_fields ()) {
+                                       if (f.binding != MemberBinding.INSTANCE) {
+                                               continue;
+                                       }
+
+                                       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_%s".printf (param.name)), "values"), new CCodeConstant (i.to_string ()))));
+                                       var assign = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier (param.name), f.name), cget_call);
+                                       out_marshalling_fragment.append (new CCodeExpressionStatement (assign));
+
+                                       type_call.add_argument (new CCodeIdentifier (f.field_type.data_type.get_type_id ()));
+                                       i++;
+                               }
+
+                               type_call.add_argument (new CCodeConstant ("G_TYPE_INVALID"));
+
+                               ccall.add_argument (type_call);
+                               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("dbus_%s".printf (param.name))));
+                       } else {
+                               ccall.add_argument (new CCodeIdentifier (param.parameter_type.data_type.get_type_id ()));
+                               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (param.name)));
+                       }
+               }
+
                if (!(method.return_type is VoidType)) {
                        // synchronous D-Bus method call with reply
                        var array_type = method.return_type as ArrayType;
@@ -207,6 +314,8 @@ public class Vala.CCodeDynamicMethodBinding : CCodeMethodBinding {
 
                                block.add_statement (new CCodeExpressionStatement (ccall));
 
+                               block.add_statement (out_marshalling_fragment);
+
                                // *result_length1 = result->len;
                                var garray_length = new CCodeMemberAccess.pointer (new CCodeIdentifier ("result"), "len");
                                var result_length = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("result_length1"));
@@ -235,6 +344,8 @@ public class Vala.CCodeDynamicMethodBinding : CCodeMethodBinding {
 
                                block.add_statement (new CCodeExpressionStatement (ccall));
 
+                               block.add_statement (out_marshalling_fragment);
+
                                if (array_type != null) {
                                        // special case string array
 
@@ -250,6 +361,8 @@ public class Vala.CCodeDynamicMethodBinding : CCodeMethodBinding {
                        }
                } else {
                        block.add_statement (new CCodeExpressionStatement (ccall));
+
+                       block.add_statement (out_marshalling_fragment);
                }
        }
 
index 8cab80753eb37a2f3ee590b405d7e043db7bfa00..f4ba0338fd2b501078e452da441de7bb3a3ae5af 100644 (file)
@@ -24,7 +24,7 @@
 using GLib;
 
 public class Vala.CCodeGenerator {
-       private string get_marshaller_type_name (DataType t) {
+       private string get_marshaller_type_name (DataType t, bool dbus = false) {
                if (t is PointerType || t.type_parameter != null) {
                        return ("POINTER");
                } else if (t is ErrorType) {
@@ -37,20 +37,22 @@ public class Vala.CCodeGenerator {
                        }
                } else if (t is VoidType) {
                        return ("VOID");
+               } else if (dbus && t.get_type_signature ().has_prefix ("(")) {
+                       return ("BOXED");
                } else {
                        return t.data_type.get_marshaller_type_name ();
                }
        }
        
-       private string get_marshaller_type_name_for_parameter (FormalParameter param) {
+       private string get_marshaller_type_name_for_parameter (FormalParameter param, bool dbus = false) {
                if (param.direction != ParameterDirection.IN) {
                        return ("POINTER");
                } else {
-                       return get_marshaller_type_name (param.parameter_type);
+                       return get_marshaller_type_name (param.parameter_type, dbus);
                }
        }
        
-       public string get_marshaller_function (Gee.List<FormalParameter> params, DataType return_type, string? prefix = null) {
+       public string get_marshaller_function (Gee.List<FormalParameter> params, DataType return_type, string? prefix = null, bool dbus = false) {
                var signature = get_marshaller_signature (params, return_type);
                string ret;
 
@@ -62,13 +64,13 @@ public class Vala.CCodeGenerator {
                        }
                }
                
-               ret = "%s_%s_".printf (prefix, get_marshaller_type_name (return_type));
+               ret = "%s_%s_".printf (prefix, get_marshaller_type_name (return_type, dbus));
                
                if (params == null || params.size == 0) {
                        ret = ret + "_VOID";
                } else {
                        foreach (FormalParameter p in params) {
-                               ret = "%s_%s".printf (ret, get_marshaller_type_name_for_parameter (p));
+                               ret = "%s_%s".printf (ret, get_marshaller_type_name_for_parameter (p, dbus));
                        }
                }
                
@@ -110,20 +112,20 @@ public class Vala.CCodeGenerator {
                }
        }
        
-       private string get_marshaller_signature (Gee.List<FormalParameter> params, DataType return_type) {
+       private string get_marshaller_signature (Gee.List<FormalParameter> params, DataType return_type, bool dbus = false) {
                string signature;
                
-               signature = "%s:".printf (get_marshaller_type_name (return_type));
+               signature = "%s:".printf (get_marshaller_type_name (return_type, dbus));
                if (params == null || params.size == 0) {
                        signature = signature + "VOID";
                } else {
                        bool first = true;
                        foreach (FormalParameter p in params) {
                                if (first) {
-                                       signature = signature + get_marshaller_type_name_for_parameter (p);
+                                       signature = signature + get_marshaller_type_name_for_parameter (p, dbus);
                                        first = false;
                                } else {
-                                       signature = "%s,%s".printf (signature, get_marshaller_type_name_for_parameter (p));
+                                       signature = "%s,%s".printf (signature, get_marshaller_type_name_for_parameter (p, dbus));
                                }
                        }
                }
@@ -147,7 +149,7 @@ public class Vala.CCodeGenerator {
                generate_marshaller (sig.get_parameters (), sig.return_type);
        }
 
-       public void generate_marshaller (Gee.List<FormalParameter> params, DataType return_type) {
+       public void generate_marshaller (Gee.List<FormalParameter> params, DataType return_type, bool dbus = false) {
                string signature;
                int n_params, i;
                
@@ -157,7 +159,7 @@ public class Vala.CCodeGenerator {
                        return;
                }
                
-               var signal_marshaller = new CCodeFunction (get_marshaller_function (params, return_type), "void");
+               var signal_marshaller = new CCodeFunction (get_marshaller_function (params, return_type, null, dbus), "void");
                signal_marshaller.modifiers = CCodeModifiers.STATIC;
                
                signal_marshaller.add_parameter (new CCodeFormalParameter ("closure", "GClosure *"));
@@ -171,7 +173,7 @@ public class Vala.CCodeGenerator {
                
                var marshaller_body = new CCodeBlock ();
                
-               var callback_decl = new CCodeFunctionDeclarator (get_marshaller_function (params, return_type, "GMarshalFunc"));
+               var callback_decl = new CCodeFunctionDeclarator (get_marshaller_function (params, return_type, "GMarshalFunc", dbus));
                callback_decl.add_parameter (new CCodeFormalParameter ("data1", "gpointer"));
                n_params = 1;
                foreach (FormalParameter p in params) {
@@ -181,7 +183,7 @@ public class Vala.CCodeGenerator {
                callback_decl.add_parameter (new CCodeFormalParameter ("data2", "gpointer"));
                marshaller_body.add_statement (new CCodeTypeDefinition (get_value_type_name_from_type_reference (return_type), callback_decl));
                
-               var var_decl = new CCodeDeclaration (get_marshaller_function (params, return_type, "GMarshalFunc"));
+               var var_decl = new CCodeDeclaration (get_marshaller_function (params, return_type, "GMarshalFunc", dbus));
                var_decl.modifiers = CCodeModifiers.REGISTER;
                var_decl.add_declarator (new CCodeVariableDeclarator ("callback"));
                marshaller_body.add_statement (var_decl);
@@ -225,7 +227,7 @@ public class Vala.CCodeGenerator {
                false_block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("data2"), data)));
                marshaller_body.add_statement (new CCodeIfStatement (cond, true_block, false_block));
                
-               var c_assign = new CCodeAssignment (new CCodeIdentifier ("callback"), new CCodeCastExpression (new CCodeConditionalExpression (new CCodeIdentifier ("marshal_data"), new CCodeIdentifier ("marshal_data"), new CCodeMemberAccess (new CCodeIdentifier ("cc"), "callback", true)), get_marshaller_function (params, return_type, "GMarshalFunc")));
+               var c_assign = new CCodeAssignment (new CCodeIdentifier ("callback"), new CCodeCastExpression (new CCodeConditionalExpression (new CCodeIdentifier ("marshal_data"), new CCodeIdentifier ("marshal_data"), new CCodeMemberAccess (new CCodeIdentifier ("cc"), "callback", true)), get_marshaller_function (params, return_type, "GMarshalFunc", dbus)));
                marshaller_body.add_statement (new CCodeExpressionStatement (c_assign));
                
                fc = new CCodeFunctionCall (new CCodeIdentifier ("callback"));
@@ -237,6 +239,8 @@ public class Vala.CCodeGenerator {
                                get_value_function = "g_value_get_pointer";
                        } else if (p.parameter_type is ErrorType) {
                                get_value_function = "g_value_get_pointer";
+                       } else if (dbus && p.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               get_value_function = "g_value_get_boxed";
                        } else {
                                get_value_function = p.parameter_type.data_type.get_get_value_function ();
                        }
@@ -265,6 +269,8 @@ public class Vala.CCodeGenerator {
                                set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_string"));
                        } else if (return_type.data_type is Class || return_type.data_type is Interface) {
                                set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_object"));
+                       } else if (dbus && return_type.get_type_signature ().has_prefix ("(")) {
+                               set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_boxed"));
                        } else {
                                set_fc = new CCodeFunctionCall (new CCodeIdentifier (return_type.data_type.get_set_value_function ()));
                        }
index 2e55247dfb78827bd37a934a332e49ddc341393d..b99054639cbeda819913a7c3f9e4d42499bc41cf 100644 (file)
@@ -79,12 +79,12 @@ public abstract class Vala.CCodeObjectTypeSymbolBinding : Vala.CCodeTypeSymbolBi
                        dbus_methods.append ("{ (GCallback) ");
                        dbus_methods.append (generate_dbus_wrapper (m, bindable));
                        dbus_methods.append (", ");
-                       dbus_methods.append (codegen.get_marshaller_function (parameters, codegen.bool_type));
+                       dbus_methods.append (codegen.get_marshaller_function (parameters, codegen.bool_type, null, true));
                        dbus_methods.append (", ");
                        dbus_methods.append (blob_len.to_string ());
                        dbus_methods.append (" },\n");
 
-                       codegen.generate_marshaller (parameters, codegen.bool_type);
+                       codegen.generate_marshaller (parameters, codegen.bool_type, true);
 
                        long start = blob.len;
 
@@ -219,23 +219,66 @@ public abstract class Vala.CCodeObjectTypeSymbolBinding : Vala.CCodeTypeSymbolBi
                function.add_parameter (new CCodeFormalParameter ("self", bindable.get_cname () + "*"));
 
                foreach (FormalParameter param in m.get_parameters ()) {
-                       function.add_parameter ((CCodeFormalParameter) param.ccodenode);
+                       if (param.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               if (param.direction == ParameterDirection.IN) {
+                                       function.add_parameter (new CCodeFormalParameter ("dbus_%s".printf (param.name), "GValueArray*"));
+                               } else {
+                                       function.add_parameter (new CCodeFormalParameter ("dbus_%s".printf (param.name), "GValueArray**"));
+                               }
+                       } else {
+                               function.add_parameter ((CCodeFormalParameter) param.ccodenode);
+                       }
                }
 
                if (!(m.return_type is VoidType)) {
-                       function.add_parameter (new CCodeFormalParameter ("result", m.return_type.get_cname () + "*"));
+                       if (m.return_type.get_type_signature ().has_prefix ("(")) {
+                               function.add_parameter (new CCodeFormalParameter ("result", "GValueArray**"));
+                       } else {
+                               function.add_parameter (new CCodeFormalParameter ("result", m.return_type.get_cname () + "*"));
+                       }
                }
 
                function.add_parameter (new CCodeFormalParameter ("error", "GError**"));
 
                // definition
 
+               var block = new CCodeBlock ();
+
+               foreach (FormalParameter param in m.get_parameters ()) {
+                       if (param.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               var st = (Struct) param.parameter_type.data_type;
+
+                               var cdecl = new CCodeDeclaration (st.get_cname ());
+                               cdecl.add_declarator (new CCodeVariableDeclarator (param.name));
+                               block.add_statement (cdecl);
+
+                               if (param.direction == ParameterDirection.IN) {
+                                       // struct input parameter
+                                       int i = 0;
+                                       foreach (Field f in st.get_fields ()) {
+                                               if (f.binding == MemberBinding.INSTANCE) {
+                                                       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_%s".printf (param.name)), "values"), new CCodeConstant (i.to_string ()))));
+                                                       var assign = new CCodeAssignment (new CCodeMemberAccess (new CCodeIdentifier (param.name), f.name), cget_call);
+                                                       block.add_statement (new CCodeExpressionStatement (assign));
+                                                       i++;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
                var ccall = new CCodeFunctionCall (new CCodeIdentifier (m.get_cname ()));
 
                ccall.add_argument (new CCodeIdentifier ("self"));
 
                foreach (FormalParameter param in m.get_parameters ()) {
-                       ccall.add_argument (new CCodeIdentifier (param.name));
+                       if (param.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               // struct input or output parameters
+                               ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (param.name)));
+                       } else {
+                               ccall.add_argument (new CCodeIdentifier (param.name));
+                       }
                }
 
                if (m.get_error_types ().size > 0) {
@@ -249,8 +292,61 @@ public abstract class Vala.CCodeObjectTypeSymbolBinding : Vala.CCodeTypeSymbolBi
                        expr = new CCodeAssignment (new CCodeIdentifier ("*result"), ccall);
                }
 
-               var block = new CCodeBlock ();
                block.add_statement (new CCodeExpressionStatement (expr));
+
+               foreach (FormalParameter param in m.get_parameters ()) {
+                       if (param.direction == ParameterDirection.OUT
+                           && param.parameter_type.get_type_signature ().has_prefix ("(")) {
+                               // struct output parameter
+                               var st = (Struct) param.parameter_type.data_type;
+
+                               var array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_value_array_new"));
+                               array_construct.add_argument (new CCodeConstant ("0"));
+
+                               var dbus_param = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("dbus_%s".printf (param.name)));
+
+                               block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (dbus_param, array_construct)));
+
+                               var type_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_type_get_struct"));
+                               type_call.add_argument (new CCodeConstant ("\"GValueArray\""));
+
+                               foreach (Field f in st.get_fields ()) {
+                                       if (f.binding != MemberBinding.INSTANCE) {
+                                               continue;
+                                       }
+
+                                       string val_name = "val_%s_%s".printf (param.name, f.name);
+
+                                       // 0-initialize struct with struct initializer { 0 }
+                                       var cvalinit = new CCodeInitializerList ();
+                                       cvalinit.append (new CCodeConstant ("0"));
+
+                                       var cval_decl = new CCodeDeclaration ("GValue");
+                                       cval_decl.add_declarator (new CCodeVariableDeclarator.with_initializer (val_name, cvalinit));
+                                       block.add_statement (cval_decl);
+
+                                       var val_ptr = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (val_name));
+
+                                       var cinit_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init"));
+                                       cinit_call.add_argument (val_ptr);
+                                       cinit_call.add_argument (new CCodeIdentifier (f.field_type.data_type.get_type_id ()));
+                                       block.add_statement (new CCodeExpressionStatement (cinit_call));
+
+                                       var cset_call = new CCodeFunctionCall (new CCodeIdentifier (f.field_type.data_type.get_set_value_function ()));
+                                       cset_call.add_argument (val_ptr);
+                                       cset_call.add_argument (new CCodeMemberAccess (new CCodeIdentifier (param.name), f.name));
+                                       block.add_statement (new CCodeExpressionStatement (cset_call));
+
+                                       var cappend_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_array_append"));
+                                       cappend_call.add_argument (dbus_param);
+                                       cappend_call.add_argument (val_ptr);
+                                       block.add_statement (new CCodeExpressionStatement (cappend_call));
+
+                                       type_call.add_argument (new CCodeIdentifier (f.field_type.data_type.get_type_id ()));
+                               }
+                       }
+               }
+
                var no_error = new CCodeBinaryExpression (CCodeBinaryOperator.OR, new CCodeIdentifier ("!error"), new CCodeIdentifier ("!*error"));
                block.add_statement (new CCodeReturnStatement (no_error));
 
index 389aa82dda2a0238339240b12b4a28d9d5da10c8..ee0f39c310420753f24efa0d3805865c001e800e 100644 (file)
@@ -243,6 +243,17 @@ public class Vala.Struct : TypeSymbol {
        }
 
        public override string? get_type_signature () {
+               if (type_signature == null) {
+                       var str = new StringBuilder ();
+                       str.append_c ('(');
+                       foreach (Field f in fields) {
+                               if (f.binding == MemberBinding.INSTANCE) {
+                                       str.append (f.field_type.get_type_signature ());
+                               }
+                       }
+                       str.append_c (')');
+                       return str.str;
+               }
                return type_signature;
        }