diff options
-rw-r--r-- | gobject/valaccodedelegatemodule.vala | 15 | ||||
-rw-r--r-- | vala/valadelegate.vala | 14 | ||||
-rw-r--r-- | vala/valalambdaexpression.vala | 12 | ||||
-rw-r--r-- | vala/valasignal.vala | 3 |
4 files changed, 40 insertions, 4 deletions
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<FormalParameter> 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<string> 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 (); |