]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix delegate out parameters
authorLevi Bard <taktaktaktaktaktaktaktaktaktak@gmail.com>
Thu, 7 May 2009 13:59:22 +0000 (15:59 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 7 May 2009 14:00:24 +0000 (16:00 +0200)
Fixes bug 578412.

gobject/valaccodedelegatemodule.vala
tests/delegates/delegates.test

index 1eab032ab0436a9993817a3132b9056971a973a2..79752047fd071f29d285ef0a71033ca545655218 100644 (file)
@@ -400,9 +400,11 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                }
 
                string ctypename = param.parameter_type.get_cname ();
+               string target_ctypename = "void*";
 
                if (param.direction != ParameterDirection.IN) {
                        ctypename += "*";
+                       target_ctypename += "*";
                }
 
                param.ccodenode = new CCodeFormalParameter (get_variable_cname (param.name), ctypename);
@@ -419,7 +421,7 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                        generate_delegate_declaration (d, decl_space);
 
                        if (d.has_target) {
-                               var cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), "void*");
+                               var cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), target_ctypename);
                                cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position), cparam);
                                if (carg_map != null) {
                                        carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), get_variable_cexpression (cparam.name));
@@ -433,7 +435,7 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
                                }
                        }
                } else if (param.parameter_type is MethodType) {
-                       var cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), "void*");
+                       var cparam = new CCodeFormalParameter (get_delegate_target_cname (get_variable_cname (param.name)), target_ctypename);
                        cparam_map.set (get_param_pos (param.cdelegate_target_parameter_position), cparam);
                        if (carg_map != null) {
                                carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), get_variable_cexpression (cparam.name));
index 504ff0824a61ff164f11f3ea253721a6ab731fa5..0885f3ee941352ef29d1e460d0497591219f7029 100644 (file)
@@ -41,6 +41,10 @@ class Maman.Bar : Object, Foo {
                instance_cb (42);
        }
 
+       void assign_instance_delegate (out InstanceCallback instance_cb) {
+               instance_cb = foo_method;
+       }
+
        static void test_function_pointers () {
                stdout.printf ("testing function pointers:");
                var table = new HashTable<string, Bar>.full (str_hash, str_equal, g_free, Object.unref);
@@ -82,6 +86,9 @@ class Maman.Bar : Object, Foo {
                InstanceCallback instance_cb = bar.do_instance_action;
                call_instance_delegate (instance_cb);
 
+               bar.assign_instance_delegate (out instance_cb);
+               call_instance_delegate (instance_cb);
+
                stdout.printf (" 7\n");
 
                test_function_pointers ();