From: Jürg Billeter Date: Thu, 20 Jan 2011 12:38:15 +0000 (+0100) Subject: GAsync: Fix capturing parameters in async methods X-Git-Tag: 0.11.5~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=899afd89566db287450a4451364aa67c5bfbce7b;p=thirdparty%2Fvala.git GAsync: Fix capturing parameters in async methods --- diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala index d4ce037ab..997181793 100644 --- a/codegen/valagasyncmodule.vala +++ b/codegen/valagasyncmodule.vala @@ -107,7 +107,13 @@ public class Vala.GAsyncModule : GSignalModule { param_type.value_owned = true; if (requires_destroy (param_type) && !is_unowned_delegate) { + // do not try to access closure blocks + bool old_captured = param.captured; + param.captured = false; + freeblock.add_statement (new CCodeExpressionStatement (get_unref_expression_ (param))); + + param.captured = old_captured; } } } diff --git a/tests/asynchronous/closures.vala b/tests/asynchronous/closures.vala index 79b020a19..791010c92 100644 --- a/tests/asynchronous/closures.vala +++ b/tests/asynchronous/closures.vala @@ -2,10 +2,10 @@ delegate void Func (); MainLoop main_loop; -async void foo () { +async void foo (string baz) { string bar = "hello"; Func foobar = () => { - bar = "world"; + bar = baz; }; foobar (); assert (bar == "world"); @@ -17,7 +17,7 @@ async void foo () { } void main () { - foo.begin (); + foo.begin ("world"); main_loop = new MainLoop (null, false); main_loop.run ();