]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Improve handling of dynamic signal parameters
authorJuerg Billeter <j@bitron.ch>
Wed, 28 May 2008 17:41:50 +0000 (17:41 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Wed, 28 May 2008 17:41:50 +0000 (17:41 +0000)
2008-05-28  Juerg Billeter  <j@bitron.ch>

* vala/valasemanticanalyzer.vala:
* vala/valasignal.vala:
* gobject/valaccodeassignmentbinding.vala:
* gobject/valaccodedynamicsignalbinding.vala:

Improve handling of dynamic signal parameters

svn path=/trunk/; revision=1465

ChangeLog
gobject/valaccodeassignmentbinding.vala
gobject/valaccodedynamicsignalbinding.vala
vala/valasemanticanalyzer.vala
vala/valasignal.vala

index aee0ae501d5b931baa8bb986843732c01bbf81aa..a3044023761540df3a858eb4ccb40227e70357f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+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:
index fb42a176f53ee5cf03bbb5dad7cdf70af66cccf7..94138e9c5d48e248fa6499bb7f1d3b9552291e64 100644 (file)
@@ -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
index 0a6370ffc8e5fedeb2d95a1f20fc59b33f8f1875..a2ce613aa48c9538706621021241b4da7afb0ce2 100644 (file)
@@ -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
index d06b11f260815c6d58c32db57cb2f78cce2e9386..765ee3983737f4d2faf0f19c4b769f7e556f2617 100644 (file)
@@ -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;
 
index 2d2e27fb0c70f9863bf51656cd14a2597fec9847..bcc27212ceceae793d19af635426e14e195b87ec 100644 (file)
@@ -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) {