+2009-02-11 Ryan Lortie <desrt@desrt.ca>
+
+ Bug 571256 – [CCode (async_only = true)] formal parameter annotation
+
+ * vala/valacodewriter.vala:
+ * vala/valaformalparameter.vala:
+ * gobject/valaccodemethodcallmodule.vala:
+
+ Allow emitting some C code arguments only in the case that we are
+ calling the asynchronous version of a yielding function. This helps
+ with the io_priority oddity in GIO.
+
2009-02-11 Jürg Billeter <j@bitron.ch>
* vala/valaenum.vala:
var param = params_it.get ();
ellipsis = param.params_array || param.ellipsis;
if (!ellipsis) {
+ if (param.async_only &&
+ /* only skip if we are in a sync function (or property handler) */
+ (current_method == null || !current_method.coroutine) &&
+ /* and not manually starting async */
+ (ma == null || ma.member_name != "begin")) {
+ /* [CCode (async_only = true)] and we're making a
+ * synchronous version of the call. Emit the arg
+ * at the start of a comma expression so that we
+ * get any side effects but otherwise ignore the
+ * value.
+ */
+ var comma = new CCodeCommaExpression ();
+ comma.append_expression ((CCodeExpression) arg.ccodenode);
+ comma.append_expression (ccall_expr);
+ ccall_expr = comma;
+
+ continue;
+ }
+
// if the vala argument expands to multiple C arguments,
// we have to make sure that the C arguments don't depend
// on each other as there is no guaranteed argument
ccode_params.append_printf ("%sdelegate_target_pos = %g", separator, param.cdelegate_target_parameter_position);
separator = ", ";
}
+ if (param.async_only) {
+ ccode_params.append_printf ("%sasync_only = true", separator);
+ separator = ", ";
+ }
if (ccode_params.len > 0) {
write_string ("[CCode (%s)] ".printf (ccode_params.str));
*/
public double cdelegate_target_parameter_position { get; set; }
+ /**
+ * Specifies that the argument should only be emitted for async
+ * calls (ie: from yielding functions).
+ */
+ public bool async_only { get; set; }
+
/**
* Specifies the type of the parameter in the C function.
*/
if (a.has_argument ("delegate_target_pos")) {
cdelegate_target_parameter_position = a.get_double ("delegate_target_pos");
}
+ if (a.has_argument ("async_only")) {
+ async_only = a.get_bool ("async_only");
+ }
}
/**