From: Luca Bruno Date: Mon, 16 May 2011 13:51:29 +0000 (+0200) Subject: GType: Support virtual signals in interfaces X-Git-Tag: 0.13.0~106 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=72815fed8f55b91c137e778156e13ba1a9e64d45;p=thirdparty%2Fvala.git GType: Support virtual signals in interfaces Fixes bug 642809. --- diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala index 27d0c580a..1bde96489 100644 --- a/codegen/valagsignalmodule.vala +++ b/codegen/valagsignalmodule.vala @@ -336,7 +336,6 @@ public class Vala.GSignalModule : GObjectModule { public override CCodeFunctionCall get_signal_creation (Signal sig, TypeSymbol type) { var csignew = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_new")); - var cl = sig.parent_symbol as Class; csignew.add_argument (new CCodeConstant ("\"%s\"".printf (sig.get_cname ()))); csignew.add_argument (new CCodeIdentifier (type.get_type_id ())); string[] flags = new string[0]; @@ -369,7 +368,12 @@ public class Vala.GSignalModule : GObjectModule { csignew.add_argument (new CCodeConstant ("0")); } else { var struct_offset = new CCodeFunctionCall (new CCodeIdentifier ("G_STRUCT_OFFSET")); - struct_offset.add_argument (new CCodeIdentifier ("%sClass".printf (cl.get_cname ()))); + if (type is Class) { + struct_offset.add_argument (new CCodeIdentifier ("%sClass".printf (type.get_cname ()))); + } else { + // interface + struct_offset.add_argument (new CCodeIdentifier (((Interface) type).get_type_cname ())); + } struct_offset.add_argument (new CCodeIdentifier (sig.default_handler.vfunc_name)); csignew.add_argument (struct_offset); } diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala index b84bd15c4..e5eb298c2 100644 --- a/codegen/valagtypemodule.vala +++ b/codegen/valagtypemodule.vala @@ -1861,6 +1861,12 @@ public class Vala.GTypeModule : GErrorModule { generate_virtual_method_declaration (m, decl_space, type_struct); } + foreach (Signal sig in iface.get_signals ()) { + if (sig.default_handler != null) { + generate_virtual_method_declaration (sig.default_handler, decl_space, type_struct); + } + } + foreach (Property prop in iface.get_properties ()) { if (!prop.is_abstract && !prop.is_virtual) { continue; diff --git a/tests/Makefile.am b/tests/Makefile.am index 95cb9eae4..3169591c6 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -78,6 +78,7 @@ TESTS = \ objects/bug620706.vala \ objects/bug624594.vala \ objects/bug628639.vala \ + objects/bug642809.vala \ errors/errors.vala \ errors/bug567181.vala \ errors/bug579101.vala \ diff --git a/tests/objects/bug642809.vala b/tests/objects/bug642809.vala new file mode 100644 index 000000000..91ba53e48 --- /dev/null +++ b/tests/objects/bug642809.vala @@ -0,0 +1,11 @@ +interface Foo : Object { + public virtual signal void virtual_signal () { } +} + +class Bar : Object, Foo { +} + +void main () { + var bar = new Bar (); + bar.virtual_signal (); +}