From: Jürg Billeter Date: Mon, 22 Dec 2008 21:29:49 +0000 (+0000) Subject: Use copy function in generated dup function for structs if necessary X-Git-Tag: VALA_0_5_4~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34524eb536ca4f840dafb9038e28b7c7d841cc10;p=thirdparty%2Fvala.git Use copy function in generated dup function for structs if necessary 2008-12-22 Jürg Billeter * gobject/valaccodebasemodule.vala: Use copy function in generated dup function for structs if necessary svn path=/trunk/; revision=2239 --- diff --git a/ChangeLog b/ChangeLog index 876411b13..6137f8c00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-12-22 Jürg Billeter + + * gobject/valaccodebasemodule.vala: + + Use copy function in generated dup function for structs if + necessary + 2008-12-22 Jürg Billeter * vala/valastruct.vala: diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala index eb14d6451..8eb024216 100644 --- a/gobject/valaccodebasemodule.vala +++ b/gobject/valaccodebasemodule.vala @@ -1649,14 +1649,33 @@ public class Vala.CCodeBaseModule : CCodeModule { block.add_statement (new CCodeReturnStatement (dup_call)); } else { - var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("g_memdup")); - dup_call.add_argument (new CCodeIdentifier ("self")); + var cdecl = new CCodeDeclaration (value_type.get_cname ()); + cdecl.add_declarator (new CCodeVariableDeclarator ("dup")); + block.add_statement (cdecl); + + var creation_call = new CCodeFunctionCall (new CCodeIdentifier ("g_new0")); + creation_call.add_argument (new CCodeConstant (value_type.data_type.get_cname ())); + creation_call.add_argument (new CCodeConstant ("1")); + block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("dup"), creation_call))); + + var st = value_type.data_type as Struct; + if (st != null && st.is_disposable ()) { + var copy_call = new CCodeFunctionCall (new CCodeIdentifier (st.get_copy_function ())); + copy_call.add_argument (new CCodeIdentifier ("self")); + copy_call.add_argument (new CCodeIdentifier ("dup")); + block.add_statement (new CCodeExpressionStatement (copy_call)); + } else { + var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof")); + sizeof_call.add_argument (new CCodeConstant (value_type.data_type.get_cname ())); - var sizeof_call = new CCodeFunctionCall (new CCodeIdentifier ("sizeof")); - sizeof_call.add_argument (new CCodeIdentifier (value_type.type_symbol.get_cname ())); - dup_call.add_argument (sizeof_call); + var copy_call = new CCodeFunctionCall (new CCodeIdentifier ("memcpy")); + copy_call.add_argument (new CCodeIdentifier ("dup")); + copy_call.add_argument (new CCodeIdentifier ("self")); + copy_call.add_argument (sizeof_call); + block.add_statement (new CCodeExpressionStatement (copy_call)); + } - block.add_statement (new CCodeReturnStatement (dup_call)); + block.add_statement (new CCodeReturnStatement (new CCodeIdentifier ("dup"))); } // append to file