Commit 39aa92ba authored by Jürg Billeter's avatar Jürg Billeter Committed by Jürg Billeter

Support [CCode (ref_function_void = true)] attribute for bindings, based

2009-01-06  Jürg Billeter  <j@bitron.ch>

	* 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
parent 4a562865
2009-01-06 Jürg Billeter <j@bitron.ch>
* 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 <j@bitron.ch>
* vala/valaarraytype.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;
}
}
......
......@@ -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"));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment