From: Rico Tzschichholz Date: Sat, 17 Jun 2017 17:57:49 +0000 (+0200) Subject: codegen: Nullable ValueType requires POINTER as marshaller signature X-Git-Tag: 0.37.1~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=40732437777d00598fe9fcd35a2a9bf22eeb8f8a;p=thirdparty%2Fvala.git codegen: Nullable ValueType requires POINTER as marshaller signature This is missing in https://bugzilla.gnome.org/show_bug.cgi?id=758816 https://bugzilla.gnome.org/show_bug.cgi?id=783897 --- diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala index 491b42ac5..d3a97d520 100644 --- a/codegen/valaccodeattribute.vala +++ b/codegen/valaccodeattribute.vala @@ -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) { diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala index 1c0eff476..306c374cd 100644 --- a/codegen/valagsignalmodule.vala +++ b/codegen/valagsignalmodule.vala @@ -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 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 { diff --git a/tests/Makefile.am b/tests/Makefile.am index 061184922..b29e121a1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..58e1ab9d0 --- /dev/null +++ b/tests/objects/bug783897.vala @@ -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 (); +}