From: Juerg Billeter Date: Wed, 28 May 2008 17:41:50 +0000 (+0000) Subject: Improve handling of dynamic signal parameters X-Git-Tag: VALA_0_3_3~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=28112e28007fc750abec5452b41e96fe2a07e86d;p=thirdparty%2Fvala.git Improve handling of dynamic signal parameters 2008-05-28 Juerg Billeter * vala/valasemanticanalyzer.vala: * vala/valasignal.vala: * gobject/valaccodeassignmentbinding.vala: * gobject/valaccodedynamicsignalbinding.vala: Improve handling of dynamic signal parameters svn path=/trunk/; revision=1465 --- diff --git a/ChangeLog b/ChangeLog index aee0ae501..a30440237 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-05-28 Jürg Billeter + + * vala/valasemanticanalyzer.vala: + * vala/valasignal.vala: + * gobject/valaccodeassignmentbinding.vala: + * gobject/valaccodedynamicsignalbinding.vala: + + Improve handling of dynamic signal parameters + 2008-05-28 Jürg Billeter * vala/valacodecontext.vala: diff --git a/gobject/valaccodeassignmentbinding.vala b/gobject/valaccodeassignmentbinding.vala index fb42a176f..94138e9c5 100644 --- a/gobject/valaccodeassignmentbinding.vala +++ b/gobject/valaccodeassignmentbinding.vala @@ -236,22 +236,13 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding { 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 @@ -280,26 +271,18 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding { 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 diff --git a/gobject/valaccodedynamicsignalbinding.vala b/gobject/valaccodedynamicsignalbinding.vala index 0a6370ffc..a2ce613aa 100644 --- a/gobject/valaccodedynamicsignalbinding.vala +++ b/gobject/valaccodedynamicsignalbinding.vala @@ -107,16 +107,6 @@ public class Vala.CCodeDynamicSignalBinding : CCodeBinding { var m = (Method) dynamic_signal.handler.symbol_reference; - bool first = true; - foreach (FormalParameter param in m.get_parameters ()) { - if (first) { - // skip sender parameter - first = false; - continue; - } - node.add_parameter (param.copy ()); - } - node.accept (codegen); // FIXME should only be done once per marshaller @@ -128,7 +118,7 @@ public class Vala.CCodeDynamicSignalBinding : CCodeBinding { add_call.add_argument (new CCodeIdentifier ("obj")); add_call.add_argument (new CCodeConstant ("\"%s\"".printf (node.name))); - first = true; + bool first = true; foreach (FormalParameter param in m.get_parameters ()) { if (first) { // skip sender parameter diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index d06b11f26..765ee3983 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -3009,12 +3009,11 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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; } @@ -3088,6 +3087,20 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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; diff --git a/vala/valasignal.vala b/vala/valasignal.vala index 2d2e27fb0..bcc27212c 100644 --- a/vala/valasignal.vala +++ b/vala/valasignal.vala @@ -102,7 +102,7 @@ public class Vala.Signal : Member, Lockable { } else { sender_type = new ObjectType ((Interface) parent_symbol); } - var sender_param = new FormalParameter ("sender", sender_type); + var sender_param = new FormalParameter ("_sender", sender_type); generated_delegate.add_parameter (sender_param); foreach (FormalParameter param in parameters) {