From: Rico Tzschichholz Date: Sat, 30 Jan 2021 10:44:17 +0000 (+0100) Subject: codegen: Handle NoWrapper attribute of interface methods on caller side X-Git-Tag: 0.51.1~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d07298585351aea50649460a42e86284ec5db7f;p=thirdparty%2Fvala.git codegen: Handle NoWrapper attribute of interface methods on caller side --- diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index b3b578435..4b353a09e 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -78,7 +78,14 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { set_cvalue (expr, new CCodeIdentifier (get_ccode_name (m.base_method))); } } else if (m.base_interface_method != null) { - set_cvalue (expr, new CCodeIdentifier (get_ccode_name (m.base_interface_method))); + if (m.base_interface_method.get_attribute ("NoWrapper") != null) { + var base_iface = (Interface) m.base_interface_method.parent_symbol; + var vclass = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_interface_get_function (base_iface))); + vclass.add_argument (pub_inst); + set_cvalue (expr, new CCodeMemberAccess.pointer (vclass, get_ccode_vfunc_name (m))); + } else { + set_cvalue (expr, new CCodeIdentifier (get_ccode_name (m.base_interface_method))); + } } else if (m is CreationMethod) { set_cvalue (expr, new CCodeIdentifier (get_ccode_real_name (m))); } else { diff --git a/tests/Makefile.am b/tests/Makefile.am index e3a1efb0f..f92314361 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -219,6 +219,7 @@ TESTS = \ methods/argument-named.vala \ methods/delegate-target.vala \ methods/generics.vala \ + methods/nowrapper-interface.vala \ methods/nowrapper-no-vfunc.test \ methods/params-array.vala \ methods/params-array-abstract.test \ diff --git a/tests/methods/nowrapper-interface.vala b/tests/methods/nowrapper-interface.vala new file mode 100644 index 000000000..ba69d8789 --- /dev/null +++ b/tests/methods/nowrapper-interface.vala @@ -0,0 +1,15 @@ +interface IFoo : Object { + [NoWrapper] + public abstract int bar (); +} + +class Foo : Object, IFoo { + int bar () { + return 42; + } +} + +void main () { + var foo = new Foo (); + assert (foo.bar () == 42); +}