summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--codegen/valagsignalmodule.vala45
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/objects/signals-fundamental-return.vala28
-rw-r--r--tests/objects/signals-gobject-return.vala22
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);
+}