]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Pass lambda expression of variable initializer to signal connect
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 31 Jan 2019 19:09:07 +0000 (20:09 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 26 Feb 2019 16:53:41 +0000 (17:53 +0100)
codegen/valagsignalmodule.vala
tests/Makefile.am
tests/objects/signals-lambda-delegate.vala [new file with mode: 0644]

index f9a3b9faff9a392d1b46741c1aa02dce7474caad..fd1a1129d8c1d794b0c6d18bdad2ea33eeb1aa6c 100644 (file)
@@ -606,11 +606,14 @@ public class Vala.GSignalModule : GObjectModule {
                string connect_func;
 
                DelegateType? dt = null;
-               var p = handler.symbol_reference as Parameter;
-               if (p != null) {
-                       dt = p.variable_type as DelegateType;
+               if (handler.symbol_reference is Variable) {
+                       dt = ((Variable) handler.symbol_reference).variable_type as DelegateType;
                        if (dt != null && !context.experimental) {
-                               Report.warning (dt.source_reference, "Connecting delegates to signals is experimental");
+                               Report.warning (handler.source_reference, "Connecting delegates to signals is experimental");
+                       }
+                       // Use actual lambda expression if available for proper target/destroy handling
+                       if (((Variable) handler.symbol_reference).initializer is LambdaExpression) {
+                               handler = ((Variable) handler.symbol_reference).initializer;
                        }
                }
                var m = handler.symbol_reference as Method;
index fe5aa20ae62bdbe784e90c40d25acf68ad2dc4e8..b44a03fe0f946e84643a51ee4f9241fbe8e2adab 100644 (file)
@@ -271,6 +271,7 @@ TESTS = \
        objects/regex.vala \
        objects/signals.vala \
        objects/signals-delegate.vala \
+       objects/signals-lambda-delegate.vala \
        objects/test-025.vala \
        objects/test-026.vala \
        objects/test-029.vala \
diff --git a/tests/objects/signals-lambda-delegate.vala b/tests/objects/signals-lambda-delegate.vala
new file mode 100644 (file)
index 0000000..5a8a343
--- /dev/null
@@ -0,0 +1,39 @@
+class Foo : Object {
+       public signal void bar (string s);
+       public signal void baz (string s);
+}
+
+delegate void FooFunc (Foo foo, string s);
+
+void main () {
+       var foo = new Foo ();
+       ulong bar_id = 0U;
+       ulong baz_id = 0U;
+       {
+               FooFunc callback = (f,s) => {
+                       assert (s == "bar" || s == "baz");
+
+                       if (s == "bar") {
+                               assert (bar_id > 0U);
+                               f.disconnect (bar_id);
+                               bar_id = 0U;
+                       }
+
+                       if (s == "baz") {
+                               assert (baz_id > 0U);
+                               f.disconnect (baz_id);
+                               baz_id = 0U;
+                       }
+               };
+
+               bar_id = foo.bar.connect (callback);
+               baz_id = foo.baz.connect (callback);
+       }
+       {
+               foo.bar ("bar");
+               assert (bar_id == 0U);
+
+               foo.baz ("baz");
+               assert (baz_id == 0U);
+       }
+}