]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix capturing delegate parameters in async method.
authorLuca Bruno <lucabru@src.gnome.org>
Sun, 16 Jan 2011 00:42:51 +0000 (01:42 +0100)
committerJürg Billeter <j@bitron.ch>
Wed, 19 Jan 2011 18:27:48 +0000 (19:27 +0100)
Fixes bug 639591.

codegen/valaccodebasemodule.vala
codegen/valagasyncmodule.vala
tests/Makefile.am
tests/asynchronous/bug639591.vala [new file with mode: 0755]

index 052e51d70b066e4d42903c866c71149cf6efda24..23fa8e5ba99592b3f72c0203e454408874f54b42 100644 (file)
@@ -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));
                        }
                }
 
index 18b5238d5582c6504a891edceaf0d6138589f908..12d6b1dad9c6b1d1efc26374eb7f038c54bbf373 100644 (file)
@@ -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 ();
index e4bbbe10f0f8bd45d56a8a03ec6151169fd3fcef..fdc67028b14e66921aeb33dfe2cf10e359993f0a 100644 (file)
@@ -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 (executable)
index 0000000..1c92edb
--- /dev/null
@@ -0,0 +1,10 @@
+delegate void Deleg ();
+
+async void foo (Deleg deleg)
+{
+       Deleg d = () => { deleg (); };
+       d = null;
+}
+
+void main() {
+}