]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support using GClosure for delegate parameters
authorJürg Billeter <j@bitron.ch>
Mon, 28 Jun 2010 21:32:07 +0000 (23:32 +0200)
committerJürg Billeter <j@bitron.ch>
Mon, 28 Jun 2010 21:32:07 +0000 (23:32 +0200)
codegen/valaccodemethodcallmodule.vala

index e6218fa8a9fd4c4ab8b49400b0e12e3c1b56cb8f..85816eeeba115d97b612b15f9ec012bddfa630ef 100644 (file)
@@ -387,11 +387,20 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                                if (d.has_target) {
                                                        CCodeExpression delegate_target_destroy_notify;
                                                        var delegate_target = get_delegate_target_cexpression (arg, out delegate_target_destroy_notify);
-                                                       carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), delegate_target);
-                                                       if (deleg_type.value_owned) {
-                                                               carg_map.set (get_param_pos (param.cdelegate_target_parameter_position + 0.01), delegate_target_destroy_notify);
+                                                       if (param.ctype == "GClosure*") {
+                                                               // one single GClosure parameter
+                                                               var closure_new = new CCodeFunctionCall (new CCodeIdentifier ("g_cclosure_new"));
+                                                               closure_new.add_argument (new CCodeCastExpression (cexpr, "GCallback"));
+                                                               closure_new.add_argument (delegate_target);
+                                                               closure_new.add_argument (delegate_target_destroy_notify);
+                                                               cexpr = closure_new;
+                                                       } else {
+                                                               carg_map.set (get_param_pos (param.cdelegate_target_parameter_position), delegate_target);
+                                                               if (deleg_type.value_owned) {
+                                                                       carg_map.set (get_param_pos (param.cdelegate_target_parameter_position + 0.01), delegate_target_destroy_notify);
+                                                               }
+                                                               multiple_cargs = true;
                                                        }
-                                                       multiple_cargs = true;
                                                }
                                        } else if (param.parameter_type is MethodType) {
                                                // callbacks in dynamic method calls