summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gobject/valaccodedelegatemodule.vala15
-rw-r--r--vala/valadelegate.vala14
-rw-r--r--vala/valalambdaexpression.vala12
-rw-r--r--vala/valasignal.vala3
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 ();