]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Move signal connection and disconnection to GSignalModule
authorJürg Billeter <j@bitron.ch>
Tue, 4 Nov 2008 17:15:37 +0000 (17:15 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Tue, 4 Nov 2008 17:15:37 +0000 (17:15 +0000)
2008-11-04  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodeassignmentmodule.vala:
* gobject/valagsignalmodule.vala:

Move signal connection and disconnection to GSignalModule

svn path=/trunk/; revision=1975

ChangeLog
gobject/valaccodeassignmentmodule.vala
gobject/valagsignalmodule.vala

index 6f056c7a66226ea5018946b1d9cca8cdcee669e3..f148b735ffe38c7fa60883b0e9e26db31820eb3a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-04  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodeassignmentmodule.vala:
+       * gobject/valagsignalmodule.vala:
+
+       Move signal connection and disconnection to GSignalModule
+
 2008-11-04  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodearraymodule.vala:
index b25b1688e8095847046c3db415019059c204e369..c1e6a3f587051afb72096957a6f1e6e6af17008a 100644 (file)
@@ -89,145 +89,6 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
                }
        }
 
-       CCodeExpression? emit_signal_assignment (Assignment assignment) {
-               var sig = (Signal) assignment.left.symbol_reference;
-               
-               var m = (Method) assignment.right.symbol_reference;
-
-               string connect_func;
-               bool disconnect = false;
-
-               if (assignment.operator == AssignmentOperator.ADD) {
-                       if (sig is DynamicSignal) {
-                               connect_func = head.get_dynamic_signal_connect_wrapper_name ((DynamicSignal) sig);
-                       } else {
-                               connect_func = "g_signal_connect_object";
-                               if (m.binding != MemberBinding.INSTANCE) {
-                                       connect_func = "g_signal_connect";
-                               }
-                       }
-               } else if (assignment.operator == AssignmentOperator.SUB) {
-                       if (sig is DynamicSignal) {
-                               connect_func = head.get_dynamic_signal_disconnect_wrapper_name ((DynamicSignal) sig);
-                       } else {
-                               connect_func = "g_signal_handlers_disconnect_matched";
-                       }
-                       disconnect = true;
-               } else {
-                       assignment.error = true;
-                       Report.error (assignment.source_reference, "Specified compound assignment type for signals not supported.");
-                       return null;
-               }
-
-               var ccall = new CCodeFunctionCall (new CCodeIdentifier (connect_func));
-
-               string signal_detail = null;
-
-               // first argument: instance of sender
-               MemberAccess ma;
-               if (assignment.left is ElementAccess) {
-                       var ea = (ElementAccess) assignment.left;
-                       ma = (MemberAccess) ea.container;
-                       var detail_expr = ea.get_indices ().get (0) as StringLiteral;
-                       if (detail_expr == null) {
-                               assignment.error = true;
-                               Report.error (detail_expr.source_reference, "internal error: only literal string details supported");
-                               return null;
-                       }
-                       signal_detail = detail_expr.eval ();
-               } else {
-                       ma = (MemberAccess) assignment.left;
-               }
-               if (ma.inner != null) {
-                       ccall.add_argument ((CCodeExpression) get_ccodenode (ma.inner));
-               } else {
-                       ccall.add_argument (new CCodeIdentifier ("self"));
-               }
-
-               if (sig is DynamicSignal) {
-                       // dynamic_signal_connect or dynamic_signal_disconnect
-
-                       // second argument: signal name
-                       ccall.add_argument (new CCodeConstant ("\"%s\"".printf (sig.name)));
-               } else if (!disconnect) {
-                       // g_signal_connect_object or g_signal_connect
-
-                       // second argument: signal name
-                       ccall.add_argument (sig.get_canonical_cconstant (signal_detail));
-               } else {
-                       // g_signal_handlers_disconnect_matched
-
-                       // second argument: mask
-                       if (signal_detail == null) {
-                               ccall.add_argument (new CCodeConstant ("G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA"));
-                       } else {
-                               ccall.add_argument (new CCodeConstant ("G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA"));
-                       }
-
-                       // get signal id
-                       var ccomma = new CCodeCommaExpression ();
-                       var temp_decl = get_temp_variable (uint_type);
-                       temp_vars.insert (0, temp_decl);
-                       var parse_call = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_parse_name"));
-                       parse_call.add_argument (sig.get_canonical_cconstant (signal_detail));
-                       var decl_type = (TypeSymbol) sig.parent_symbol;
-                       parse_call.add_argument (new CCodeIdentifier (decl_type.get_type_id ()));
-                       parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_decl.name)));
-                       if (signal_detail == null) {
-                               parse_call.add_argument (new CCodeConstant ("NULL"));
-                       } else {
-                               var detail_temp_decl = get_temp_variable (gquark_type);
-                               temp_vars.insert (0, detail_temp_decl);
-                               parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (detail_temp_decl.name)));
-                       }
-                       parse_call.add_argument (new CCodeConstant ("FALSE"));
-                       ccomma.append_expression (parse_call);
-                       ccomma.append_expression (new CCodeIdentifier (temp_decl.name));
-
-                       // third argument: signal_id
-                       ccall.add_argument (ccomma);
-
-                       // fourth argument: detail
-                       ccall.add_argument (new CCodeConstant ("0"));
-                       // fifth argument: closure
-                       ccall.add_argument (new CCodeConstant ("NULL"));
-               }
-               
-               // third resp. sixth argument: handler
-               ccall.add_argument (new CCodeCastExpression ((CCodeExpression) assignment.right.ccodenode, "GCallback"));
-
-               if (m.binding == MemberBinding.INSTANCE) {
-                       // g_signal_connect_object or g_signal_handlers_disconnect_matched
-                       // or dynamic_signal_connect or dynamic_signal_disconnect
-
-                       // fourth resp. seventh argument: object/user_data
-                       if (assignment.right is MemberAccess) {
-                               var right_ma = (MemberAccess) assignment.right;
-                               if (right_ma.inner != null) {
-                                       ccall.add_argument ((CCodeExpression) right_ma.inner.ccodenode);
-                               } else {
-                                       ccall.add_argument (new CCodeIdentifier ("self"));
-                               }
-                       } else if (assignment.right is LambdaExpression) {
-                               ccall.add_argument (new CCodeIdentifier ("self"));
-                       }
-                       if (!disconnect && !(sig is DynamicSignal)) {
-                               // g_signal_connect_object
-
-                               // fifth argument: connect_flags
-                               ccall.add_argument (new CCodeConstant ("0"));
-                       }
-               } else {
-                       // g_signal_connect or g_signal_handlers_disconnect_matched
-                       // or dynamic_signal_connect or dynamic_signal_disconnect
-
-                       // fourth resp. seventh argument: user_data
-                       ccall.add_argument (new CCodeConstant ("NULL"));
-               }
-               
-               return ccall;
-       }
-
        private CCodeExpression? emit_non_array_element_access (Assignment assignment) {
                // custom element access
                CCodeExpression rhs = (CCodeExpression) assignment.right.ccodenode;
@@ -373,8 +234,6 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule {
 
                if (assignment.left.symbol_reference is Property) {
                        assignment.ccodenode = emit_property_assignment (assignment);
-               } else if (assignment.left.symbol_reference is Signal) {
-                       assignment.ccodenode = emit_signal_assignment (assignment);
                } else if (assignment.left is ElementAccess
                           && !(((ElementAccess) assignment.left).container.value_type is ArrayType)
                           && !(((ElementAccess) assignment.left).container.value_type is PointerType)) {
index 0bc31c5ecaf44bb58e970eefbe14de12be3a60be..4552aa504dec674d6950cf1c24e98d6eb59c23fb 100644 (file)
@@ -404,5 +404,159 @@ public class Vala.GSignalModule : GObjectModule {
                        base.visit_element_access (expr);
                }
        }
+
+       CCodeExpression? emit_signal_assignment (Assignment assignment) {
+               var sig = (Signal) assignment.left.symbol_reference;
+               
+               var m = (Method) assignment.right.symbol_reference;
+
+               string connect_func;
+               bool disconnect = false;
+
+               if (assignment.operator == AssignmentOperator.ADD) {
+                       if (sig is DynamicSignal) {
+                               connect_func = head.get_dynamic_signal_connect_wrapper_name ((DynamicSignal) sig);
+                       } else {
+                               connect_func = "g_signal_connect_object";
+                               if (m.binding != MemberBinding.INSTANCE) {
+                                       connect_func = "g_signal_connect";
+                               }
+                       }
+               } else if (assignment.operator == AssignmentOperator.SUB) {
+                       if (sig is DynamicSignal) {
+                               connect_func = head.get_dynamic_signal_disconnect_wrapper_name ((DynamicSignal) sig);
+                       } else {
+                               connect_func = "g_signal_handlers_disconnect_matched";
+                       }
+                       disconnect = true;
+               } else {
+                       assignment.error = true;
+                       Report.error (assignment.source_reference, "Specified compound assignment type for signals not supported.");
+                       return null;
+               }
+
+               var ccall = new CCodeFunctionCall (new CCodeIdentifier (connect_func));
+
+               string signal_detail = null;
+
+               // first argument: instance of sender
+               MemberAccess ma;
+               if (assignment.left is ElementAccess) {
+                       var ea = (ElementAccess) assignment.left;
+                       ma = (MemberAccess) ea.container;
+                       var detail_expr = ea.get_indices ().get (0) as StringLiteral;
+                       if (detail_expr == null) {
+                               assignment.error = true;
+                               Report.error (detail_expr.source_reference, "internal error: only literal string details supported");
+                               return null;
+                       }
+                       signal_detail = detail_expr.eval ();
+               } else {
+                       ma = (MemberAccess) assignment.left;
+               }
+               if (ma.inner != null) {
+                       ccall.add_argument ((CCodeExpression) get_ccodenode (ma.inner));
+               } else {
+                       ccall.add_argument (new CCodeIdentifier ("self"));
+               }
+
+               if (sig is DynamicSignal) {
+                       // dynamic_signal_connect or dynamic_signal_disconnect
+
+                       // second argument: signal name
+                       ccall.add_argument (new CCodeConstant ("\"%s\"".printf (sig.name)));
+               } else if (!disconnect) {
+                       // g_signal_connect_object or g_signal_connect
+
+                       // second argument: signal name
+                       ccall.add_argument (sig.get_canonical_cconstant (signal_detail));
+               } else {
+                       // g_signal_handlers_disconnect_matched
+
+                       // second argument: mask
+                       if (signal_detail == null) {
+                               ccall.add_argument (new CCodeConstant ("G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA"));
+                       } else {
+                               ccall.add_argument (new CCodeConstant ("G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA"));
+                       }
+
+                       // get signal id
+                       var ccomma = new CCodeCommaExpression ();
+                       var temp_decl = get_temp_variable (uint_type);
+                       temp_vars.insert (0, temp_decl);
+                       var parse_call = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_parse_name"));
+                       parse_call.add_argument (sig.get_canonical_cconstant (signal_detail));
+                       var decl_type = (TypeSymbol) sig.parent_symbol;
+                       parse_call.add_argument (new CCodeIdentifier (decl_type.get_type_id ()));
+                       parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_decl.name)));
+                       if (signal_detail == null) {
+                               parse_call.add_argument (new CCodeConstant ("NULL"));
+                       } else {
+                               var detail_temp_decl = get_temp_variable (gquark_type);
+                               temp_vars.insert (0, detail_temp_decl);
+                               parse_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (detail_temp_decl.name)));
+                       }
+                       parse_call.add_argument (new CCodeConstant ("FALSE"));
+                       ccomma.append_expression (parse_call);
+                       ccomma.append_expression (new CCodeIdentifier (temp_decl.name));
+
+                       // third argument: signal_id
+                       ccall.add_argument (ccomma);
+
+                       // fourth argument: detail
+                       ccall.add_argument (new CCodeConstant ("0"));
+                       // fifth argument: closure
+                       ccall.add_argument (new CCodeConstant ("NULL"));
+               }
+               
+               // third resp. sixth argument: handler
+               ccall.add_argument (new CCodeCastExpression ((CCodeExpression) assignment.right.ccodenode, "GCallback"));
+
+               if (m.binding == MemberBinding.INSTANCE) {
+                       // g_signal_connect_object or g_signal_handlers_disconnect_matched
+                       // or dynamic_signal_connect or dynamic_signal_disconnect
+
+                       // fourth resp. seventh argument: object/user_data
+                       if (assignment.right is MemberAccess) {
+                               var right_ma = (MemberAccess) assignment.right;
+                               if (right_ma.inner != null) {
+                                       ccall.add_argument ((CCodeExpression) right_ma.inner.ccodenode);
+                               } else {
+                                       ccall.add_argument (new CCodeIdentifier ("self"));
+                               }
+                       } else if (assignment.right is LambdaExpression) {
+                               ccall.add_argument (new CCodeIdentifier ("self"));
+                       }
+                       if (!disconnect && !(sig is DynamicSignal)) {
+                               // g_signal_connect_object
+
+                               // fifth argument: connect_flags
+                               ccall.add_argument (new CCodeConstant ("0"));
+                       }
+               } else {
+                       // g_signal_connect or g_signal_handlers_disconnect_matched
+                       // or dynamic_signal_connect or dynamic_signal_disconnect
+
+                       // fourth resp. seventh argument: user_data
+                       ccall.add_argument (new CCodeConstant ("NULL"));
+               }
+               
+               return ccall;
+       }
+
+       public override void visit_assignment (Assignment assignment) {
+               if (assignment.left.symbol_reference is Signal) {
+                       assignment.right.accept (codegen);
+
+                       if (assignment.left.error || assignment.right.error) {
+                               assignment.error = true;
+                               return;
+                       }
+
+                       assignment.ccodenode = emit_signal_assignment (assignment);
+               } else {
+                       base.visit_assignment (assignment);
+               }
+       }
 }