[vala] Make sender parameter in signal handlers optional



commit b5b0a8a75a07d5ffe5044e09e3f54feb39c9b923
Author: Jürg Billeter <j bitron ch>
Date:   Fri Apr 3 12:15:37 2009 +0200

    Make sender parameter in signal handlers optional
    
    Signal handler should not need to know the sender. This also makes it
    possible to use the exact same parameter list for signal declaration
    and signal handler.
---
 gobject/valaccodedelegatemodule.vala |   15 +++++++++++++++
 vala/valadelegate.vala               |   14 ++++++++++++++
 vala/valalambdaexpression.vala       |   12 ++++++++++--
 vala/valasignal.vala                 |    3 +--
 4 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/gobject/valaccodedelegatemodule.vala b/gobject/valaccodedelegatemodule.vala
index f7fae0e..2d579f4 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 1e708a2..173fe04 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 37c5fb7..1dded79 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 6e8e785..1059cb9 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 ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]