From: Jürg Billeter Date: Fri, 9 Jan 2009 22:35:51 +0000 (+0000) Subject: Do not free values returned via g_object_get prematurely, require X-Git-Tag: VALA_0_5_5~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b9aff35df3c9d89b71e1a8679eff56c879f19a0;p=thirdparty%2Fvala.git Do not free values returned via g_object_get prematurely, require 2009-01-09 Jürg Billeter * gobject/valaccodememberaccessmodule.vala: Do not free values returned via g_object_get prematurely, require properties without accessor methods to return an owned value, fixes bug 559644 svn path=/trunk/; revision=2313 --- diff --git a/ChangeLog b/ChangeLog index 95bb9106a..e3cdd1a96 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-01-09 Jürg Billeter + + * gobject/valaccodememberaccessmodule.vala: + + Do not free values returned via g_object_get prematurely, require + properties without accessor methods to return an owned value, + fixes bug 559644 + 2009-01-09 Jürg Billeter * vala/valaunaryexpression.vala: diff --git a/gobject/valaccodememberaccessmodule.vala b/gobject/valaccodememberaccessmodule.vala index e0e0119b6..c1737b4b0 100644 --- a/gobject/valaccodememberaccessmodule.vala +++ b/gobject/valaccodememberaccessmodule.vala @@ -202,8 +202,8 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { ccall.add_argument (pub_inst); } - // Property acesses to real struct types are handeled different to other properties. - // They are returned as out parameter. + // Property access to real struct types is handled differently + // The value is returned by out parameter if (base_property.property_type.is_real_struct_type ()) { var ccomma = new CCodeCommaExpression (); var temp_var = get_temp_variable (base_property.property_type); @@ -218,33 +218,21 @@ public class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { } } else { var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_object_get")); - - var ccast = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT")); - ccast.add_argument (pub_inst); - ccall.add_argument (ccast); + ccall.add_argument (pub_inst); // property name is second argument of g_object_get ccall.add_argument (prop.get_canonical_cconstant ()); // g_object_get always returns owned values - var temp_type = expr.value_type.copy (); - temp_type.value_owned = true; + // therefore, property getters of properties + // without accessor methods need to be marked as owned - // we need a temporary variable to save the property value + var ccomma = new CCodeCommaExpression (); var temp_var = get_temp_variable (expr.value_type); - temp_vars.insert (0, temp_var); - - if (requires_destroy (temp_type)) { - temp_ref_vars.insert (0, temp_var); - } - var ctemp = new CCodeIdentifier (temp_var.name); + temp_vars.add (temp_var); ccall.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp)); - - ccall.add_argument (new CCodeConstant ("NULL")); - - var ccomma = new CCodeCommaExpression (); ccomma.append_expression (ccall); ccomma.append_expression (ctemp); expr.ccodenode = ccomma;