diff options
-rw-r--r-- | codegen/valagsignalmodule.vala | 45 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/objects/signals-fundamental-return.vala | 28 | ||||
-rw-r--r-- | tests/objects/signals-gobject-return.vala | 22 |
4 files changed, 63 insertions, 34 deletions
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala index 8035bf09b..909131775 100644 --- a/codegen/valagsignalmodule.vala +++ b/codegen/valagsignalmodule.vala @@ -261,27 +261,14 @@ public class Vala.GSignalModule : GObjectModule { fc.add_argument (new CCodeIdentifier ("data1")); i = 1; foreach (Parameter p in params) { - string get_value_function; + CCodeFunctionCall inner_fc; if (p.direction != ParameterDirection.IN) { - get_value_function = "g_value_get_pointer"; - } else if (p.variable_type is ArrayType) { - if (((ArrayType) p.variable_type).element_type.type_symbol == string_type.type_symbol) { - get_value_function = "g_value_get_boxed"; - } else { - get_value_function = "g_value_get_pointer"; - } - } else if (p.variable_type is DelegateType) { - get_value_function = "g_value_get_pointer"; - } else if (p.variable_type is PointerType || p.variable_type is GenericType) { - get_value_function = "g_value_get_pointer"; - } else if (p.variable_type is ErrorType) { - get_value_function = "g_value_get_pointer"; + inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer")); } else if (p.variable_type is ValueType && p.variable_type.nullable) { - get_value_function = "g_value_get_pointer"; + inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer")); } else { - get_value_function = get_ccode_get_value_function (p.variable_type.type_symbol); + inner_fc = new CCodeFunctionCall (get_value_getter_function (p.variable_type)); } - var inner_fc = new CCodeFunctionCall (new CCodeIdentifier (get_value_function)); inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ()))); fc.add_argument (inner_fc); i++; @@ -298,12 +285,12 @@ public class Vala.GSignalModule : GObjectModule { } else if (p.variable_type is DelegateType) { unowned DelegateType delegate_type = (DelegateType) p.variable_type; if (delegate_type.delegate_symbol.has_target) { - inner_fc = new CCodeFunctionCall (new CCodeIdentifier (get_value_function)); + inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer")); inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ()))); fc.add_argument (inner_fc); i++; if (delegate_type.is_disposable ()) { - inner_fc = new CCodeFunctionCall (new CCodeIdentifier (get_value_function)); + inner_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer")); inner_fc.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier ("param_values"), new CCodeIdentifier (i.to_string ()))); fc.add_argument (inner_fc); i++; @@ -317,24 +304,14 @@ public class Vala.GSignalModule : GObjectModule { ccode.add_assignment (new CCodeIdentifier ("v_return"), fc); CCodeFunctionCall set_fc; - if (return_type is ArrayType) { - if (((ArrayType) return_type).element_type.type_symbol == string_type.type_symbol) { - set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_boxed")); - } else { + if (return_type is ValueType) { + if (return_type.nullable) { set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer")); + } else { + set_fc = new CCodeFunctionCall (get_value_setter_function (return_type)); } - } else if (return_type is GenericType) { - set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer")); - } else if (return_type is ErrorType) { - set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer")); - } else if (return_type.type_symbol == string_type.type_symbol) { - set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_string")); - } else if (return_type.type_symbol is Class || return_type.type_symbol is Interface) { - set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_take_object")); - } else if (return_type is ValueType && return_type.nullable) { - set_fc = new CCodeFunctionCall (new CCodeIdentifier ("g_value_set_pointer")); } else { - set_fc = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_set_value_function (return_type.type_symbol))); + set_fc = new CCodeFunctionCall (get_value_taker_function (return_type)); } set_fc.add_argument (new CCodeIdentifier ("return_value")); set_fc.add_argument (new CCodeIdentifier ("v_return")); diff --git a/tests/Makefile.am b/tests/Makefile.am index 52b7bde0e..af7a89f37 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -414,6 +414,8 @@ TESTS = \ objects/signals-enum-marshal.vala \ objects/signals-delegate.vala \ objects/signals-delegate-parameter.vala \ + objects/signals-fundamental-return.vala \ + objects/signals-gobject-return.vala \ objects/signals-lambda-delegate.vala \ objects/singleton.vala \ objects/test-025.vala \ diff --git a/tests/objects/signals-fundamental-return.vala b/tests/objects/signals-fundamental-return.vala new file mode 100644 index 000000000..d73ed03fb --- /dev/null +++ b/tests/objects/signals-fundamental-return.vala @@ -0,0 +1,28 @@ +class Maman { +} + +interface IBar : Maman { +} + +class Bar : Maman, IBar { +} + +class Foo { + public signal Foo on_foo (); + public signal IBar on_bar (); +} + +void main () { + var foo = new Foo (); + foo.on_foo.connect (() => { + return new Foo (); + }); + foo.on_bar.connect (() => { + return new Bar (); + }); + + var bar = foo.on_foo (); + assert (bar is Foo); + var bar2 = foo.on_bar (); + assert (bar2 is IBar); +} diff --git a/tests/objects/signals-gobject-return.vala b/tests/objects/signals-gobject-return.vala new file mode 100644 index 000000000..71f20df97 --- /dev/null +++ b/tests/objects/signals-gobject-return.vala @@ -0,0 +1,22 @@ +interface IBar : Object { +} + +class Foo : Object, IBar { + public signal Foo on_foo (); + public signal IBar on_bar (); +} + +void main () { + var foo = new Foo (); + foo.on_foo.connect (() => { + return new Foo (); + }); + foo.on_bar.connect (() => { + return new Foo (); + }); + + var bar = foo.on_foo (); + assert (bar is Foo); + var bar2 = foo.on_bar (); + assert (bar2 is IBar); +} |