]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Nullable ValueType requires POINTER as marshaller signature
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 17 Jun 2017 17:57:49 +0000 (19:57 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sat, 17 Jun 2017 19:04:11 +0000 (21:04 +0200)
This is missing in https://bugzilla.gnome.org/show_bug.cgi?id=758816

https://bugzilla.gnome.org/show_bug.cgi?id=783897

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

index 491b42ac510bc136d959fe8e78d826174acf6b54..d3a97d520a1d97dbfb517671a097aae969f1a59c 100644 (file)
@@ -969,6 +969,8 @@ public class Vala.CCodeAttribute : AttributeCache {
                        } else {
                                return "POINTER";
                        }
+               } else if (node is ValueType && ((ValueType) node).nullable) {
+                       return "POINTER";
                } else if (node is PointerType || ((DataType) node).type_parameter != null) {
                        return "POINTER";
                } else if (node is ErrorType) {
index 1c0eff476e4e908e8efd470e61e92e749b4e2be0..306c374cd44eef359f0b2f3b61dd56cdb468e0f6 100644 (file)
@@ -36,11 +36,7 @@ public class Vala.GSignalModule : GObjectModule {
                        }
                }
                
-               if (return_type is ValueType && return_type.nullable) {
-                       ret = "%s_POINTER_".printf (prefix);
-               } else {
-                       ret = "%s_%s_".printf (prefix, get_ccode_marshaller_type_name (return_type));
-               }
+               ret = "%s_%s_".printf (prefix, get_ccode_marshaller_type_name (return_type));
                
                if (params == null || params.size == 0) {
                        ret = ret + "_VOID";
@@ -93,11 +89,7 @@ public class Vala.GSignalModule : GObjectModule {
        private string get_marshaller_signature (List<Parameter> params, DataType return_type) {
                string signature;
                
-               if (return_type is ValueType && return_type.nullable) {
-                       signature = "POINTER:";
-               } else {
-                       signature = "%s:".printf (get_ccode_marshaller_type_name (return_type));
-               }
+               signature = "%s:".printf (get_ccode_marshaller_type_name (return_type));
                if (params == null || params.size == 0) {
                        signature = signature + "VOID";
                } else {
index 061184922481ae7cf1ff83ccc6206c902d8cded1..b29e121a1ca70f2795bb4e3f1b9a3cd83f6bd25e 100644 (file)
@@ -230,6 +230,7 @@ TESTS = \
        objects/bug779038-3.test \
        objects/bug779219.vala \
        objects/bug779955.vala \
+       objects/bug783897.vala \
        errors/errors.vala \
        errors/bug567181.vala \
        errors/bug579101.vala \
diff --git a/tests/objects/bug783897.vala b/tests/objects/bug783897.vala
new file mode 100644 (file)
index 0000000..58e1ab9
--- /dev/null
@@ -0,0 +1,57 @@
+enum Baz {
+       VALUE = 42;
+}
+
+struct Bar {
+       public int i;
+}
+
+class Foo {
+       public signal void signal_enum (Baz? e);
+       public signal void signal_simple_type (int? t);
+       public signal void signal_struct (Bar? s);
+       public signal void signal_custom (Foo f, Baz? e, int? t, Bar? s);
+       public signal void signal_custom2 (Foo f, Baz e, int t, Bar s);
+
+       public void run () {
+               signal_enum (Baz.VALUE);
+               signal_simple_type (23);
+               signal_struct ({ 4711 });
+               signal_custom (this, Baz.VALUE, 23, { 4711 });
+               signal_custom2 (this, Baz.VALUE, 23, { 4711 });
+       }
+}
+
+void callback_enum (Baz? e) {
+       assert (e == Baz.VALUE);
+}
+
+void callback_simple_type (int? t) {
+       assert (t == 23);
+}
+
+void callback_struct (Bar? s) {
+       assert (s.i == 4711);
+}
+
+void callback_custom (Foo f, Baz? e, int? t, Bar? s) {
+       assert (e == Baz.VALUE);
+       assert (t == 23);
+       assert (s.i == 4711);
+}
+
+void callback_custom2 (Foo f, Baz e, int t, Bar s) {
+       assert (e == Baz.VALUE);
+       assert (t == 23);
+       assert (s.i == 4711);
+}
+
+void main() {
+       var foo = new Foo ();
+       foo.signal_enum.connect (callback_enum);
+       foo.signal_simple_type.connect (callback_simple_type);
+       foo.signal_struct.connect (callback_struct);
+       foo.signal_custom.connect (callback_custom);
+       foo.signal_custom2.connect (callback_custom2);
+       foo.run ();
+}