From 9bee48897a2a77fd8be3ab77379190cd3a3ff9ba Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Tue, 6 Jun 2017 17:39:41 +0200 Subject: codegen: Support renamed signals The CCode attribute 'cname' needs to be the canonical representation as it is expected in C. https://bugzilla.gnome.org/show_bug.cgi?id=731547 --- codegen/valaccodeattribute.vala | 24 ++++++++++++++++++++---- codegen/valaccodebasemodule.vala | 4 +++- codegen/valaccodedelegatemodule.vala | 2 +- codegen/valagdbusclientmodule.vala | 2 +- codegen/valagdbusmodule.vala | 12 ++++++------ codegen/valagdbusservermodule.vala | 4 ++-- codegen/valagirwriter.vala | 2 +- codegen/valagsignalmodule.vala | 8 ++++---- tests/Makefile.am | 1 + tests/objects/bug731547.vala | 36 ++++++++++++++++++++++++++++++++++++ vala/valagirparser.vala | 6 ++++++ 11 files changed, 81 insertions(+), 20 deletions(-) create mode 100644 tests/objects/bug731547.vala diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala index ec41f82b1..491b42ac5 100644 --- a/codegen/valaccodeattribute.vala +++ b/codegen/valaccodeattribute.vala @@ -408,7 +408,12 @@ public class Vala.CCodeAttribute : AttributeCache { _vfunc_name = ccode.get_string ("vfunc_name"); } if (_vfunc_name == null) { - _vfunc_name = sym.name; + Method m = node as Method; + if (m != null && m.signal_reference != null) { + _vfunc_name = CCodeBaseModule.get_ccode_lower_case_name (m.signal_reference); + } else { + _vfunc_name = sym.name; + } } } return _vfunc_name; @@ -621,6 +626,9 @@ public class Vala.CCodeAttribute : AttributeCache { if (m.is_async_callback) { return "%s_co".printf (CCodeBaseModule.get_ccode_real_name ((Method) m.parent_symbol)); } + if (m.signal_reference != null) { + return "%s%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), CCodeBaseModule.get_ccode_lower_case_name (m.signal_reference)); + } if (sym.name == "main" && sym.parent_symbol.name == null) { // avoid conflict with generated main function return "_vala_main"; @@ -639,7 +647,7 @@ public class Vala.CCodeAttribute : AttributeCache { return "%sset_%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (t), acc.prop.name); } } else if (sym is Signal) { - return Symbol.camel_case_to_lower_case (sym.name); + return Symbol.camel_case_to_lower_case (sym.name).replace ("_", "-");; } else if (sym is LocalVariable || sym is Parameter) { return sym.name; } else { @@ -777,6 +785,8 @@ public class Vala.CCodeAttribute : AttributeCache { csuffix = csuffix.substring (0, csuffix.length - "_class".length) + "class"; } return csuffix; + } else if (sym is Signal) { + return CCodeBaseModule.get_ccode_attribute (sym).name.replace ("-", "_"); } else if (sym.name != null) { return Symbol.camel_case_to_lower_case (sym.name); } @@ -1271,12 +1281,18 @@ public class Vala.CCodeAttribute : AttributeCache { } else if (sym is Method) { var m = (Method) sym; if (m.base_method != null || m.base_interface_method != null) { + string m_name; + if (m.signal_reference != null) { + m_name = CCodeBaseModule.get_ccode_lower_case_name (m.signal_reference); + } else { + m_name = m.name; + } if (m.base_interface_type != null) { return "%sreal_%s%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), CCodeBaseModule.get_ccode_lower_case_prefix (m.base_interface_type.data_type), - m.name); + m_name); } else { - return "%sreal_%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), m.name); + return "%sreal_%s".printf (CCodeBaseModule.get_ccode_lower_case_prefix (m.parent_symbol), m_name); } } else { return name; diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index b6bb7708f..1c3bdee1d 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -6139,6 +6139,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } if (sym is Delegate) { return "%s%s%s".printf (get_ccode_lower_case_prefix (sym.parent_symbol), infix, Symbol.camel_case_to_lower_case (sym.name)); + } else if (sym is Signal) { + return get_ccode_attribute (sym).name.replace ("-", "_"); } else if (sym is ErrorCode) { return get_ccode_name (sym).down (); } else { @@ -6471,7 +6473,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { } public CCodeConstant get_signal_canonical_constant (Signal sig, string? detail = null) { - return new CCodeConstant ("\"%s%s\"".printf (get_ccode_name (sig).replace ("_", "-"), (detail != null ? "::%s".printf (detail) : ""))); + return new CCodeConstant ("\"%s%s\"".printf (get_ccode_name (sig), (detail != null ? "::%s".printf (detail) : ""))); } public static CCodeConstant get_enum_value_canonical_cconstant (EnumValue ev) { diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala index 7150c4e4a..abb88929a 100644 --- a/codegen/valaccodedelegatemodule.vala +++ b/codegen/valaccodedelegatemodule.vala @@ -181,7 +181,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule { if (dynamic_sig != null) { delegate_name = get_dynamic_signal_cname (dynamic_sig); } else if (sig != null) { - delegate_name = get_ccode_lower_case_prefix (sig.parent_symbol) + get_ccode_name (sig); + delegate_name = get_ccode_lower_case_prefix (sig.parent_symbol) + get_ccode_lower_case_name (sig); } else { delegate_name = Symbol.camel_case_to_lower_case (get_ccode_name (d)); } diff --git a/codegen/valagdbusclientmodule.vala b/codegen/valagdbusclientmodule.vala index dd8b405eb..4d9caa1d3 100644 --- a/codegen/valagdbusclientmodule.vala +++ b/codegen/valagdbusclientmodule.vala @@ -436,7 +436,7 @@ public class Vala.GDBusClientModule : GDBusModule { } string generate_dbus_signal_handler (Signal sig, ObjectTypeSymbol sym) { - string wrapper_name = "_dbus_handle_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_name (sig)); + string wrapper_name = "_dbus_handle_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_lower_case_name (sig)); var function = new CCodeFunction (wrapper_name); function.modifiers = CCodeModifiers.STATIC; diff --git a/codegen/valagdbusmodule.vala b/codegen/valagdbusmodule.vala index 0a6404ad8..f8bdaa9c8 100644 --- a/codegen/valagdbusmodule.vala +++ b/codegen/valagdbusmodule.vala @@ -371,31 +371,31 @@ public class Vala.GDBusModule : GVariantModule { info.append (new CCodeConstant ("\"%s\"".printf (get_type_signature (param.variable_type, param)))); var cdecl = new CCodeDeclaration ("const GDBusArgInfo"); - cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig) + "_" + param.name, info)); + cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig) + "_" + param.name, info)); cdecl.modifiers = CCodeModifiers.STATIC; cfile.add_constant_declaration (cdecl); - args_info.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig) + "_" + param.name))); + args_info.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig) + "_" + param.name))); } args_info.append (new CCodeConstant ("NULL")); var cdecl = new CCodeDeclaration ("const GDBusArgInfo * const"); - cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig) + "[]", args_info)); + cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig) + "[]", args_info)); cdecl.modifiers = CCodeModifiers.STATIC; cfile.add_constant_declaration (cdecl); var info = new CCodeInitializerList (); info.append (new CCodeConstant ("-1")); info.append (new CCodeConstant ("\"%s\"".printf (get_dbus_name_for_member (sig)))); - info.append (new CCodeCastExpression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_name (sig))), "GDBusArgInfo **")); + info.append (new CCodeCastExpression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_arg_info_" + get_ccode_lower_case_name (sig))), "GDBusArgInfo **")); cdecl = new CCodeDeclaration ("const GDBusSignalInfo"); - cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_name (sig), info)); + cdecl.add_declarator (new CCodeVariableDeclarator ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_lower_case_name (sig), info)); cdecl.modifiers = CCodeModifiers.STATIC; cfile.add_constant_declaration (cdecl); - infos.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_name (sig)))); + infos.append (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_" + get_ccode_lower_case_prefix (sym) + "dbus_signal_info_" + get_ccode_lower_case_name (sig)))); } infos.append (new CCodeConstant ("NULL")); diff --git a/codegen/valagdbusservermodule.vala b/codegen/valagdbusservermodule.vala index d0c87fd64..68909c05f 100644 --- a/codegen/valagdbusservermodule.vala +++ b/codegen/valagdbusservermodule.vala @@ -409,7 +409,7 @@ public class Vala.GDBusServerModule : GDBusClientModule { } string generate_dbus_signal_wrapper (Signal sig, ObjectTypeSymbol sym, string dbus_iface_name) { - string wrapper_name = "_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_name (sig)); + string wrapper_name = "_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_lower_case_name (sig)); var function = new CCodeFunction (wrapper_name, "void"); function.modifiers = CCodeModifiers.STATIC; @@ -616,7 +616,7 @@ public class Vala.GDBusServerModule : GDBusClientModule { // disconnect the signals var disconnect_call = new CCodeFunctionCall (new CCodeIdentifier ("g_signal_handlers_disconnect_by_func")); disconnect_call.add_argument (new CCodeElementAccess (new CCodeIdentifier ("data"), new CCodeConstant ("0"))); - disconnect_call.add_argument (new CCodeIdentifier ("_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_name (sig)))); + disconnect_call.add_argument (new CCodeIdentifier ("_dbus_%s_%s".printf (get_ccode_lower_case_name (sym), get_ccode_lower_case_name (sig)))); disconnect_call.add_argument (new CCodeIdentifier ("data")); ccode.add_expression (disconnect_call); } diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index c252b2d32..ad84d3c06 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -417,7 +417,7 @@ public class Vala.GIRWriter : CodeVisitor { foreach (Signal sig in cl.get_signals ()) { if (sig.default_handler != null) { write_indent (); - buffer.append_printf ("\n", sig.name); + buffer.append_printf ("\n", CCodeBaseModule.get_ccode_lower_case_name (sig)); indent++; write_signature (sig.default_handler, "callback", false, true); indent--; diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala index 00c06c196..1c0eff476 100644 --- a/codegen/valagsignalmodule.vala +++ b/codegen/valagsignalmodule.vala @@ -145,7 +145,7 @@ public class Vala.GSignalModule : GObjectModule { private CCodeExpression get_signal_id_cexpression (Signal sig) { var cl = (TypeSymbol) sig.parent_symbol; var signal_array = new CCodeIdentifier ("%s_signals".printf (get_ccode_lower_case_name (cl))); - var signal_enum_value = new CCodeIdentifier ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name (cl), sig.name.ascii_up ())); + var signal_enum_value = new CCodeIdentifier ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name (cl), get_ccode_upper_case_name (sig))); return new CCodeElementAccess (signal_array, signal_enum_value); } @@ -189,7 +189,7 @@ public class Vala.GSignalModule : GObjectModule { } } - signal_enum.add_value (new CCodeEnumValue ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name ((TypeSymbol)sig.parent_symbol), sig.name.ascii_up ()))); + signal_enum.add_value (new CCodeEnumValue ("%s_%s_SIGNAL".printf (get_ccode_upper_case_name ((TypeSymbol)sig.parent_symbol), get_ccode_upper_case_name (sig)))); sig.accept_children (this); @@ -569,7 +569,7 @@ public class Vala.GSignalModule : GObjectModule { } emitter_func = get_ccode_lower_case_name (sig.emitter); } else { - emitter_func = "%s_%s".printf (get_ccode_lower_case_name (cl), sig.name); + emitter_func = "%s_%s".printf (get_ccode_lower_case_name (cl), get_ccode_lower_case_name (sig)); } var ccall = new CCodeFunctionCall (new CCodeIdentifier (emitter_func)); @@ -670,7 +670,7 @@ public class Vala.GSignalModule : GObjectModule { // dynamic_signal_connect or dynamic_signal_disconnect // second argument: signal name - ccall.add_argument (new CCodeConstant ("\"%s\"".printf (sig.name))); + ccall.add_argument (new CCodeConstant ("\"%s\"".printf (get_ccode_name (sig)))); } else if (!disconnect) { // g_signal_connect_object or g_signal_connect diff --git a/tests/Makefile.am b/tests/Makefile.am index 9571dceca..c6341307c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -211,6 +211,7 @@ TESTS = \ objects/bug701978.vala \ objects/bug702736.vala \ objects/bug702846.vala \ + objects/bug731547.vala \ objects/bug751338.vala \ objects/bug758816.vala \ objects/bug760031.test \ diff --git a/tests/objects/bug731547.vala b/tests/objects/bug731547.vala new file mode 100644 index 000000000..a42ab73b5 --- /dev/null +++ b/tests/objects/bug731547.vala @@ -0,0 +1,36 @@ +public class Foo : Object { + [CCode (cname = "baz")] + public signal void foo (); + [CCode (cname = "baz-bar")] + public signal void foo_bar (); + [CCode (cname = "baz-virt")] + public virtual signal void foo_virt () { + callback (); + } +} + +int baz = 0; + +void callback () { + baz++; +} + +void main () { + var foo = new Foo (); + foo.foo.connect (callback); + foo.foo_bar.connect (callback); + + foo.foo (); + assert (baz == 1); + foo.foo_bar (); + assert (baz == 2); + foo.foo_virt (); + assert (baz == 3); + + Signal.emit_by_name (foo, "baz"); + assert (baz == 4); + Signal.emit_by_name (foo, "baz-bar"); + assert (baz == 5); + Signal.emit_by_name (foo, "baz-virt"); + assert (baz == 6); +} diff --git a/vala/valagirparser.vala b/vala/valagirparser.vala index 9b4c0e8dc..08573b677 100644 --- a/vala/valagirparser.vala +++ b/vala/valagirparser.vala @@ -3086,6 +3086,12 @@ public class Vala.GirParser : CodeVisitor { s.comment = comment; s.external = true; + if (s is Signal) { + if (current.girdata["name"] != name.replace ("_", "-")) { + s.set_attribute_string ("CCode", "cname", current.girdata["name"]); + } + } + if (s is Method) { var m = (Method) s; if (symbol_type == "virtual-method" || symbol_type == "callback") { -- cgit v1.2.1