]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Use copy function in generated dup function for structs if necessary
authorJürg Billeter <j@bitron.ch>
Mon, 22 Dec 2008 21:29:49 +0000 (21:29 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Mon, 22 Dec 2008 21:29:49 +0000 (21:29 +0000)
2008-12-22  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodebasemodule.vala:

Use copy function in generated dup function for structs if
necessary

svn path=/trunk/; revision=2239

ChangeLog
gobject/valaccodebasemodule.vala

index 876411b13980522a9b05cd921dc4950c31658ce7..6137f8c00fbf5e9ccfa19d00dbe3417af4c6977f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-12-22  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodebasemodule.vala:
+
+       Use copy function in generated dup function for structs if
+       necessary
+
 2008-12-22  Jürg Billeter  <j@bitron.ch>
 
        * vala/valastruct.vala:
index eb14d64512712d8e29faca190e2562f3f22840ea..8eb024216b9f716fe86338665a89691cf242ed7b 100644 (file)
@@ -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