]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix handling of array fields in structs, fixes bug 562665
authorJürg Billeter <j@bitron.ch>
Mon, 15 Dec 2008 08:59:06 +0000 (08:59 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 15 Dec 2008 08:59:06 +0000 (08:59 +0000)
2008-12-15  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodestructmodule.vala:

Fix handling of array fields in structs, fixes bug 562665

svn path=/trunk/; revision=2154

ChangeLog
gobject/valaccodestructmodule.vala

index c787ff38246ffb874c35540fbfaaf70ccea75798..1e37304115eccef76ba3f4821d6c8a0b08b758c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-12-15  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodestructmodule.vala:
+
+       Fix handling of array fields in structs, fixes bug 562665
+
 2008-12-15  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodebasemodule.vala:
index bb57a3c54d2573b63ccddb17b0b76e982eee76e5..c9cdad94cfaaf410ab91d786314079ae9879c9f8 100644 (file)
@@ -172,10 +172,22 @@ public class Vala.CCodeStructModule : CCodeBaseModule {
                        if (f.binding == MemberBinding.INSTANCE) {
                                CCodeExpression copy = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), f.name);
                                if (requires_copy (f.field_type))  {
-                                       copy = get_ref_cexpression (f.field_type, copy, null, f);
+                                       var this_access = new MemberAccess.simple ("this");
+                                       this_access.value_type = get_data_type_for_symbol ((TypeSymbol) f.parent_symbol);
+                                       this_access.ccodenode = new CCodeIdentifier ("(*self)");
+                                       var ma = new MemberAccess (this_access, f.name);
+                                       ma.symbol_reference = f;
+                                       copy = get_ref_cexpression (f.field_type, copy, ma, f);
                                }
                                var dest = new CCodeMemberAccess.pointer (new CCodeIdentifier ("dest"), f.name);
                                cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (dest, copy)));
+
+                               var array_type = f.field_type as ArrayType;
+                               for (int dim = 1; dim <= array_type.rank; dim++) {
+                                       var len_src = new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), get_array_length_cname (f.name, dim));
+                                       var len_dest = new CCodeMemberAccess.pointer (new CCodeIdentifier ("dest"), get_array_length_cname (f.name, dim));
+                                       cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (len_dest, len_src)));
+                               }
                        }
                }