From: Jürg Billeter Date: Tue, 6 Jan 2009 22:59:20 +0000 (+0000) Subject: Support [CCode (ref_function_void = true)] attribute for bindings, based X-Git-Tag: VALA_0_5_4~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=39aa92baeec56343a4c8c468aa7644054650d076;p=thirdparty%2Fvala.git Support [CCode (ref_function_void = true)] attribute for bindings, based 2009-01-06 Jürg Billeter * vala/valaclass.vala: * gobject/valaccodebasemodule.vala: Support [CCode (ref_function_void = true)] attribute for bindings, based on patch by Andreas Brauchli, fixes bug 566078 svn path=/trunk/; revision=2279 --- diff --git a/ChangeLog b/ChangeLog index 892506c22..da51212c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-01-06 Jürg Billeter + + * vala/valaclass.vala: + * gobject/valaccodebasemodule.vala: + + Support [CCode (ref_function_void = true)] attribute for bindings, + based on patch by Andreas Brauchli, fixes bug 566078 + 2009-01-06 Jürg Billeter * vala/valaarraytype.vala: diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala index 731a193e2..acdf90a25 100644 --- a/gobject/valaccodebasemodule.vala +++ b/gobject/valaccodebasemodule.vala @@ -2460,6 +2460,15 @@ public class Vala.CCodeBaseModule : CCodeModule { return true; } + bool is_ref_function_void (DataType type) { + var cl = type.data_type as Class; + if (cl != null && cl.ref_function_void) { + return true; + } else { + return false; + } + } + public CCodeExpression? get_ref_cexpression (DataType expression_type, CCodeExpression cexpr, Expression? expr, CodeNode node) { if (expression_type is ValueType && !expression_type.nullable) { // normal value type, no null check @@ -2521,7 +2530,8 @@ public class Vala.CCodeBaseModule : CCodeModule { var ccall = new CCodeFunctionCall (dupexpr); - if (!(expression_type is ArrayType) && expr != null && expr.is_non_null ()) { + if (!(expression_type is ArrayType) && expr != null && expr.is_non_null () + && !is_ref_function_void (expression_type)) { // expression is non-null ccall.add_argument ((CCodeExpression) expr.ccodenode); @@ -2582,6 +2592,12 @@ public class Vala.CCodeBaseModule : CCodeModule { } ccomma.append_expression (new CCodeConditionalExpression (cisnull, cifnull, ccall)); + // repeat temp variable at the end of the comma expression + // if the ref function returns void + if (is_ref_function_void (expression_type)) { + ccomma.append_expression (ctemp); + } + return ccomma; } } diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 31c124173..3c889a4be 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -70,6 +70,12 @@ public class Vala.Class : ObjectTypeSymbol { } } + /** + * Specifies wheather the ref function returns void instead of the + * object. + */ + public bool ref_function_void { get; set; } + /** * The name of the function to use to check whether a value is an instance of * this class. If this is null then the default type check function should be @@ -575,6 +581,9 @@ public class Vala.Class : ObjectTypeSymbol { if (a.has_argument ("ref_function")) { set_ref_function (a.get_string ("ref_function")); } + if (a.has_argument ("ref_function_void")) { + this.ref_function_void = a.get_bool ("ref_function_void"); + } if (a.has_argument ("unref_function")) { set_unref_function (a.get_string ("unref_function")); }