From: Luca Bruno Date: Tue, 9 Jul 2013 06:03:58 +0000 (-0700) Subject: girparser: Support scope=async parameters. X-Git-Tag: 0.21.2~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3e20fd82c05daa60005aaff11411cd1814beb778;p=thirdparty%2Fvala.git girparser: Support scope=async parameters. Based on patch by Evan. Fixes bug 704176. --- diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index b6cbe1634..fde6b68fb 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -2734,13 +2734,14 @@ public class Vala.GirParser : CodeVisitor { } class ParameterInfo { - public ParameterInfo (Parameter param, int array_length_idx, int closure_idx, int destroy_idx) { + public ParameterInfo (Parameter param, int array_length_idx, int closure_idx, int destroy_idx, bool is_async = false) { this.param = param; this.array_length_idx = array_length_idx; this.closure_idx = closure_idx; this.destroy_idx = destroy_idx; this.vala_idx = 0.0F; this.keep = true; + this.is_async = is_async; } public Parameter param; @@ -2749,6 +2750,7 @@ public class Vala.GirParser : CodeVisitor { public int closure_idx; public int destroy_idx; public bool keep; + public bool is_async; } void parse_function (string element_name) { @@ -2940,7 +2942,7 @@ public class Vala.GirParser : CodeVisitor { comment.add_content_for_parameter ((param.ellipsis)? "..." : param.name, param_comment); } - var info = new ParameterInfo (param, array_length_idx, closure_idx, destroy_idx); + var info = new ParameterInfo (param, array_length_idx, closure_idx, destroy_idx, scope == "async"); if (s is Method && scope == "async") { var unresolved_type = param.variable_type as UnresolvedType; @@ -3387,42 +3389,61 @@ public class Vala.GirParser : CodeVisitor { } foreach (ParameterInfo info in parameters) { - if (info.keep) { - - /* add_parameter sets carray_length_parameter_position and cdelegate_target_parameter_position - so do it first*/ - if (s is Method) { - ((Method) s).add_parameter (info.param); - } else if (s is Delegate) { - ((Delegate) s).add_parameter (info.param); - } else if (s is Signal) { - ((Signal) s).add_parameter (info.param); - } - - if (info.array_length_idx != -1) { - if ((info.array_length_idx) >= parameters.size) { - Report.error (get_current_src (), "invalid array_length index"); - continue; - } - set_array_ccode (info.param, parameters[info.array_length_idx]); + if (!info.keep) { + continue; + } + + /* add_parameter sets carray_length_parameter_position and cdelegate_target_parameter_position + so do it first*/ + if (s is Method) { + ((Method) s).add_parameter (info.param); + } else if (s is Delegate) { + ((Delegate) s).add_parameter (info.param); + } else if (s is Signal) { + ((Signal) s).add_parameter (info.param); + } + + if (info.array_length_idx != -1) { + if ((info.array_length_idx) >= parameters.size) { + Report.error (get_current_src (), "invalid array_length index"); + continue; } + set_array_ccode (info.param, parameters[info.array_length_idx]); + } - if (info.closure_idx != -1) { - if ((info.closure_idx) >= parameters.size) { - Report.error (get_current_src (), "invalid closure index"); - continue; - } - if ("%g".printf (parameters[info.closure_idx].vala_idx) != "%g".printf (info.vala_idx + 0.1)) { - info.param.set_attribute_double ("CCode", "delegate_target_pos", parameters[info.closure_idx].vala_idx); - } + if (info.closure_idx != -1) { + if ((info.closure_idx) >= parameters.size) { + Report.error (get_current_src (), "invalid closure index"); + continue; + } + if ("%g".printf (parameters[info.closure_idx].vala_idx) != "%g".printf (info.vala_idx + 0.1)) { + info.param.set_attribute_double ("CCode", "delegate_target_pos", parameters[info.closure_idx].vala_idx); + } + } + if (info.destroy_idx != -1) { + if (info.destroy_idx >= parameters.size) { + Report.error (get_current_src (), "invalid destroy index"); + continue; } - if (info.destroy_idx != -1) { - if (info.destroy_idx >= parameters.size) { - Report.error (get_current_src (), "invalid destroy index"); - continue; + if ("%g".printf (parameters[info.destroy_idx].vala_idx) != "%g".printf (info.vala_idx + 0.2)) { + info.param.set_attribute_double ("CCode", "destroy_notify_pos", parameters[info.destroy_idx].vala_idx); + } + } + + if (info.is_async) { + var resolved_type = info.param.variable_type; + if (resolved_type is UnresolvedType) { + var resolved_symbol = resolve_symbol (node.parent, ((UnresolvedType) resolved_type).unresolved_symbol); + if (resolved_symbol is Delegate) { + resolved_type = new DelegateType ((Delegate) resolved_symbol); } - if ("%g".printf (parameters[info.destroy_idx].vala_idx) != "%g".printf (info.vala_idx + 0.2)) { - info.param.set_attribute_double ("CCode", "destroy_notify_pos", parameters[info.destroy_idx].vala_idx); + } + + if (resolved_type is DelegateType) { + var d = ((DelegateType) resolved_type).delegate_symbol; + if (!(d.name == "DestroyNotify" && d.parent_symbol.name == "GLib")) { + info.param.set_attribute_string ("CCode", "scope", "async"); + info.param.variable_type.value_owned = true; } } } diff --git a/vapi/gstreamer-1.0.vapi b/vapi/gstreamer-1.0.vapi index 54d4aa5a4..e5bc8cf72 100644 --- a/vapi/gstreamer-1.0.vapi +++ b/vapi/gstreamer-1.0.vapi @@ -1772,7 +1772,7 @@ namespace Gst { public virtual void cleanup (); public virtual void join (void* id); public virtual void prepare () throws GLib.Error; - public virtual void* push (Gst.TaskPoolFunction func) throws GLib.Error; + public virtual void* push ([CCode (scope = "async")] owned Gst.TaskPoolFunction func) throws GLib.Error; } [CCode (cheader_filename = "gst/gst.h", ref_function = "gst_toc_ref", type_id = "gst_toc_get_type ()", unref_function = "gst_toc_unref")] [Compact] @@ -1961,7 +1961,7 @@ namespace Gst { public static bool api_type_has_tag (GLib.Type api, GLib.Quark tag); public static GLib.Type api_type_register (string api, string tags); public static unowned Gst.MetaInfo? get_info (string impl); - public static unowned Gst.MetaInfo? register (GLib.Type api, string impl, size_t size, Gst.MetaInitFunction init_func, Gst.MetaFreeFunction free_func, Gst.MetaTransformFunction transform_func); + public static unowned Gst.MetaInfo? register (GLib.Type api, string impl, size_t size, [CCode (scope = "async")] owned Gst.MetaInitFunction init_func, [CCode (scope = "async")] owned Gst.MetaFreeFunction free_func, [CCode (scope = "async")] owned Gst.MetaTransformFunction transform_func); } [CCode (cheader_filename = "gst/gst.h", has_type_id = false)] public struct MetaInfo { diff --git a/vapi/libsoup-2.4.vapi b/vapi/libsoup-2.4.vapi index c78e6343f..334a8add9 100644 --- a/vapi/libsoup-2.4.vapi +++ b/vapi/libsoup-2.4.vapi @@ -90,7 +90,7 @@ namespace Soup { public uint hash_by_ip (); public uint hash_by_name (); public bool is_resolved (); - public void resolve_async (GLib.MainContext? async_context, GLib.Cancellable? cancellable, Soup.AddressCallback callback); + public void resolve_async (GLib.MainContext? async_context, GLib.Cancellable? cancellable, [CCode (scope = "async")] owned Soup.AddressCallback callback); public uint resolve_sync (GLib.Cancellable? cancellable = null); [NoAccessorMethod] public Soup.AddressFamily family { get; construct; } @@ -645,10 +645,10 @@ namespace Soup { [NoWrapper] public virtual void kick (); public void pause_message (Soup.Message msg); - public void prefetch_dns (string hostname, GLib.Cancellable? cancellable, Soup.AddressCallback? callback); + public void prefetch_dns (string hostname, GLib.Cancellable? cancellable, [CCode (scope = "async")] owned Soup.AddressCallback? callback); [Deprecated (since = "2.38")] public void prepare_for_uri (Soup.URI uri); - public virtual void queue_message (owned Soup.Message msg, Soup.SessionCallback? callback); + public virtual void queue_message (owned Soup.Message msg, [CCode (scope = "async")] owned Soup.SessionCallback? callback); public bool redirect_message (Soup.Message msg); public void remove_feature (Soup.SessionFeature feature); public void remove_feature_by_type (GLib.Type feature_type); @@ -728,7 +728,7 @@ namespace Soup { public class Socket : GLib.Object { [CCode (has_construct_function = false)] public Socket (string optname1, ...); - public void connect_async (GLib.Cancellable? cancellable, Soup.SocketCallback callback); + public void connect_async (GLib.Cancellable? cancellable, [CCode (scope = "async")] owned Soup.SocketCallback callback); public uint connect_sync (GLib.Cancellable? cancellable = null); public void disconnect (); public int get_fd (); @@ -822,7 +822,7 @@ namespace Soup { } [CCode (cheader_filename = "libsoup/soup.h", type_cname = "SoupPasswordManagerInterface", type_id = "soup_password_manager_get_type ()")] public interface PasswordManager : Soup.SessionFeature, GLib.Object { - public abstract void get_passwords_async (Soup.Message msg, Soup.Auth auth, bool retrying, GLib.MainContext async_context, GLib.Cancellable? cancellable, Soup.PasswordManagerCallback callback); + public abstract void get_passwords_async (Soup.Message msg, Soup.Auth auth, bool retrying, GLib.MainContext async_context, GLib.Cancellable? cancellable, [CCode (scope = "async")] owned Soup.PasswordManagerCallback callback); public abstract void get_passwords_sync (Soup.Message msg, Soup.Auth auth, GLib.Cancellable? cancellable = null); } [CCode (cheader_filename = "libsoup/soup.h", type_cname = "SoupProxyResolverInterface", type_id = "soup_proxy_resolver_get_type ()")] @@ -833,7 +833,7 @@ namespace Soup { } [CCode (cheader_filename = "libsoup/soup.h", type_cname = "SoupProxyURIResolverInterface", type_id = "soup_proxy_uri_resolver_get_type ()")] public interface ProxyURIResolver : Soup.SessionFeature, GLib.Object { - public abstract void get_proxy_uri_async (Soup.URI uri, GLib.MainContext? async_context, GLib.Cancellable? cancellable, Soup.ProxyURIResolverCallback callback); + public abstract void get_proxy_uri_async (Soup.URI uri, GLib.MainContext? async_context, GLib.Cancellable? cancellable, [CCode (scope = "async")] owned Soup.ProxyURIResolverCallback callback); public abstract uint get_proxy_uri_sync (Soup.URI uri, GLib.Cancellable? cancellable, out Soup.URI proxy_uri); } [CCode (cheader_filename = "libsoup/soup.h", type_cname = "SoupSessionFeatureInterface", type_id = "soup_session_feature_get_type ()")]