]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GType: Support virtual signals in interfaces
authorLuca Bruno <lucabru@src.gnome.org>
Mon, 16 May 2011 13:51:29 +0000 (15:51 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Mon, 16 May 2011 13:58:44 +0000 (15:58 +0200)
Fixes bug 642809.

codegen/valagsignalmodule.vala
codegen/valagtypemodule.vala
tests/Makefile.am
tests/objects/bug642809.vala [new file with mode: 0644]

index 27d0c580a277364cb228a245aedc26491aabe586..1bde964890d6f2c4b1b66af6dace43ca305ce01a 100644 (file)
@@ -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);
                }
index b84bd15c426db55022e42beac59a20cfe22d9bde..e5eb298c246456764840edab0147ae4da718bae6 100644 (file)
@@ -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;
index 95cb9eae45f976fd318be0e9978ddc10294516fa..3169591c64b2c98e37026e99f6bc1269be401dbd 100644 (file)
@@ -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 (file)
index 0000000..91ba53e
--- /dev/null
@@ -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 ();
+}