[vala/emit-let: 2/4] Fix capturing delegate parameters in async method.



commit 97746bb7ff286de715cbc029557c8cb3d9d14a74
Author: Luca Bruno <lucabru src gnome org>
Date:   Sun Jan 16 01:42:51 2011 +0100

    Fix capturing delegate parameters in async method.
    
    Fixes bug 639591.

 codegen/valaccodebasemodule.vala  |   14 ++++++++++++--
 codegen/valagasyncmodule.vala     |    4 +++-
 tests/Makefile.am                 |    1 +
 tests/asynchronous/bug639591.vala |   10 ++++++++++
 4 files changed, 26 insertions(+), 3 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index cc8791a..fd37a2a 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1681,11 +1681,21 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 				ccode.add_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_array_length_cname (get_variable_cname (param.name), dim)), new CCodeIdentifier (get_array_length_cname (get_variable_cname (param.name), dim))));
 			}
 		} else if (param.variable_type is DelegateType) {
+			CCodeExpression target_expr;
+			CCodeExpression delegate_target_destroy_notify;
+			if (current_method != null && current_method.coroutine) {
+				target_expr = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (param.name)));
+				delegate_target_destroy_notify = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+			} else {
+				target_expr = new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (param.name)));
+				delegate_target_destroy_notify = new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
+			}
+
 			data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (param.name)));
-			ccode.add_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_delegate_target_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (param.name)))));
+			ccode.add_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_delegate_target_cname (get_variable_cname (param.name))), target_expr));
 			if (param.variable_type.value_owned) {
 				data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
-				ccode.add_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)))));
+				ccode.add_expression (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), delegate_target_destroy_notify));
 			}
 		}
 
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index 18b5238..12d6b1d 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -101,10 +101,12 @@ public class Vala.GAsyncModule : GSignalModule {
 
 		foreach (Parameter param in m.get_parameters ()) {
 			if (param.direction != ParameterDirection.OUT) {
+				bool is_unowned_delegate = param.variable_type is DelegateType && !param.variable_type.value_owned;
+
 				var param_type = param.variable_type.copy ();
 				param_type.value_owned = true;
 
-				if (requires_destroy (param_type)) {
+				if (requires_destroy (param_type) && !is_unowned_delegate) {
 					var ma = new MemberAccess.simple (param.name);
 					ma.symbol_reference = param;
 					ma.value_type = param.variable_type.copy ();
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e4bbbe1..fdc6702 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -89,6 +89,7 @@ TESTS = \
 	asynchronous/bug601558.vala \
 	asynchronous/bug613484.vala \
 	asynchronous/bug620740.vala \
+	asynchronous/bug639591.vala \
 	dbus/basic-types.test \
 	dbus/arrays.test \
 	dbus/structs.test \
diff --git a/tests/asynchronous/bug639591.vala b/tests/asynchronous/bug639591.vala
new file mode 100755
index 0000000..1c92edb
--- /dev/null
+++ b/tests/asynchronous/bug639591.vala
@@ -0,0 +1,10 @@
+delegate void Deleg ();
+
+async void foo (Deleg deleg)
+{
+	Deleg d = () => { deleg (); };
+	d = null;
+}
+
+void main() {
+}



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