[vala/staging] codegen: Split out GSignalModule.emit_signal()



commit b9df26bcf3d8f6884f14dcc33a1a9d891916ac9d
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Mon Nov 1 14:02:04 2021 +0100

    codegen: Split out GSignalModule.emit_signal()

 codegen/valagsignalmodule.vala | 127 +++++++++++++++++++----------------------
 1 file changed, 59 insertions(+), 68 deletions(-)
---
diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala
index 126e78a44..00413173e 100644
--- a/codegen/valagsignalmodule.vala
+++ b/codegen/valagsignalmodule.vala
@@ -486,36 +486,20 @@ public class Vala.GSignalModule : GObjectModule {
        }
 
        public override void visit_element_access (ElementAccess expr) {
-               if (expr.container is MemberAccess && expr.container.symbol_reference is Signal) {
-                       if (expr.parent_node is MethodCall) {
-                               // detailed signal emission
-                               var sig = (Signal) expr.symbol_reference;
-                               var ma = (MemberAccess) expr.container;
-
-                               var detail_expr = expr.get_indices ().get (0);
-
-                               CCodeFunctionCall ccall;
-                               if (!sig.external_package && expr.source_reference.file == 
sig.source_reference.file) {
-                                       var detail_cexpr = get_detail_cexpression (detail_expr, expr);
-
-                                       ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit"));
-                                       ccall.add_argument (get_cvalue (ma.inner));
-                                       ccall.add_argument (get_signal_id_cexpression (sig));
-                                       ccall.add_argument (detail_cexpr);
-                               } else {
-                                       var signal_name_cexpr = get_signal_name_cexpression (sig, 
detail_expr, expr);
+               if (!(expr.container is MemberAccess && expr.container.symbol_reference is Signal)) {
+                       base.visit_element_access (expr);
+                       return;
+               }
 
-                                       ccall = new CCodeFunctionCall (new CCodeIdentifier 
("g_signal_emit_by_name"));
-                                       ccall.add_argument (get_cvalue (ma.inner));
-                                       ccall.add_argument (signal_name_cexpr);
-                               }
+               if (expr.parent_node is MethodCall) {
+                       // detailed signal emission
+                       unowned Signal sig = (Signal) expr.symbol_reference;
+                       unowned MemberAccess ma = (MemberAccess) expr.container;
+                       var detail_expr = expr.get_indices ().get (0);
 
-                               set_cvalue (expr, ccall);
-                       } else {
-                               // signal connect or disconnect
-                       }
+                       set_cvalue (expr, emit_signal (sig, ma, detail_expr));
                } else {
-                       base.visit_element_access (expr);
+                       // signal connect or disconnect
                }
        }
 
@@ -528,57 +512,64 @@ public class Vala.GSignalModule : GObjectModule {
        }
 
        public override void visit_member_access (MemberAccess expr) {
-               if (expr.symbol_reference is Signal) {
-                       CCodeExpression pub_inst = null;
+               if (!(expr.symbol_reference is Signal)) {
+                       base.visit_member_access (expr);
+                       return;
+               }
 
-                       if (expr.inner != null) {
-                               pub_inst = get_cvalue (expr.inner);
-                       }
+               unowned Signal sig = (Signal) expr.symbol_reference;
 
-                       var sig = (Signal) expr.symbol_reference;
-                       var cl = (TypeSymbol) sig.parent_symbol;
+               set_cvalue (expr, emit_signal (sig, expr));
+       }
 
-                       if (expr.inner is BaseAccess && sig.is_virtual) {
-                               var m = sig.default_handler;
-                               var base_class = (Class) m.parent_symbol;
-                               var vcast = new CCodeFunctionCall (new CCodeIdentifier 
(get_ccode_class_type_function (base_class)));
-                               vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf 
(get_ccode_lower_case_name (current_class))));
+       CCodeExpression emit_signal (Signal sig, MemberAccess expr, Expression? detail_expr = null) {
+               CCodeExpression pub_inst = null;
 
-                               set_cvalue (expr, new CCodeMemberAccess.pointer (vcast, m.name));
-                               return;
-                       }
+               if (expr.inner != null) {
+                       pub_inst = get_cvalue (expr.inner);
+               }
 
-                       if (!sig.external_package && expr.source_reference.file == sig.source_reference.file) 
{
-                               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit"));
-                               ccall.add_argument (pub_inst);
-                               ccall.add_argument (get_signal_id_cexpression (sig));
-                               ccall.add_argument (new CCodeConstant ("0"));
+               if (expr.inner is BaseAccess && sig.is_virtual) {
+                       var m = sig.default_handler;
+                       var base_class = (Class) m.parent_symbol;
+                       var vcast = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_class_type_function 
(base_class)));
+                       vcast.add_argument (new CCodeIdentifier ("%s_parent_class".printf 
(get_ccode_lower_case_name (current_class))));
+                       return new CCodeMemberAccess.pointer (vcast, m.name);
+               }
 
-                               set_cvalue (expr, ccall);
-                       } else if (get_ccode_has_emitter (sig)) {
-                               string emitter_func;
-                               if (sig.emitter != null) {
-                                       if (!sig.external_package && expr.source_reference.file != 
sig.source_reference.file) {
-                                               generate_method_declaration (sig.emitter, cfile);
-                                       }
-                                       emitter_func = get_ccode_lower_case_name (sig.emitter);
-                               } else {
-                                       emitter_func = "%s_%s".printf (get_ccode_lower_case_name (cl), 
get_ccode_lower_case_name (sig));
+               if (!sig.external_package && expr.source_reference.file == sig.source_reference.file) {
+                       var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit"));
+                       ccall.add_argument (pub_inst);
+                       ccall.add_argument (get_signal_id_cexpression (sig));
+                       if (detail_expr == null) {
+                               ccall.add_argument (new CCodeConstant ("0"));
+                       } else {
+                               ccall.add_argument (get_detail_cexpression (detail_expr, expr));
+                       }
+                       return ccall;
+               } else if (get_ccode_has_emitter (sig)) {
+                       string emitter_func;
+                       if (sig.emitter != null) {
+                               if (!sig.external_package && expr.source_reference.file != 
sig.source_reference.file) {
+                                       generate_method_declaration (sig.emitter, cfile);
                                }
-                               var ccall = new CCodeFunctionCall (new CCodeIdentifier (emitter_func));
-
-                               ccall.add_argument (pub_inst);
-                               set_cvalue (expr, ccall);
+                               emitter_func = get_ccode_lower_case_name (sig.emitter);
                        } else {
-                               var ccall = new CCodeFunctionCall (new CCodeIdentifier 
("g_signal_emit_by_name"));
-                               ccall.add_argument (pub_inst);
-
-                               ccall.add_argument (get_signal_canonical_constant (sig));
-
-                               set_cvalue (expr, ccall);
+                               unowned TypeSymbol sym = (TypeSymbol) sig.parent_symbol;
+                               emitter_func = "%s_%s".printf (get_ccode_lower_case_name (sym), 
get_ccode_lower_case_name (sig));
                        }
+                       var ccall = new CCodeFunctionCall (new CCodeIdentifier (emitter_func));
+                       ccall.add_argument (pub_inst);
+                       return ccall;
                } else {
-                       base.visit_member_access (expr);
+                       var ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_emit_by_name"));
+                       ccall.add_argument (pub_inst);
+                       if (detail_expr == null) {
+                               ccall.add_argument (get_signal_canonical_constant (sig));
+                       } else {
+                               ccall.add_argument (get_signal_name_cexpression (sig, detail_expr, expr));
+                       }
+                       return ccall;
                }
        }
 


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