diff options
author | Jürg Billeter <j@bitron.ch> | 2008-06-15 21:29:51 +0000 |
---|---|---|
committer | Jürg Billeter <juergbi@src.gnome.org> | 2008-06-15 21:29:51 +0000 |
commit | 150c1e581b6ccc8260fa55935d67e602e45ae54b (patch) | |
tree | 38188fa1bb039f852eb25e19415db27f6253f81e | |
parent | cd4c61313033d7e57c2a1a895240bb9b633487b1 (diff) | |
download | vala-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-- | ChangeLog | 12 | ||||
-rw-r--r-- | THANKS | 1 | ||||
-rw-r--r-- | gobject/valaccodeinvocationexpressionbinding.vala | 20 | ||||
-rw-r--r-- | tests/classes-signals.exp | 1 | ||||
-rw-r--r-- | tests/classes-signals.vala | 35 |
5 files changed, 69 insertions, 0 deletions
@@ -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 @@ -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"); + } +} |