+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:
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
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);
}
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;
}
}
}
}
+ /**
+ * 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
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"));
}