]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GAsync: Fix async methods with delegate parameters
authorJürg Billeter <j@bitron.ch>
Mon, 5 Oct 2009 16:49:52 +0000 (18:49 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 5 Oct 2009 16:49:52 +0000 (18:49 +0200)
Fixes bug 597294.

codegen/valagasyncmodule.vala
tests/Makefile.am
tests/asynchronous/bug597294.vala [new file with mode: 0644]

index 4fade0daaa2c7595e9b3cc5d87d9d68d93eacd67..6f173447ab9333b055744ac9dff172a08ecf4772 100644 (file)
@@ -53,6 +53,7 @@ internal class Vala.GAsyncModule : GSignalModule {
                                }
                        } else if (param.parameter_type is DelegateType) {
                                data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (param.name)));
+                               data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
                        }
                }
 
@@ -65,6 +66,7 @@ internal class Vala.GAsyncModule : GSignalModule {
                                }
                        } else if (m.return_type is DelegateType) {
                                data.add_field ("gpointer", get_delegate_target_cname ("result"));
+                               data.add_field ("GDestroyNotify", get_delegate_target_destroy_notify_cname ("result"));
                        }
                }
 
@@ -96,6 +98,7 @@ internal class Vala.GAsyncModule : GSignalModule {
                                if (requires_destroy (param_type)) {
                                        var ma = new MemberAccess.simple (param.name);
                                        ma.symbol_reference = param;
+                                       ma.value_type = param.parameter_type.copy ();
                                        freeblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (param.name)), param.parameter_type, ma)));
                                }
                        }
@@ -206,7 +209,11 @@ internal class Vala.GAsyncModule : GSignalModule {
                                                asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, 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.parameter_type is DelegateType) {
+                                       var deleg_type = (DelegateType) param.parameter_type;
                                        asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_cname (get_variable_cname (param.name))))));
+                                       if (deleg_type.value_owned) {
+                                               asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))), new CCodeIdentifier (get_delegate_target_destroy_notify_cname (get_variable_cname (param.name))))));
+                                       }
                                }
                        }
                }
index 8f704db24b18e7cea651269bf4bc9c7690c76b97..e9be7e8e9938d4ef430f91212fc51f5da8f81e1c 100644 (file)
@@ -62,6 +62,7 @@ TESTS = \
        asynchronous/bug595735.vala \
        asynchronous/bug595755.vala \
        asynchronous/bug596177.vala \
+       asynchronous/bug597294.vala \
        dbus/basic-types.test \
        dbus/arrays.test \
        dbus/async.test \
diff --git a/tests/asynchronous/bug597294.vala b/tests/asynchronous/bug597294.vala
new file mode 100644 (file)
index 0000000..92a04bf
--- /dev/null
@@ -0,0 +1,8 @@
+delegate void Foo ();
+
+async void do_foo (Foo f) {
+       f ();
+}
+
+void main () {
+}