[vala] GAsync: Fix capturing parameters in async methods



commit 899afd89566db287450a4451364aa67c5bfbce7b
Author: Jürg Billeter <j bitron ch>
Date:   Thu Jan 20 13:38:15 2011 +0100

    GAsync: Fix capturing parameters in async methods

 codegen/valagasyncmodule.vala    |    6 ++++++
 tests/asynchronous/closures.vala |    6 +++---
 2 files changed, 9 insertions(+), 3 deletions(-)
---
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index d4ce037..9971817 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 79b020a..791010c 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 ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]