From 320bd7cb59b78f6012527ff82fd3496db567b20a Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Sat, 17 Jun 2017 19:57:49 +0200 Subject: [PATCH] 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 --- codegen/valaccodeattribute.vala | 2 ++ codegen/valagsignalmodule.vala | 12 ++----- tests/Makefile.am | 1 + tests/objects/bug783897.vala | 57 +++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 tests/objects/bug783897.vala diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala index ec41f82b1..c6c88ba6a 100644 --- a/codegen/valaccodeattribute.vala +++ b/codegen/valaccodeattribute.vala @@ -959,6 +959,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 00c06c196..a31f35da1 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 01713f727..b1996327c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -227,6 +227,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 (); +} -- 2.47.3