From f576142fe8693ad96e502070af85912fa3a434c4 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 4 Jan 2022 12:22:25 -0500 Subject: [PATCH] LibJS+LibUnicode: Convert UnicodeLocale to link with weak symbols --- .../LibUnicode/GenerateUnicodeLocale.cpp | 29 ++--- .../LibJS/Runtime/Intl/AbstractOperations.cpp | 2 +- Userland/Libraries/LibUnicode/Locale.cpp | 119 ++++++------------ Userland/Libraries/LibUnicode/Locale.h | 20 ++- .../Libraries/LibUnicode/UnicodeSymbols.cpp | 20 --- .../Libraries/LibUnicode/UnicodeSymbols.h | 26 ---- 6 files changed, 68 insertions(+), 148 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp index c33d26f65d..cd73032bda 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeLocale.cpp @@ -769,7 +769,7 @@ static void generate_unicode_locale_implementation(Core::File& file, UnicodeLoca #include #include -namespace Unicode::Detail { +namespace Unicode { struct Patterns { ListPatternType type; @@ -847,9 +847,9 @@ static constexpr Array<@type@, @size@> @name@ { {)~~~"); generator.append(R"~~~( struct CanonicalLanguageID { - Unicode::LanguageID to_unicode_language_id() const + LanguageID to_unicode_language_id() const { - Unicode::LanguageID language_id {}; + LanguageID language_id {}; language_id.variants.ensure_capacity(variants_size); language_id.language = s_string_list[language]; @@ -936,7 +936,7 @@ static constexpr Array s_@name@ { { append_complex_mapping("likely_subtags"sv, locale_data.likely_subtags); generator.append(R"~~~( -static LanguageMapping const* resolve_likely_subtag(Unicode::LanguageID const& language_id) +static LanguageMapping const* resolve_likely_subtag(LanguageID const& language_id) { // https://unicode.org/reports/tr35/#Likely_Subtags enum class State { @@ -951,7 +951,7 @@ static LanguageMapping const* resolve_likely_subtag(Unicode::LanguageID const& l auto state = State::LanguageScriptRegion; while (state != State::Done) { - Unicode::LanguageID search_key; + LanguageID search_key; switch (state) { case State::LanguageScriptRegion: @@ -1032,7 +1032,6 @@ static LanguageMapping const* resolve_likely_subtag(Unicode::LanguageID const& l generator.set("unique_list", unique_list); generator.append(R"~~~( -Optional get_locale_@enum_snake@_mapping(StringView locale, StringView @enum_snake@) asm("unicode_get_locale_@enum_snake@_mapping"); Optional get_locale_@enum_snake@_mapping(StringView locale, StringView @enum_snake@) { auto locale_value = locale_from_string(locale); @@ -1068,7 +1067,7 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi for (auto const& alias : aliases) hashes.set(alias.alias.hash(), format_identifier(enum_title, alias.alias)); - generate_value_from_string_for_dynamic_loading(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); + generate_value_from_string(generator, "{}_from_string"sv, enum_title, enum_snake, move(hashes)); }; auto append_alias_search = [&](StringView enum_snake, auto const& aliases) { @@ -1078,7 +1077,7 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi for (auto const& alias : aliases) hashes.set(alias.key.hash(), alias.value); - generate_value_from_string_for_dynamic_loading(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), "StringView"sv, "s_string_list[{}]"sv); + generate_value_from_string(generator, "resolve_{}_alias"sv, s_string_index_type, enum_snake, move(hashes), "StringView"sv, "s_string_list[{}]"sv); }; append_from_string("Locale"sv, "locale"sv, locale_data.locales.keys(), locale_data.locale_aliases); @@ -1092,7 +1091,7 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi append_alias_search("territory"sv, locale_data.territory_aliases); append_from_string("ScriptTag"sv, "script_tag"sv, locale_data.scripts); - append_mapping_search("script_tag"sv, "script_tag"sv, "s_scripts"sv, "s_script_lists"sv); + append_mapping_search("script"sv, "script_tag"sv, "s_scripts"sv, "s_script_lists"sv); append_alias_search("script_tag"sv, locale_data.script_aliases); append_from_string("Currency"sv, "currency"sv, locale_data.currencies); @@ -1111,8 +1110,7 @@ Optional get_locale_@enum_snake@_mapping(StringView locale, StringVi append_from_string("ListPatternStyle"sv, "list_pattern_style"sv, locale_data.list_pattern_styles); generator.append(R"~~~( -Optional get_locale_list_pattern_mapping(StringView locale, StringView list_pattern_type, StringView list_pattern_style) asm("unicode_get_locale_list_pattern_mapping"); -Optional get_locale_list_pattern_mapping(StringView locale, StringView list_pattern_type, StringView list_pattern_style) +Optional get_locale_list_patterns(StringView locale, StringView list_pattern_type, StringView list_pattern_style) { auto locale_value = locale_from_string(locale); if (!locale_value.has_value()) @@ -1147,8 +1145,7 @@ Optional get_locale_list_pattern_mapping(StringView locale, String return {}; } -void resolve_complex_language_aliases(Unicode::LanguageID& language_id) asm("unicode_resolve_complex_language_aliases"); -void resolve_complex_language_aliases(Unicode::LanguageID& language_id) +void resolve_complex_language_aliases(LanguageID& language_id) { for (auto const& map : s_complex_alias) { auto const& key_language = s_string_list[map.key.language]; @@ -1180,8 +1177,7 @@ void resolve_complex_language_aliases(Unicode::LanguageID& language_id) } } -Optional add_likely_subtags(Unicode::LanguageID const& language_id) asm("unicode_add_likely_subtags"); -Optional add_likely_subtags(Unicode::LanguageID const& language_id) +Optional add_likely_subtags(LanguageID const& language_id) { // https://www.unicode.org/reports/tr35/#Likely_Subtags auto const* likely_subtag = resolve_likely_subtag(language_id); @@ -1207,8 +1203,7 @@ Optional add_likely_subtags(Unicode::LanguageID const& lang return maximized; } -Optional resolve_most_likely_territory(Unicode::LanguageID const& language_id) asm("unicode_resolve_most_likely_territory"); -Optional resolve_most_likely_territory(Unicode::LanguageID const& language_id) +Optional resolve_most_likely_territory(LanguageID const& language_id) { if (auto const* likely_subtag = resolve_likely_subtag(language_id); likely_subtag != nullptr) return s_string_list[likely_subtag->alias.region]; diff --git a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp index d0ebfe07ee..d839adbca7 100644 --- a/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp +++ b/Userland/Libraries/LibJS/Runtime/Intl/AbstractOperations.cpp @@ -422,7 +422,7 @@ LocaleResult resolve_locale(Vector const& requested_locales, LocaleOptio // b. Assert: Type(foundLocaleData) is Record. // c. Let keyLocaleData be foundLocaleData.[[]]. // d. Assert: Type(keyLocaleData) is List. - auto key_locale_data = Unicode::get_locale_key_mapping(found_locale, key); + auto key_locale_data = Unicode::get_locale_key_mapping_list(found_locale, key); // e. Let value be keyLocaleData[0]. // f. Assert: Type(value) is either String or Null. diff --git a/Userland/Libraries/LibUnicode/Locale.cpp b/Userland/Libraries/LibUnicode/Locale.cpp index e603e21b0b..d1125d1826 100644 --- a/Userland/Libraries/LibUnicode/Locale.cpp +++ b/Userland/Libraries/LibUnicode/Locale.cpp @@ -11,7 +11,6 @@ #include #include #include -#include namespace Unicode { @@ -568,8 +567,6 @@ void canonicalize_unicode_extension_values(StringView key, String& value, bool r static void transform_unicode_locale_id_to_canonical_syntax(LocaleID& locale_id) { - static auto const& symbols = Detail::Symbols::ensure_loaded(); - auto canonicalize_language = [&](LanguageID& language_id, bool force_lowercase) { language_id.language = language_id.language->to_lowercase(); if (language_id.script.has_value()) @@ -579,7 +576,7 @@ static void transform_unicode_locale_id_to_canonical_syntax(LocaleID& locale_id) for (auto& variant : language_id.variants) variant = variant.to_lowercase(); - symbols.resolve_complex_language_aliases(language_id); + resolve_complex_language_aliases(language_id); if (auto alias = resolve_language_alias(*language_id.language); alias.has_value()) { auto language_alias = parse_unicode_language_id(*alias); @@ -601,7 +598,7 @@ static void transform_unicode_locale_id_to_canonical_syntax(LocaleID& locale_id) if (language_id.region.has_value()) { if (auto alias = resolve_territory_alias(*language_id.region); alias.has_value()) - language_id.region = resolve_most_likely_territory(language_id, *alias); + language_id.region = resolve_most_likely_territory_alias(language_id, *alias); } quick_sort(language_id.variants); @@ -744,49 +741,41 @@ bool is_locale_available(StringView locale) return locale_from_string(locale).has_value(); } -Optional locale_from_string(StringView locale) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.locale_from_string(locale); -} - -Optional get_locale_language_mapping(StringView locale, StringView language) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.get_locale_language_mapping(locale, language); -} - -Optional get_locale_territory_mapping(StringView locale, StringView territory) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.get_locale_territory_mapping(locale, territory); -} - -Optional get_locale_script_mapping(StringView locale, StringView script) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.get_locale_script_tag_mapping(locale, script); -} +Optional __attribute__((weak)) locale_from_string(StringView) { return {}; } +Optional __attribute__((weak)) language_from_string(StringView) { return {}; } +Optional __attribute__((weak)) territory_from_string(StringView) { return {}; } +Optional __attribute__((weak)) script_tag_from_string(StringView) { return {}; } +Optional __attribute__((weak)) currency_from_string(StringView) { return {}; } +Optional __attribute__((weak)) key_from_string(StringView) { return {}; } +Optional __attribute__((weak)) list_pattern_type_from_string(StringView) { return {}; } +Optional __attribute__((weak)) list_pattern_style_from_string(StringView) { return {}; } +Optional __attribute__((weak)) get_locale_language_mapping(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_locale_territory_mapping(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_locale_script_mapping(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_locale_long_currency_mapping(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_locale_short_currency_mapping(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_locale_narrow_currency_mapping(StringView, StringView) { return {}; } +Optional __attribute__((weak)) get_locale_numeric_currency_mapping(StringView, StringView) { return {}; } Optional get_locale_currency_mapping(StringView locale, StringView currency, Style style) { - static auto const& symbols = Detail::Symbols::ensure_loaded(); - switch (style) { case Style::Long: - return symbols.get_locale_long_currency_mapping(locale, currency); + return get_locale_long_currency_mapping(locale, currency); case Style::Short: - return symbols.get_locale_short_currency_mapping(locale, currency); + return get_locale_short_currency_mapping(locale, currency); case Style::Narrow: - return symbols.get_locale_narrow_currency_mapping(locale, currency); + return get_locale_narrow_currency_mapping(locale, currency); case Style::Numeric: - return symbols.get_locale_numeric_currency_mapping(locale, currency); + return get_locale_numeric_currency_mapping(locale, currency); default: VERIFY_NOT_REACHED(); } } -Vector get_locale_key_mapping(StringView locale, StringView keyword) +Optional __attribute__((weak)) get_locale_key_mapping(StringView, StringView) { return {}; } + +Vector get_locale_key_mapping_list(StringView locale, StringView keyword) { if (keyword == "hc"sv) { auto hour_cycles = get_locale_hour_cycles(locale); @@ -800,55 +789,20 @@ Vector get_locale_key_mapping(StringView locale, StringView keyword) return values; } - static auto const& symbols = Detail::Symbols::ensure_loaded(); - - if (auto values = symbols.get_locale_key_mapping(locale, keyword); values.has_value()) + if (auto values = get_locale_key_mapping(locale, keyword); values.has_value()) return values->split_view(','); return {}; } -Optional get_locale_list_patterns(StringView locale, StringView type, StringView style) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.get_locale_list_pattern_mapping(locale, type, style); -} - -Optional resolve_language_alias(StringView language) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.resolve_language_alias(language); -} - -Optional resolve_territory_alias(StringView territory) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.resolve_territory_alias(territory); -} - -Optional resolve_script_tag_alias(StringView script_tag) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.resolve_script_tag_alias(script_tag); -} - -Optional resolve_variant_alias(StringView variant) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.resolve_variant_alias(variant); -} - -Optional resolve_subdivision_alias(StringView subdivision) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.resolve_subdivision_alias(subdivision); -} - -Optional add_likely_subtags(LanguageID const& language_id) -{ - static auto const& symbols = Detail::Symbols::ensure_loaded(); - return symbols.add_likely_subtags(language_id); -} +Optional __attribute__((weak)) get_locale_list_patterns(StringView, StringView, StringView) { return {}; } +Optional __attribute__((weak)) resolve_language_alias(StringView) { return {}; } +Optional __attribute__((weak)) resolve_territory_alias(StringView) { return {}; } +Optional __attribute__((weak)) resolve_script_tag_alias(StringView) { return {}; } +Optional __attribute__((weak)) resolve_variant_alias(StringView) { return {}; } +Optional __attribute__((weak)) resolve_subdivision_alias(StringView) { return {}; } +void __attribute__((weak)) resolve_complex_language_aliases(LanguageID&) { } +Optional __attribute__((weak)) add_likely_subtags(LanguageID const&) { return {}; } Optional remove_likely_subtags(LanguageID const& language_id) { @@ -892,13 +846,14 @@ Optional remove_likely_subtags(LanguageID const& language_id) return return_language_and_variants(maximized.release_value(), move(variants)); } -String resolve_most_likely_territory(LanguageID const& language_id, StringView territory_alias) +Optional __attribute__((weak)) resolve_most_likely_territory(LanguageID const&) { return {}; } + +String resolve_most_likely_territory_alias(LanguageID const& language_id, StringView territory_alias) { - static auto const& symbols = Detail::Symbols::ensure_loaded(); auto aliases = territory_alias.split_view(' '); if (aliases.size() > 1) { - auto territory = symbols.resolve_most_likely_territory(language_id); + auto territory = resolve_most_likely_territory(language_id); if (territory.has_value() && aliases.contains_slow(*territory)) return territory.release_value(); } diff --git a/Userland/Libraries/LibUnicode/Locale.h b/Userland/Libraries/LibUnicode/Locale.h index b451a698f0..2080fd1d5c 100644 --- a/Userland/Libraries/LibUnicode/Locale.h +++ b/Userland/Libraries/LibUnicode/Locale.h @@ -140,13 +140,26 @@ Optional canonicalize_unicode_locale_id(LocaleID&); String const& default_locale(); bool is_locale_available(StringView locale); + Optional locale_from_string(StringView locale); +Optional language_from_string(StringView language); +Optional territory_from_string(StringView territory); +Optional script_tag_from_string(StringView script_tag); +Optional currency_from_string(StringView currency); +Optional key_from_string(StringView key); +Optional list_pattern_type_from_string(StringView list_pattern_type); +Optional list_pattern_style_from_string(StringView list_pattern_style); Optional get_locale_language_mapping(StringView locale, StringView language); Optional get_locale_territory_mapping(StringView locale, StringView territory); Optional get_locale_script_mapping(StringView locale, StringView script); +Optional get_locale_long_currency_mapping(StringView locale, StringView currency); +Optional get_locale_short_currency_mapping(StringView locale, StringView currency); +Optional get_locale_narrow_currency_mapping(StringView locale, StringView currency); +Optional get_locale_numeric_currency_mapping(StringView locale, StringView currency); Optional get_locale_currency_mapping(StringView locale, StringView currency, Style style); -Vector get_locale_key_mapping(StringView locale, StringView keyword); +Optional get_locale_key_mapping(StringView locale, StringView keyword); +Vector get_locale_key_mapping_list(StringView locale, StringView keyword); Optional get_locale_list_patterns(StringView locale, StringView type, StringView style); @@ -155,9 +168,12 @@ Optional resolve_territory_alias(StringView territory); Optional resolve_script_tag_alias(StringView script_tag); Optional resolve_variant_alias(StringView variant); Optional resolve_subdivision_alias(StringView subdivision); +void resolve_complex_language_aliases(LanguageID& language_id); Optional add_likely_subtags(LanguageID const& language_id); Optional remove_likely_subtags(LanguageID const& language_id); -String resolve_most_likely_territory(LanguageID const& language_id, StringView territory_alias); + +Optional resolve_most_likely_territory(Unicode::LanguageID const& language_id); +String resolve_most_likely_territory_alias(LanguageID const& language_id, StringView territory_alias); } diff --git a/Userland/Libraries/LibUnicode/UnicodeSymbols.cpp b/Userland/Libraries/LibUnicode/UnicodeSymbols.cpp index 3befd13432..39dade6a9f 100644 --- a/Userland/Libraries/LibUnicode/UnicodeSymbols.cpp +++ b/Userland/Libraries/LibUnicode/UnicodeSymbols.cpp @@ -15,7 +15,6 @@ # endif #else # include -# include #endif namespace Unicode::Detail { @@ -91,25 +90,6 @@ Symbols const& Symbols::ensure_loaded() load_symbol(symbols.code_point_has_script, "unicode_code_point_has_script"); load_symbol(symbols.code_point_has_script_extension, "unicode_code_point_has_script_extension"); - load_symbol(symbols.locale_from_string, "unicode_locale_from_string"); - load_symbol(symbols.get_locale_language_mapping, "unicode_get_locale_language_mapping"); - load_symbol(symbols.get_locale_territory_mapping, "unicode_get_locale_territory_mapping"); - load_symbol(symbols.get_locale_script_tag_mapping, "unicode_get_locale_script_tag_mapping"); - load_symbol(symbols.get_locale_long_currency_mapping, "unicode_get_locale_long_currency_mapping"); - load_symbol(symbols.get_locale_short_currency_mapping, "unicode_get_locale_short_currency_mapping"); - load_symbol(symbols.get_locale_narrow_currency_mapping, "unicode_get_locale_narrow_currency_mapping"); - load_symbol(symbols.get_locale_numeric_currency_mapping, "unicode_get_locale_numeric_currency_mapping"); - load_symbol(symbols.get_locale_key_mapping, "unicode_get_locale_key_mapping"); - load_symbol(symbols.get_locale_list_pattern_mapping, "unicode_get_locale_list_pattern_mapping"); - load_symbol(symbols.resolve_language_alias, "unicode_resolve_language_alias"); - load_symbol(symbols.resolve_territory_alias, "unicode_resolve_territory_alias"); - load_symbol(symbols.resolve_script_tag_alias, "unicode_resolve_script_tag_alias"); - load_symbol(symbols.resolve_variant_alias, "unicode_resolve_variant_alias"); - load_symbol(symbols.resolve_subdivision_alias, "unicode_resolve_subdivision_alias"); - load_symbol(symbols.resolve_complex_language_aliases, "unicode_resolve_complex_language_aliases"); - load_symbol(symbols.add_likely_subtags, "unicode_add_likely_subtags"); - load_symbol(symbols.resolve_most_likely_territory, "unicode_resolve_most_likely_territory"); - initialized = true; return symbols; } diff --git a/Userland/Libraries/LibUnicode/UnicodeSymbols.h b/Userland/Libraries/LibUnicode/UnicodeSymbols.h index 4e1e2d2b70..920234ff7d 100644 --- a/Userland/Libraries/LibUnicode/UnicodeSymbols.h +++ b/Userland/Libraries/LibUnicode/UnicodeSymbols.h @@ -38,32 +38,6 @@ struct Symbols { bool (*code_point_has_script)(u32, Script) { nullptr }; bool (*code_point_has_script_extension)(u32, Script) { nullptr }; - // Loaded from UnicodeLocale.cpp: - - Optional (*locale_from_string)(StringView) { nullptr }; - - Optional (*get_locale_language_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_territory_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_script_tag_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_long_currency_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_short_currency_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_narrow_currency_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_numeric_currency_mapping)(StringView, StringView) { nullptr }; - Optional (*get_locale_key_mapping)(StringView, StringView) { nullptr }; - - Optional (*get_locale_list_pattern_mapping)(StringView, StringView, StringView) { nullptr }; - - Optional (*resolve_language_alias)(StringView) { nullptr }; - Optional (*resolve_territory_alias)(StringView) { nullptr }; - Optional (*resolve_script_tag_alias)(StringView) { nullptr }; - Optional (*resolve_variant_alias)(StringView) { nullptr }; - Optional (*resolve_subdivision_alias)(StringView) { nullptr }; - - void (*resolve_complex_language_aliases)(LanguageID&); - - Optional (*add_likely_subtags)(LanguageID const&); - Optional (*resolve_most_likely_territory)(LanguageID const&); - private: Symbols() = default; };