]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Handle NoWrapper attribute of async methods on caller side
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 30 Jan 2021 20:17:25 +0000 (21:17 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 30 Jan 2021 20:17:25 +0000 (21:17 +0100)
codegen/valaccodemethodcallmodule.vala
tests/Makefile.am
tests/asynchronous/nowrapper.vala [new file with mode: 0644]

index 74e22fb64e71836f8a2490a0ac5df9066507a1c6..7506e6a521afd13560f3e9dd4639fb314931bb97 100644 (file)
@@ -108,6 +108,28 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                        async_call.call = new CCodeMemberAccess.pointer (vcast, get_ccode_vfunc_name (m));
                                        finish_call.call = new CCodeMemberAccess.pointer (vcast, get_ccode_finish_vfunc_name (m));
                                }
+                       } else if (m != null && m.get_attribute ("NoWrapper") != null && m.binding == MemberBinding.INSTANCE && !(m is CreationMethod)) {
+                               var instance_value = ma.inner.target_value;
+                               if ((ma.member_name == "begin" || ma.member_name == "end") && ma.inner.symbol_reference == ma.symbol_reference) {
+                                       var inner_ma = (MemberAccess) ma.inner;
+                                       instance_value = inner_ma.inner.target_value;
+                               }
+                               var pub_inst = get_cvalue_ (instance_value);
+
+                               CCodeFunctionCall? vcast = null;
+                               if (m.parent_symbol is Class) {
+                                       unowned Class base_class = (Class) m.parent_symbol;
+                                       vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (base_class)));
+                                       vcast.add_argument (pub_inst);
+                               } else if (m.parent_symbol is Interface) {
+                                       unowned Interface base_iface = (Interface) m.parent_symbol;
+                                       vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (base_iface)));
+                                       vcast.add_argument (pub_inst);
+                               }
+                               if (vcast != null) {
+                                       async_call.call = new CCodeMemberAccess.pointer (vcast, get_ccode_vfunc_name (m));
+                                       finish_call.call = new CCodeMemberAccess.pointer (vcast, get_ccode_finish_vfunc_name (m));
+                               }
                        }
 
                        if (ma.member_name == "begin" && ma.inner.symbol_reference == ma.symbol_reference) {
index f92314361d29f31918fcf5acf68ffe92c2daa852..0395d0a4e704ce6962836091bd9df0bc925edf68 100644 (file)
@@ -643,6 +643,7 @@ TESTS = \
        asynchronous/constructor-argument-check.vala \
        asynchronous/finish-name.vala \
        asynchronous/generator.vala \
+       asynchronous/nowrapper.vala \
        asynchronous/out-parameter-free-on-error.vala \
        asynchronous/out-parameter-invalid.test \
        asynchronous/params-array-invalid.test \
diff --git a/tests/asynchronous/nowrapper.vala b/tests/asynchronous/nowrapper.vala
new file mode 100644 (file)
index 0000000..9f199d5
--- /dev/null
@@ -0,0 +1,32 @@
+interface IFoo : Object {
+       [NoWrapper]
+       public abstract async int manam ();
+}
+
+class Foo : Object, IFoo {
+       [NoWrapper]
+       public virtual async int bar () {
+               return 23;
+       }
+
+       public async int manam () {
+               return 42;
+       }
+}
+
+MainLoop loop;
+
+void main () {
+       loop = new MainLoop ();
+
+       var foo = new Foo ();
+       foo.bar.begin ((o,r) => {
+               assert (foo.bar.end (r) == 23);
+       });
+       foo.manam.begin ((o,r) => {
+               assert (foo.manam.end (r) == 42);
+               loop.quit ();
+       });
+
+       loop.run ();
+}