From: Rico Tzschichholz Date: Mon, 1 Nov 2021 13:02:04 +0000 (+0100) Subject: codegen: Split out GSignalModule.emit_signal() X-Git-Tag: 0.55.1~96 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9df26bcf3d8f6884f14dcc33a1a9d891916ac9d;p=thirdparty%2Fvala.git codegen: Split out GSignalModule.emit_signal() --- 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; } }