From: Jürg Billeter Date: Mon, 15 Dec 2008 08:59:06 +0000 (+0000) Subject: Fix handling of array fields in structs, fixes bug 562665 X-Git-Tag: VALA_0_5_3~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=22b2e72e7f43fc9c23a0d9c9a15f83a979889dec;p=thirdparty%2Fvala.git Fix handling of array fields in structs, fixes bug 562665 2008-12-15 Jürg Billeter * gobject/valaccodestructmodule.vala: Fix handling of array fields in structs, fixes bug 562665 svn path=/trunk/; revision=2154 --- diff --git a/ChangeLog b/ChangeLog index c787ff382..1e3730411 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-12-15 Jürg Billeter + + * gobject/valaccodestructmodule.vala: + + Fix handling of array fields in structs, fixes bug 562665 + 2008-12-15 Jürg Billeter * gobject/valaccodebasemodule.vala: diff --git a/gobject/valaccodestructmodule.vala b/gobject/valaccodestructmodule.vala index bb57a3c54..c9cdad94c 100644 --- a/gobject/valaccodestructmodule.vala +++ b/gobject/valaccodestructmodule.vala @@ -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))); + } } }