summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2008-06-15 21:29:51 +0000
committerJürg Billeter <juergbi@src.gnome.org>2008-06-15 21:29:51 +0000
commit150c1e581b6ccc8260fa55935d67e602e45ae54b (patch)
tree38188fa1bb039f852eb25e19415db27f6253f81e
parentcd4c61313033d7e57c2a1a895240bb9b633487b1 (diff)
downloadvala-150c1e581b6ccc8260fa55935d67e602e45ae54b.tar.gz
Support emitting signals with return values, patch by Samuel
2008-06-15 Jürg Billeter <j@bitron.ch> * gobject/valaccodeinvocationexpressionbinding.vala: Support emitting signals with return values, patch by Samuel Cormier-Iijima, fixes bug 537323 * tests/classes-signals.exp: * tests/classes-signals.vala: Test signals with return values svn path=/trunk/; revision=1589
-rw-r--r--ChangeLog12
-rw-r--r--THANKS1
-rw-r--r--gobject/valaccodeinvocationexpressionbinding.vala20
-rw-r--r--tests/classes-signals.exp1
-rw-r--r--tests/classes-signals.vala35
5 files changed, 69 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 170a592dd..63c4e7c1b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
2008-06-15 Jürg Billeter <j@bitron.ch>
+ * gobject/valaccodeinvocationexpressionbinding.vala:
+
+ Support emitting signals with return values,
+ patch by Samuel Cormier-Iijima, fixes bug 537323
+
+ * tests/classes-signals.exp:
+ * tests/classes-signals.vala:
+
+ Test signals with return values
+
+2008-06-15 Jürg Billeter <j@bitron.ch>
+
* vala/valascanner.vala:
Fix line number calculation for verbatim strings, fixes bug 537123
diff --git a/THANKS b/THANKS
index 71e91d037..1bd245650 100644
--- a/THANKS
+++ b/THANKS
@@ -43,6 +43,7 @@ Rob Taylor
Roberto Majadas
Roland Hostettler
Ross Burton
+Samuel Cormier-Iijima
Stéphan Kochen
Thijs Vermeir
Travis Watkins
diff --git a/gobject/valaccodeinvocationexpressionbinding.vala b/gobject/valaccodeinvocationexpressionbinding.vala
index c5004050b..195b53395 100644
--- a/gobject/valaccodeinvocationexpressionbinding.vala
+++ b/gobject/valaccodeinvocationexpressionbinding.vala
@@ -386,6 +386,26 @@ public class Vala.CCodeInvocationExpressionBinding : CCodeExpressionBinding {
}
}
+ // pass address for the return value of non-void signals without emitter functions
+ if (itype is SignalType && !(itype.get_return_type () is VoidType)) {
+ var sig = ((SignalType) itype).signal_symbol;
+
+ if (!sig.has_emitter) {
+ var temp_var = codegen.get_temp_variable (itype.get_return_type ());
+ var temp_ref = new CCodeIdentifier (temp_var.name);
+
+ codegen.temp_vars.insert (0, temp_var);
+
+ carg_map.set (codegen.get_param_pos (-1, true), new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, temp_ref));
+
+ var ccomma = new CCodeCommaExpression ();
+ ccomma.append_expression ((CCodeExpression) ccall_expr);
+ ccomma.append_expression ((CCodeExpression) temp_ref);
+
+ ccall_expr = ccomma;
+ }
+ }
+
// append C arguments in the right order
int last_pos = -1;
int min_pos;
diff --git a/tests/classes-signals.exp b/tests/classes-signals.exp
index c42d7ec3c..ec783ec45 100644
--- a/tests/classes-signals.exp
+++ b/tests/classes-signals.exp
@@ -1,2 +1,3 @@
Signal Test: 1 2 3 4 5 6 7 8 9 10
User Signal Test: 1 2 3 4 5 6
+Signal Return Test: 1 2 3 4 5 6 7 8
diff --git a/tests/classes-signals.vala b/tests/classes-signals.vala
index 555339f1b..52b4b2538 100644
--- a/tests/classes-signals.vala
+++ b/tests/classes-signals.vala
@@ -62,6 +62,13 @@ class Maman.Bar : Object {
stdout.printf (" 6\n");
+ stdout.printf ("Signal Return Test: 1");
+
+ var return_bar = new ReturnBar ();
+ return_bar.run ();
+
+ stdout.printf (" 8\n");
+
return 0;
}
}
@@ -92,3 +99,31 @@ class Maman.UserBar : Object {
}
}
+class Maman.ReturnFoo : Object {
+ public signal int int_activated (int arg);
+ public signal string string_activated (string arg);
+}
+
+class Maman.ReturnBar : Object {
+ public void run () {
+ stdout.printf (" 2");
+
+ var foo = new ReturnFoo ();
+
+ foo.int_activated += (foo, arg) => {
+ stdout.printf (" %d", arg);
+ return arg + 1;
+ };
+
+ foo.string_activated += (foo, arg) => {
+ stdout.printf (arg);
+ return " 6";
+ };
+
+ stdout.printf (" %d", foo.int_activated (3));
+
+ stdout.printf (foo.string_activated (" 5"));
+
+ stdout.printf (" 7");
+ }
+}