[vala/emit-let: 1/10] Fix capturing delegate parameters in async method.
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/emit-let: 1/10] Fix capturing delegate parameters in async method.
- Date: Wed, 19 Jan 2011 12:38:43 +0000 (UTC)
commit edd1a0fb91ee532e5619efefc28c453e4209c4a5
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 052e51d..23fa8e5 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]