From: Jürg Billeter Date: Fri, 3 Apr 2009 10:15:37 +0000 (+0200) Subject: Make sender parameter in signal handlers optional X-Git-Tag: 0.7.0~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5b0a8a75a07d5ffe5044e09e3f54feb39c9b923;p=thirdparty%2Fvala.git Make sender parameter in signal handlers optional Signal handler should not need to know the sender. This also makes it possible to use the exact same parameter list for signal declaration and signal handler. --- diff --git a/gobject/valaccodedelegatemodule.vala b/gobject/valaccodedelegatemodule.vala index f7fae0ede..2d579f4da 100644 --- a/gobject/valaccodedelegatemodule.vala +++ b/gobject/valaccodedelegatemodule.vala @@ -239,6 +239,11 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule { cparam_map.set (get_param_pos (d.cinstance_parameter_position), cparam); } + if (d.sender_type != null) { + var param = new FormalParameter ("_sender", d.sender_type); + generate_parameter (param, source_declarations, cparam_map, null); + } + var d_params = d.get_parameters (); foreach (FormalParameter param in d_params) { generate_parameter (param, source_declarations, cparam_map, null); @@ -293,7 +298,17 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule { carg_map.set (get_param_pos (m.cinstance_parameter_position), arg); } + bool first = true; + foreach (FormalParameter param in m.get_parameters ()) { + if (first && d.sender_type != null && m.get_parameters ().size == d.get_parameters ().size + 1) { + // sender parameter + carg_map.set (get_param_pos (param.cparameter_position), new CCodeIdentifier ("_sender")); + + first = false; + continue; + } + CCodeExpression arg; arg = new CCodeIdentifier ((d_params.get (i).ccodenode as CCodeFormalParameter).name); carg_map.set (get_param_pos (param.cparameter_position), arg); diff --git a/vala/valadelegate.vala b/vala/valadelegate.vala index 1e708a229..173fe04c7 100644 --- a/vala/valadelegate.vala +++ b/vala/valadelegate.vala @@ -45,6 +45,8 @@ public class Vala.Delegate : TypeSymbol { */ public bool has_target { get; set; } + public DataType? sender_type { get; set; } + /** * Specifies the position of the instance parameter in the C function. */ @@ -148,6 +150,18 @@ public class Vala.Delegate : TypeSymbol { var method_params = m.get_parameters (); Iterator method_params_it = method_params.iterator (); + + if (sender_type != null && method_params.size == parameters.size + 1) { + // method has sender parameter + method_params_it.next (); + + // method is allowed to accept arguments of looser types (weaker precondition) + var method_param = method_params_it.get (); + if (!sender_type.stricter (method_param.parameter_type)) { + return false; + } + } + bool first = true; foreach (FormalParameter param in parameters) { /* use first callback parameter as instance parameter if diff --git a/vala/valalambdaexpression.vala b/vala/valalambdaexpression.vala index 37c5fb7e2..1dded79b7 100644 --- a/vala/valalambdaexpression.vala +++ b/vala/valalambdaexpression.vala @@ -161,6 +161,16 @@ public class Vala.LambdaExpression : Expression { var lambda_params = get_parameters (); Iterator lambda_param_it = lambda_params.iterator (); + + if (cb.sender_type != null && lambda_params.size == cb.get_parameters ().size + 1) { + // lambda expression has sender parameter + lambda_param_it.next (); + + string lambda_param = lambda_param_it.get (); + var param = new FormalParameter (lambda_param, cb.sender_type); + method.add_parameter (param); + } + foreach (FormalParameter cb_param in cb.get_parameters ()) { if (!lambda_param_it.next ()) { /* lambda expressions are allowed to have less parameters */ @@ -168,9 +178,7 @@ public class Vala.LambdaExpression : Expression { } string lambda_param = lambda_param_it.get (); - var param = new FormalParameter (lambda_param, cb_param.parameter_type); - method.add_parameter (param); } diff --git a/vala/valasignal.vala b/vala/valasignal.vala index 6e8e785d5..1059cb946 100644 --- a/vala/valasignal.vala +++ b/vala/valasignal.vala @@ -105,8 +105,7 @@ public class Vala.Signal : Member, Lockable { sender_param_type.value_owned = false; sender_param_type.nullable = false; - var sender_param = new FormalParameter ("_sender", sender_param_type); - generated_delegate.add_parameter (sender_param); + generated_delegate.sender_type = sender_param_type; foreach (FormalParameter param in parameters) { var actual_param = param.copy ();