[vala/0.40] girparser: Async methods don't allow out-parameters before in-parameters
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.40] girparser: Async methods don't allow out-parameters before in-parameters
- Date: Mon, 21 Jan 2019 16:58:41 +0000 (UTC)
commit 9ded76e2665fab08fb8a680b946d99fbb6b34eb1
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Sun Oct 21 10:34:28 2018 +0200
girparser: Async methods don't allow out-parameters before in-parameters
In vala out-parameters are always handled in the *_finish implementation
and therefore are asynchronous. Report a warning for GIR sources where
convert them to pointer-types to create usuable signatures for bindings.
See https://gitlab.gnome.org/GNOME/vala/issues/636
tests/Makefile.am | 1 +
tests/gir/async-sync-out.test | 58 +++++++++++++++++++++++++++++++++++++++++++
vala/valagirparser.vala | 14 +++++++++++
3 files changed, 73 insertions(+)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 08260b05e..777e45dea 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -412,6 +412,7 @@ TESTS = \
gir/bug792998.test \
gir/array-fixed-length.test \
gir/async-result-pos.test \
+ gir/async-sync-out.test \
gir/class.test \
gir/delegate-alias-without-target.test \
gir/delegate-closure-destroy-index-conflict.test \
diff --git a/tests/gir/async-sync-out.test b/tests/gir/async-sync-out.test
new file mode 100644
index 000000000..48956f61d
--- /dev/null
+++ b/tests/gir/async-sync-out.test
@@ -0,0 +1,58 @@
+GIR
+
+Input:
+
+<class name="Foo" c:type="TestFoo" glib:type-name="TestFoo" glib:get-type="test_foo_get_type"
glib:type-struct="FooClass" parent="GObject.Object">
+ <method name="method_async" c:identifier="test_foo_method_async">
+ <return-value transfer-ownership="none">
+ <type name="none"/>
+ </return-value>
+ <parameters>
+ <instance-parameter name="self" transfer-ownership="none">
+ <type name="Foo" c:type="TestFoo*"/>
+ </instance-parameter>
+ <parameter name="input" transfer-ownership="none">
+ <type name="utf8" c:type="const gchar*"/>
+ </parameter>
+ <parameter name="sync_output" direction="out" transfer-ownership="full">
+ <type name="utf8" c:type="gchar**"/>
+ </parameter>
+ <parameter name="_callback_" transfer-ownership="none" allow-none="1" closure="3" scope="async">
+ <type name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
+ </parameter>
+ <parameter name="_callback__target" transfer-ownership="none" allow-none="1">
+ <type name="gpointer" c:type="void*"/>
+ </parameter>
+ </parameters>
+ </method>
+ <method name="method_finish" c:identifier="test_foo_method_finish" throws="1">
+ <return-value transfer-ownership="full">
+ <type name="none"/>
+ </return-value>
+ <parameters>
+ <instance-parameter name="self" transfer-ownership="none">
+ <type name="Foo" c:type="TestFoo*"/>
+ </instance-parameter>
+ <parameter name="_res_" transfer-ownership="none">
+ <type name="Gio.AsyncResult" c:type="GAsyncResult*"/>
+ </parameter>
+ <parameter name="output" direction="out" transfer-ownership="full">
+ <type name="utf8" c:type="gchar**"/>
+ </parameter>
+ </parameters>
+ </method>
+ <constructor name="new" c:identifier="test_foo_new">
+ <return-value transfer-ownership="full">
+ <type name="Test.Foo" c:type="TestFoo*"/>
+ </return-value>
+ </constructor>
+</class>
+
+Output:
+
+[CCode (cheader_filename = "test.h", type_id = "test_foo_get_type ()")]
+public class Foo : GLib.Object {
+ [CCode (has_construct_function = false)]
+ public Foo ();
+ public async void method_async (string input, string* sync_output, out string output) throws
GLib.Error;
+}
diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala
index 90d20367f..9b6af671f 100644
--- a/vala/valagirparser.vala
+++ b/vala/valagirparser.vala
@@ -4062,6 +4062,20 @@ public class Vala.GirParser : CodeVisitor {
void process_async_method (Node node) {
var m = (Method) node.symbol;
+
+ // TODO: async methods with out-parameters before in-parameters are not supported
+ bool requires_pointer = false;
+ foreach (var param in m.get_parameters ()) {
+ if (param.direction == ParameterDirection.IN) {
+ requires_pointer = true;
+ } else if (requires_pointer) {
+ param.direction = ParameterDirection.IN;
+ param.variable_type.nullable = false;
+ param.variable_type = new PointerType (param.variable_type);
+ Report.warning (param.source_reference, "Synchronous out-parameters are not
supported in async methods");
+ }
+ }
+
string finish_method_base;
if (m.name == null) {
assert (m is CreationMethod);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]