]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support emitting signals with return values, patch by Samuel
authorJürg Billeter <j@bitron.ch>
Sun, 15 Jun 2008 21:29:51 +0000 (21:29 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sun, 15 Jun 2008 21:29:51 +0000 (21:29 +0000)
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

ChangeLog
THANKS
gobject/valaccodeinvocationexpressionbinding.vala
tests/classes-signals.exp
tests/classes-signals.vala

index 170a592dd0ce9ceb55aa04ee356ec19b8f8a6343..63c4e7c1b63823452b6e461a96c3fd8defeb120c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+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:
diff --git a/THANKS b/THANKS
index 71e91d037ddd676ced34d617b8507ed69271e69c..1bd2456503e784bdaaeb5b1a32e14cd20ea6f3f3 100644 (file)
--- 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
index c5004050bc9f3bb66acff17394696bc50e42ae68..195b53395658486ddb05897899e1ebda4425738f 100644 (file)
@@ -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;
index c42d7ec3cc7803b2874467312c54d96ab77dd958..ec783ec45ab5349ef41e9f576173e369ca1c6e34 100644 (file)
@@ -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
index 555339f1b2979479216591f86300468c22420993..52b4b25388e65ac2eeb6da01cf19729df2b6a095 100644 (file)
@@ -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");
+       }
+}