From: Juerg Billeter Date: Sat, 1 Mar 2008 16:39:13 +0000 (+0000) Subject: fix using interface methods as delegates, fixes bug 518109 X-Git-Tag: VALA_0_1_7~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=58d7306be5210636c0f72a3b21d876d654fff2cd;p=platform%2Fupstream%2Fvala.git fix using interface methods as delegates, fixes bug 518109 2008-03-01 Juerg Billeter * gobject/valaccodegenerator.vala: fix using interface methods as delegates, fixes bug 518109 * tests/delegates.vala: test interface methods as delegates svn path=/trunk/; revision=1080 --- diff --git a/ChangeLog b/ChangeLog index 6b60fbf..f5aa75b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2008-03-01 Jürg Billeter + * gobject/valaccodegenerator.vala: fix using interface methods as + delegates, fixes bug 518109 + + * tests/delegates.vala: test interface methods as delegates + +2008-03-01 Jürg Billeter + * gobject/valaccodegenerator.vala, gobject/valaccodegeneratorclass.vala: don't register private properties with GObject property system, fixes bug 519201 diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 3d02ca9..ab5013e 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -3146,7 +3146,15 @@ public class Vala.CCodeGenerator : CodeGenerator { } else if (target_type is DelegateType && expression_type is MethodType) { var dt = (DelegateType) target_type; var mt = (MethodType) expression_type; - return new CCodeIdentifier (generate_delegate_wrapper (mt.method_symbol, dt.delegate_symbol)); + + var method = mt.method_symbol; + if (method.base_interface_method != null) { + method = method.base_interface_method; + } else if (method.base_method != null) { + method = method.base_method; + } + + return new CCodeIdentifier (generate_delegate_wrapper (method, dt.delegate_symbol)); } else { return cexpr; } diff --git a/tests/delegates.vala b/tests/delegates.vala index 41f7752..74d712b 100644 --- a/tests/delegates.vala +++ b/tests/delegates.vala @@ -6,7 +6,11 @@ public static delegate int Maman.ActionCallback (); public delegate void Maman.InstanceCallback (int i); -class Maman.Bar : Object { +interface Maman.Foo : Object { + public abstract void foo_method (int i); +} + +class Maman.Bar : Object, Foo { public Bar () { } @@ -40,6 +44,15 @@ class Maman.Bar : Object { stdout.printf (" 3\n"); } + public void foo_method (int i) { + } + + static void test_delegates_interface_method () { + // http://bugzilla.gnome.org/show_bug.cgi?id=518109 + var bar = new Bar (); + call_instance_delegate (bar.foo_method); + } + static int main (string[] args) { stdout.printf ("Delegate Test: 1"); @@ -64,6 +77,8 @@ class Maman.Bar : Object { test_function_pointers (); + test_delegates_interface_method (); + return 0; } }