From: Jürg Billeter Date: Mon, 28 Jun 2010 21:32:07 +0000 (+0200) Subject: Support using GClosure for delegate parameters X-Git-Tag: 0.9.3~77 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd46d7fe19b7926adf7d1118810abca3a0c49e76;p=thirdparty%2Fvala.git Support using GClosure for delegate parameters --- diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index e6218fa8a..85816eeeb 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -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