From: Rico Tzschichholz Date: Sun, 8 Jul 2018 13:02:54 +0000 (+0200) Subject: codegen: Fix invocation of abstract/virtual methods with NoWrapper in compact classes X-Git-Tag: 0.41.90~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=229199cd8d63f02d5ef9f6fc174c98d240b5dc1d;p=thirdparty%2Fvala.git codegen: Fix invocation of abstract/virtual methods with NoWrapper in compact classes --- diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 30aec9499..400448643 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -68,9 +68,13 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { if (m.base_method != null) { if (!method_has_wrapper (m.base_method)) { var base_class = (Class) m.base_method.parent_symbol; - var vclass = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS".printf (get_ccode_upper_case_name (base_class)))); - vclass.add_argument (pub_inst); - set_cvalue (expr, new CCodeMemberAccess.pointer (vclass, get_ccode_vfunc_name (m))); + if (!base_class.is_compact) { + var vclass = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS".printf (get_ccode_upper_case_name (base_class)))); + vclass.add_argument (pub_inst); + set_cvalue (expr, new CCodeMemberAccess.pointer (vclass, get_ccode_vfunc_name (m))); + } else { + set_cvalue (expr, new CCodeMemberAccess.pointer (pub_inst, get_ccode_vfunc_name (m))); + } } else { set_cvalue (expr, new CCodeIdentifier (get_ccode_name (m.base_method))); } diff --git a/tests/objects/bug741465.vala b/tests/objects/bug741465.vala index e420aecf3..638d4447d 100644 --- a/tests/objects/bug741465.vala +++ b/tests/objects/bug741465.vala @@ -53,6 +53,11 @@ class Manam { public virtual unowned string foo () { return "Manam"; } + + [NoWrapper] + public virtual int foo_plain () { + return 13; + } } [Compact] @@ -60,6 +65,10 @@ class Baz : Manam { public override unowned string foo () { return "Baz"; } + + public override int foo_plain () { + return 23; + } } void main () { @@ -78,9 +87,11 @@ void main () { var manam = new Manam (); assert (manam.foo () == "Manam"); assert (manam.prop == 24); + assert (manam.foo_plain () == 13); var baz = new Baz (); assert (baz.foo () == "Baz"); baz.prop = 42; assert (baz.prop == 42); + assert (baz.foo_plain () == 23); }