+2008-05-28 Jürg Billeter <j@bitron.ch>
+
+ * vala/valasemanticanalyzer.vala:
+ * vala/valasignal.vala:
+ * gobject/valaccodeassignmentbinding.vala:
+ * gobject/valaccodedynamicsignalbinding.vala:
+
+ Improve handling of dynamic signal parameters
+
2008-05-28 Jürg Billeter <j@bitron.ch>
* vala/valacodecontext.vala:
var cparam = new CCodeFormalParameter ("self", "gpointer");
cparam_map.set (codegen.get_param_pos (-1), cparam);
- if (sig is DynamicSignal) {
- foreach (FormalParameter param in m.get_parameters()) {
- // ensure that C code node has been generated
- param.accept (codegen);
-
- cparam_map.set (codegen.get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
- }
- } else {
- cparam = new CCodeFormalParameter ("sender", ((TypeSymbol) sig.parent_symbol).get_cname () + "*");
- cparam_map.set (codegen.get_param_pos (0), cparam);
- foreach (FormalParameter param in sig.get_parameters()) {
- // ensure that C code node has been generated
- param.accept (codegen);
+ cparam = new CCodeFormalParameter ("_sender", ((TypeSymbol) sig.parent_symbol).get_cname () + "*");
+ cparam_map.set (codegen.get_param_pos (0), cparam);
+ foreach (FormalParameter param in sig.get_parameters()) {
+ // ensure that C code node has been generated
+ param.accept (codegen);
- cparam_map.set (codegen.get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
- }
+ cparam_map.set (codegen.get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
}
// append C parameters in the right order
carg_map.set (codegen.get_param_pos (m.cinstance_parameter_position), new CCodeIdentifier ("self"));
}
- if (sig is DynamicSignal) {
- foreach (FormalParameter param in m.get_parameters ()) {
- CCodeExpression arg;
- arg = new CCodeIdentifier ((param.ccodenode as CCodeFormalParameter).name);
- carg_map.set (codegen.get_param_pos (param.cparameter_position), arg);
- }
- } else {
- int i = -1;
- var sig_params = sig.get_parameters ();
- foreach (FormalParameter param in m.get_parameters ()) {
- CCodeExpression arg;
- if (i < 0) {
- arg = new CCodeIdentifier ("sender");
- } else {
- arg = new CCodeIdentifier ((sig_params.get (i).ccodenode as CCodeFormalParameter).name);
- }
- carg_map.set (codegen.get_param_pos (param.cparameter_position), arg);
- i++;
+ int i = -1;
+ var sig_params = sig.get_parameters ();
+ foreach (FormalParameter param in m.get_parameters ()) {
+ CCodeExpression arg;
+ if (i < 0) {
+ arg = new CCodeIdentifier ("_sender");
+ } else {
+ arg = new CCodeIdentifier ((sig_params.get (i).ccodenode as CCodeFormalParameter).name);
}
- }
+ carg_map.set (codegen.get_param_pos (param.cparameter_position), arg);
+ i++;
+ }
var ccall = new CCodeFunctionCall (new CCodeIdentifier (m.get_cname ()));
// append C arguments in the right order
return;
}
- if (ma.symbol_reference is Signal) {
+ if (ma.symbol_reference is DynamicSignal) {
+ // target_type not available for dynamic signals
+ } else if (ma.symbol_reference is Signal) {
var sig = (Signal) ma.symbol_reference;
- var deleg = sig.get_delegate ();
- if (deleg != null) {
- a.right.target_type = new DelegateType (deleg);
- }
+ a.right.target_type = new DelegateType (sig.get_delegate ());
} else {
a.right.target_type = ma.value_type;
}
Report.error (a.right.source_reference, "unsupported expression for signal handler");
return;
}
+
+ var dynamic_sig = sig as DynamicSignal;
+ if (dynamic_sig != null) {
+ bool first = true;
+ foreach (FormalParameter param in dynamic_sig.handler.value_type.get_parameters ()) {
+ if (first) {
+ // skip sender parameter
+ first = false;
+ } else {
+ dynamic_sig.add_parameter (param);
+ }
+ }
+ a.right.target_type = new DelegateType (sig.get_delegate ());
+ }
} else if (ma.symbol_reference is Property) {
var prop = (Property) ma.symbol_reference;