vala r2239 - in trunk: . gobject



Author: juergbi
Date: Mon Dec 22 21:29:49 2008
New Revision: 2239
URL: http://svn.gnome.org/viewvc/vala?rev=2239&view=rev

Log:
2008-12-22  JÃrg Billeter  <j bitron ch>

	* gobject/valaccodebasemodule.vala:

	Use copy function in generated dup function for structs if
	necessary


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodebasemodule.vala

Modified: trunk/gobject/valaccodebasemodule.vala
==============================================================================
--- trunk/gobject/valaccodebasemodule.vala	(original)
+++ trunk/gobject/valaccodebasemodule.vala	Mon Dec 22 21:29:49 2008
@@ -1649,14 +1649,33 @@
 
 			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



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]