summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2019-01-31 20:09:07 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-02-03 14:17:36 +0100
commit056daaae8131f1e3b1759c4d08ba890ce501097e (patch)
treee69c218a10d10d3d392fc8c6a87e39143a01f250
parent57fa049a08a92b5c1030b17be6a50cf393fc7ed3 (diff)
downloadvala-056daaae8131f1e3b1759c4d08ba890ce501097e.tar.gz
codegen: Pass lambda expression of variable initializer to signal connect
-rw-r--r--codegen/valagsignalmodule.vala11
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/objects/signals-lambda-delegate.vala39
3 files changed, 47 insertions, 4 deletions
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala
index 3d0d19c2c..80f02f849 100644
--- a/codegen/valagsignalmodule.vala
+++ b/codegen/valagsignalmodule.vala
@@ -595,11 +595,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;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 27f18f030..cfbe1f4a6 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -287,6 +287,7 @@ TESTS = \
objects/signals.vala \
objects/signals-delegate.vala \
objects/signals-delegate-parameter.vala \
+ objects/signals-lambda-delegate.vala \
objects/singleton.vala \
objects/test-025.vala \
objects/test-026.vala \
diff --git a/tests/objects/signals-lambda-delegate.vala b/tests/objects/signals-lambda-delegate.vala
new file mode 100644
index 000000000..5a8a34368
--- /dev/null
+++ b/tests/objects/signals-lambda-delegate.vala
@@ -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);
+ }
+}