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);
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);
*/
public bool has_target { get; set; }
+ public DataType? sender_type { get; set; }
+
/**
* Specifies the position of the instance parameter in the C function.
*/
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
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 */
}
string lambda_param = lambda_param_it.get ();
-
var param = new FormalParameter (lambda_param, cb_param.parameter_type);
-
method.add_parameter (param);
}
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 ();