vala r1504 - in trunk: . gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1504 - in trunk: . gobject
- Date: Fri, 30 May 2008 23:36:51 +0000 (UTC)
Author: juergbi
Date: Fri May 30 23:36:51 2008
New Revision: 1504
URL: http://svn.gnome.org/viewvc/vala?rev=1504&view=rev
Log:
2008-05-31 JÃrg Billeter <j bitron ch>
* gobject/valaccodegenerator.vala:
Fix copying nullable structs
Modified:
trunk/ChangeLog
trunk/gobject/valaccodegenerator.vala
Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala (original)
+++ trunk/gobject/valaccodegenerator.vala Fri May 30 23:36:51 2008
@@ -1269,7 +1269,11 @@
// allow duplicates of immutable instances as for example strings
dup_function = type.data_type.get_dup_function ();
} else if (type is ValueType) {
- dup_function = "";
+ if (type.nullable) {
+ dup_function = generate_struct_dup_wrapper ((ValueType) type);
+ } else {
+ dup_function = "";
+ }
} else {
// duplicating non-reference counted structs may cause side-effects (and performance issues)
Report.error (source_reference, "duplicating %s instance, use weak variable or explicitly invoke copy method".printf (type.data_type.name));
@@ -1291,6 +1295,45 @@
}
}
+
+ private string generate_struct_dup_wrapper (ValueType value_type) {
+ string dup_func = "_%sdup".printf (value_type.type_symbol.get_lower_case_cprefix ());
+
+ if (!add_wrapper (dup_func)) {
+ // wrapper already defined
+ return dup_func;
+ }
+
+ // declaration
+
+ var function = new CCodeFunction (dup_func, value_type.get_cname ());
+ function.modifiers = CCodeModifiers.STATIC;
+
+ function.add_parameter (new CCodeFormalParameter ("self", value_type.get_cname ()));
+
+ // definition
+
+ var block = new CCodeBlock ();
+
+ var dup_call = new CCodeFunctionCall (new CCodeIdentifier ("g_memdup"));
+ dup_call.add_argument (new CCodeIdentifier ("self"));
+
+ 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);
+
+ block.add_statement (new CCodeReturnStatement (dup_call));
+
+ // append to file
+
+ source_type_member_declaration.append (function.copy ());
+
+ function.block = block;
+ source_type_member_definition.append (function);
+
+ return dup_func;
+ }
+
private CCodeExpression? get_destroy_func_expression (DataType type) {
if (type.data_type == glist_type || type.data_type == gslist_type) {
// create wrapper function to free list elements if necessary
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]