From: Jürg Billeter Date: Fri, 28 Nov 2008 19:17:19 +0000 (+0000) Subject: Fix copying and destroying GValue values X-Git-Tag: VALA_0_5_2~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b188240d14ab85bf8486cd7965eae4032c354f6;p=thirdparty%2Fvala.git Fix copying and destroying GValue values 2008-11-28 Jürg Billeter * gobject/valaccodebasemodule.vala: Fix copying and destroying GValue values svn path=/trunk/; revision=2075 --- diff --git a/ChangeLog b/ChangeLog index d9f9020d5..e3d114242 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-11-28 Jürg Billeter + + * gobject/valaccodebasemodule.vala: + + Fix copying and destroying GValue values + 2008-11-28 Jürg Billeter * vapi/glib-2.0.vapi: diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala index 2d7fc1ac7..107d32123 100644 --- a/gobject/valaccodebasemodule.vala +++ b/gobject/valaccodebasemodule.vala @@ -111,6 +111,7 @@ public class Vala.CCodeBaseModule : CCodeModule { public TypeSymbol gstringbuilder_type; public TypeSymbol garray_type; public DataType gquark_type; + public Struct gvalue_type; public Struct mutex_type; public TypeSymbol type_module_type; public Interface list_type; @@ -533,6 +534,7 @@ public class Vala.CCodeBaseModule : CCodeModule { garray_type = (TypeSymbol) glib_ns.scope.lookup ("Array"); gquark_type = new ValueType ((TypeSymbol) glib_ns.scope.lookup ("Quark")); + gvalue_type = (Struct) glib_ns.scope.lookup ("Value"); mutex_type = (Struct) glib_ns.scope.lookup ("StaticRecMutex"); type_module_type = (TypeSymbol) glib_ns.scope.lookup ("TypeModule"); @@ -1629,7 +1631,20 @@ public class Vala.CCodeBaseModule : CCodeModule { if (type is ValueType && !type.nullable) { // normal value type, no null check ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cvar)); - return ccall; + + if (type.data_type == gvalue_type) { + // g_value_unset must not be called for already unset values + var cisvalid = new CCodeFunctionCall (new CCodeIdentifier ("G_IS_VALUE")); + cisvalid.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cvar)); + + var ccomma = new CCodeCommaExpression (); + ccomma.append_expression (ccall); + ccomma.append_expression (new CCodeConstant ("NULL")); + + return new CCodeConditionalExpression (cisvalid, ccomma, new CCodeConstant ("NULL")); + } else { + return ccall; + } } /* (foo == NULL ? NULL : foo = (unref (foo), NULL)) */ @@ -2249,6 +2264,20 @@ public class Vala.CCodeBaseModule : CCodeModule { copy_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp)); var ccomma = new CCodeCommaExpression (); + + if (st.get_copy_function () == "g_value_copy") { + // GValue requires g_value_init in addition to g_value_copy + + var value_type_call = new CCodeFunctionCall (new CCodeIdentifier ("G_VALUE_TYPE")); + value_type_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cexpr)); + + var init_call = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init")); + init_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp)); + init_call.add_argument (value_type_call); + + ccomma.append_expression (init_call); + } + ccomma.append_expression (copy_call); ccomma.append_expression (ctemp);