]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Make sender parameter in signal handlers optional
authorJürg Billeter <j@bitron.ch>
Fri, 3 Apr 2009 10:15:37 +0000 (12:15 +0200)
committerJürg Billeter <j@bitron.ch>
Fri, 3 Apr 2009 10:15:37 +0000 (12:15 +0200)
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
vala/valadelegate.vala
vala/valalambdaexpression.vala
vala/valasignal.vala

index f7fae0ede74cc606974f1e563845c8bfa7de259e..2d579f4da0043b85058ded731fc1cc5e4aebbe62 100644 (file)
@@ -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);
index 1e708a2296d6515dfdd8afeb0ebeb9231bbb9e85..173fe04c733bf2e8ff66304186cab32f7be1fe74 100644 (file)
@@ -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
index 37c5fb7e2ad4bbf118e611f7332dea09b56606e3..1dded79b783e548643f6f4d8d0af734e753b51d3 100644 (file)
@@ -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);
                }
 
index 6e8e785d54fb7a161a7e005580f56b81de4c75aa..1059cb946c03285c59a1fe5dfca90f3b45a38cd8 100644 (file)
@@ -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 ();