From: Ryan Lortie Date: Wed, 11 Feb 2009 01:02:37 +0000 (+0000) Subject: Bug 571256 – [CCode (async_only = true)] formal parameter annotation X-Git-Tag: 0.5.7~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0120430c290c80ff2b60b47c5607f2f8735f28f1;p=thirdparty%2Fvala.git Bug 571256 – [CCode (async_only = true)] formal parameter annotation 2009-02-11 Ryan Lortie 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. svn path=/trunk/; revision=2427 --- diff --git a/ChangeLog b/ChangeLog index cd0f91d5a..6bcc14bac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2009-02-11 Ryan Lortie + + 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 * vala/valaenum.vala: diff --git a/gobject/valaccodemethodcallmodule.vala b/gobject/valaccodemethodcallmodule.vala index 49d1d5d87..25e9eb725 100644 --- a/gobject/valaccodemethodcallmodule.vala +++ b/gobject/valaccodemethodcallmodule.vala @@ -212,6 +212,25 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule { 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 diff --git a/vala/valacodewriter.vala b/vala/valacodewriter.vala index 0023fad7d..8a2a5eb1b 100644 --- a/vala/valacodewriter.vala +++ b/vala/valacodewriter.vala @@ -726,6 +726,10 @@ public class Vala.CodeWriter : CodeVisitor { 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)); diff --git a/vala/valaformalparameter.vala b/vala/valaformalparameter.vala index d848d1725..74e03cad9 100644 --- a/vala/valaformalparameter.vala +++ b/vala/valaformalparameter.vala @@ -88,6 +88,12 @@ public class Vala.FormalParameter : Symbol { */ 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. */ @@ -157,6 +163,9 @@ public class Vala.FormalParameter : Symbol { 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"); + } } /**