From 17307810d18fa531e7f01506d3b482d3280b5ea2 Mon Sep 17 00:00:00 2001 From: Kevin Mihelich Date: Thu, 15 Feb 2024 13:52:16 +0000 Subject: [PATCH] extra/chromium to 122.0.6261.39-1 --- extra/chromium/.SRCINFO | 22 ++- extra/chromium/PKGBUILD | 28 +-- ...ate-for-converting-script-wrappables.patch | 174 ++++++++++++++++++ extra/chromium/chromium-121-constexpr.patch | 12 -- extra/chromium/chromium-constexpr.patch | 48 +++++ .../drop-flags-unsupported-by-clang16.patch | 25 +-- extra/chromium/icu-74.patch | 21 --- ...port-ICU-74-in-LazyTextBreakIterator.patch | 148 +++++++++++++++ 8 files changed, 403 insertions(+), 75 deletions(-) create mode 100644 extra/chromium/REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch delete mode 100644 extra/chromium/chromium-121-constexpr.patch create mode 100644 extra/chromium/chromium-constexpr.patch delete mode 100644 extra/chromium/icu-74.patch create mode 100644 extra/chromium/support-ICU-74-in-LazyTextBreakIterator.patch diff --git a/extra/chromium/.SRCINFO b/extra/chromium/.SRCINFO index dc61bcf06..2e8bd3907 100644 --- a/extra/chromium/.SRCINFO +++ b/extra/chromium/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = chromium pkgdesc = A web browser built for speed, simplicity, and security - pkgver = 121.0.6167.184 + pkgver = 122.0.6261.39 pkgrel = 1 url = https://www.chromium.org/Home arch = x86_64 @@ -53,22 +53,24 @@ pkgbase = chromium optdepends = org.freedesktop.secrets: password storage backend on GNOME / Xfce optdepends = kwallet: support for storing passwords in KWallet on Plasma options = !lto - source = https://commondatastorage.googleapis.com/chromium-browser-official/chromium-121.0.6167.184.tar.xz + source = https://commondatastorage.googleapis.com/chromium-browser-official/chromium-122.0.6261.39.tar.xz source = https://github.com/foutrelis/chromium-launcher/archive/v8/chromium-launcher-8.tar.gz - source = https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/121/chromium-patches-121.tar.bz2 + source = https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/122/chromium-patches-122.tar.bz2 + source = support-ICU-74-in-LazyTextBreakIterator.patch source = REVERT-simplify-blink-NativeValueTraitsBase.patch - source = icu-74.patch - source = chromium-121-constexpr.patch + source = REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch + source = chromium-constexpr.patch source = drop-flags-unsupported-by-clang16.patch source = compiler-rt-16.patch source = use-oauth2-client-switches-as-default.patch - sha256sums = 9fd6b82e7077ac26ec264bfcfc8ac8e0c2a0240378f035c9c0f34ad467aef09d + sha256sums = 30fc98bdb497d98e63fcb4d8e76acf5201eddf7e65ee907ecf4041cc8e121be3 sha256sums = 213e50f48b67feb4441078d50b0fd431df34323be15be97c55302d3fdac4483a - sha256sums = e9113c1ed2900b84b488e608774ce25212d3c60094abdae005d8a943df9b505e + sha256sums = 1f6acf165578288dc84edc7d9dcfabf7d38f55153b63a37ee5afa929f0e2baad + sha256sums = 8c256b2a9498a63706a6e7a55eadbeb8cc814be66a75e49aec3716c6be450c6c sha256sums = 318df8f8662071cebcdf953698408058e17f59f184500b7e12e01a04a4206b50 - sha256sums = ff9ebd86b0010e1c604d47303ab209b1d76c3e888c423166779cefbc22de297f - sha256sums = 09677c39ff9b910c732a049252969bfa03587e70502765d68b0345bac396c0b2 - sha256sums = 8d1cdf3ddd8ff98f302c90c13953f39cd804b3479b13b69b8ef138ac57c83556 + sha256sums = 00e06b889e4face0ef41293233ce55bd52064ab040f1fdd84aa19525f8ac3601 + sha256sums = a061f83e2b628927feb4dbc441eb54f8b8c3d81348e447cf3b90755d7cda5f54 + sha256sums = 53774fd7f807ad42f77d45cab9e5480cc2bcb0a5c5138110a434407521af9607 sha256sums = 8a2649dcc6ff8d8f24ddbe40dc2a171824f681c6f33c39c4792b645b87c9dcab sha256sums = e393174d7695d0bafed69e868c5fbfecf07aa6969f3b64596d0bae8b067e1711 diff --git a/extra/chromium/PKGBUILD b/extra/chromium/PKGBUILD index b8551ffd1..b90629237 100644 --- a/extra/chromium/PKGBUILD +++ b/extra/chromium/PKGBUILD @@ -15,7 +15,7 @@ highmem=1 pkgname=chromium -pkgver=121.0.6167.184 +pkgver=122.0.6261.39 pkgrel=1 _launcher_ver=8 _manual_clone=0 @@ -39,22 +39,24 @@ options=('!lto') # Chromium adds its own flags for ThinLTO source=(https://commondatastorage.googleapis.com/chromium-browser-official/chromium-$pkgver.tar.xz https://github.com/foutrelis/chromium-launcher/archive/v$_launcher_ver/chromium-launcher-$_launcher_ver.tar.gz https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${pkgver%%.*}/chromium-patches-${pkgver%%.*}.tar.bz2 + support-ICU-74-in-LazyTextBreakIterator.patch REVERT-simplify-blink-NativeValueTraitsBase.patch - icu-74.patch - chromium-121-constexpr.patch + REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch + chromium-constexpr.patch drop-flags-unsupported-by-clang16.patch compiler-rt-16.patch use-oauth2-client-switches-as-default.patch 0001-widevine-support-for-arm.patch 0002-Run-blink-bindings-generation-single-threaded.patch 0003-Fix-eu-strip-build-for-newer-GCC.patch) -sha256sums=('9fd6b82e7077ac26ec264bfcfc8ac8e0c2a0240378f035c9c0f34ad467aef09d' +sha256sums=('30fc98bdb497d98e63fcb4d8e76acf5201eddf7e65ee907ecf4041cc8e121be3' '213e50f48b67feb4441078d50b0fd431df34323be15be97c55302d3fdac4483a' - 'e9113c1ed2900b84b488e608774ce25212d3c60094abdae005d8a943df9b505e' + '1f6acf165578288dc84edc7d9dcfabf7d38f55153b63a37ee5afa929f0e2baad' + '8c256b2a9498a63706a6e7a55eadbeb8cc814be66a75e49aec3716c6be450c6c' '318df8f8662071cebcdf953698408058e17f59f184500b7e12e01a04a4206b50' - 'ff9ebd86b0010e1c604d47303ab209b1d76c3e888c423166779cefbc22de297f' - '09677c39ff9b910c732a049252969bfa03587e70502765d68b0345bac396c0b2' - '8d1cdf3ddd8ff98f302c90c13953f39cd804b3479b13b69b8ef138ac57c83556' + '00e06b889e4face0ef41293233ce55bd52064ab040f1fdd84aa19525f8ac3601' + 'a061f83e2b628927feb4dbc441eb54f8b8c3d81348e447cf3b90755d7cda5f54' + '53774fd7f807ad42f77d45cab9e5480cc2bcb0a5c5138110a434407521af9607' '8a2649dcc6ff8d8f24ddbe40dc2a171824f681c6f33c39c4792b645b87c9dcab' 'e393174d7695d0bafed69e868c5fbfecf07aa6969f3b64596d0bae8b067e1711' 'b5bb3d0e2cd06aa92bb0ea62d6915dac1635cee79e9e1405cf17fe471baa393e' @@ -143,16 +145,15 @@ prepare() { patch -Np1 -i ../use-oauth2-client-switches-as-default.patch # Upstream fixes - - # Fix build with ICU 74 - patch -Np1 -i ../icu-74.patch + patch -Np1 -i ../support-ICU-74-in-LazyTextBreakIterator.patch # Fix "error: defaulted definition of equality comparison operator cannot # be declared constexpr because it invokes a non-constexpr comparison - # function" (patch from Fedora) - patch -Np1 -i ../chromium-121-constexpr.patch + # function" (patch for Chromium 121 from Fedora, later extended for 122) + patch -Np1 -i ../chromium-constexpr.patch # Revert usage of C++20 features which likely need newer clang + patch -Rp1 -i ../REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch patch -Rp1 -i ../REVERT-simplify-blink-NativeValueTraitsBase.patch # Drop compiler flags that need newer clang @@ -164,7 +165,6 @@ prepare() { # Fixes for building with libstdc++ instead of libc++ patch -Np1 -i ../chromium-patches-*/chromium-114-ruy-include.patch patch -Np1 -i ../chromium-patches-*/chromium-117-material-color-include.patch - patch -Np1 -i ../chromium-patches-*/chromium-119-clang16.patch # Link to system tools required by the build mkdir -p third_party/node/linux/node-linux-x64/bin diff --git a/extra/chromium/REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch b/extra/chromium/REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch new file mode 100644 index 000000000..8db4a848a --- /dev/null +++ b/extra/chromium/REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch @@ -0,0 +1,174 @@ +From ce71348a09f6689dd01a68db64b172191d0182d8 Mon Sep 17 00:00:00 2001 +From: Andrey Kosyakov +Date: Thu, 21 Dec 2023 18:38:38 +0000 +Subject: [PATCH] [bindings] Use v8::Array::Iterate for converting script + wrappables + +This changes CreateIDLSequenceFromV8Array to use the new +v8::Array::Iterate() operation. +This speeds up the "execBundles" part of the microbenchmark +at crbug.com/dawn/1858 by around 3x. +This depends on crrev.com/c/4846594 landing (and rolling) first. + +This is a slight re-work of https://crrev.com/c/4847447/3, +originally by jkummerow@chromium.org + +Bug: v8:14218, dawn:1858, 1511239 +Change-Id: Ia266556d05b4d53e6942e12609d1c08882b4ff0f +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5132129 +Commit-Queue: Andrey Kosyakov +Reviewed-by: Yuki Shiino +Cr-Commit-Position: refs/heads/main@{#1240236} +--- + .../bindings/core/v8/native_value_traits.h | 6 ++ + .../core/v8/native_value_traits_impl.h | 91 ++++++++++++++++++- + 2 files changed, 95 insertions(+), 2 deletions(-) + +diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h +index 1e5a0790df6d..a5c28b37e945 100644 +--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits.h ++++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits.h +@@ -84,6 +84,12 @@ struct NativeValueTraitsBase { + std::is_pointer_v || + requires(ImplType value) { value.IsNull(); }; + ++ // This should only be true for certain subclasses of ScriptWrappable ++ // that satisfy the assumptions of CreateIDLSequenceFromV8ArraySlow() with ++ // regards to how NativeValue() is implemented for the underlying type. ++ static constexpr bool supports_scriptwrappable_specific_fast_array_iteration = ++ false; ++ + template + static decltype(auto) ArgumentValue(v8::Isolate* isolate, + int argument_index, +diff --git a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h +index 5011503dcf1c..f085b6e90516 100644 +--- a/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h ++++ b/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h +@@ -1037,10 +1037,86 @@ CreateIDLSequenceFromV8ArraySlow(v8::Isolate* isolate, + return {}; + } + +- typename NativeValueTraits>::ImplType result; ++ using ResultType = typename NativeValueTraits>::ImplType; ++ ResultType result; + result.ReserveInitialCapacity(length); + v8::Local current_context = isolate->GetCurrentContext(); + v8::TryCatch try_block(isolate); ++ ++ // Fast path -- we're creating a sequence of script wrappables, which can be ++ // done by directly getting underlying object as long as array types are ++ // homogeneous. With ScriptWrappables, we don't expect to enter JS during ++ // iteration, so we can rely on v8::Array::Iterate() which is much faster than ++ // iterating an array on the client side of the v8. Additionally, for most ++ // subsptyes of ScriptWrappables, we can speed up type checks (see more on ++ // that below next to supports_scriptwrappable_specific_fast_array_iteration ++ // check. ++ if constexpr (std::is_base_of_v) { ++ struct CallbackData { ++ STACK_ALLOCATED(); ++ ++ public: ++ v8::Isolate* isolate; ++ v8::TypecheckWitness witness; ++ ResultType& result; ++ ExceptionState& exception_state; ++ CallbackData(v8::Isolate* isolate, ++ ResultType& result, ++ ExceptionState& exception_state) ++ : isolate(isolate), ++ witness(isolate), ++ result(result), ++ exception_state(exception_state) {} ++ }; ++ ++ CallbackData callback_data(isolate, result, exception_state); ++ v8::Array::IterationCallback callback = [](uint32_t index, ++ v8::Local v8_element, ++ void* data) { ++ CallbackData* callback_data = reinterpret_cast(data); ++ // 3.4. Initialize Si to the result of converting nextItem to an IDL value ++ // of type T. ++ v8::TypecheckWitness& witness = callback_data->witness; ++ // We can speed up type check by taking advantage of V8's type witness, ++ // provided traits' NativeValue implementation doesn't have additional ++ // logic beyond checking the type and calling ToScriptWrappable(). ++ if constexpr ( ++ NativeValueTraits< ++ T>::supports_scriptwrappable_specific_fast_array_iteration) { ++ if (witness.Matches(v8_element)) { ++ auto&& value = ToScriptWrappable(v8_element.As()) ++ ->template ToImpl(); ++ callback_data->result.push_back(std::move(value)); ++ return v8::Array::CallbackResult::kContinue; ++ } ++ } ++ auto&& element = NativeValueTraits::NativeValue( ++ callback_data->isolate, v8_element, callback_data->exception_state); ++ if (callback_data->exception_state.HadException()) { ++ // It doesn't matter whether we return `kException` or `kBreak` here, ++ // as that only affects the return value of `v8_array->Iterate()`, ++ // which we are ignoring. ++ return v8::Array::CallbackResult::kException; ++ } ++ if constexpr ( ++ NativeValueTraits< ++ T>::supports_scriptwrappable_specific_fast_array_iteration) { ++ witness.Update(v8_element); ++ } ++ callback_data->result.push_back(std::move(element)); ++ return v8::Array::CallbackResult::kContinue; ++ }; ++ if (!v8_array->Iterate(current_context, callback, &callback_data) ++ .IsJust()) { ++ if (try_block.HasCaught()) { ++ exception_state.RethrowV8Exception(try_block.Exception()); ++ } ++ DCHECK(exception_state.HadException()); ++ return {}; ++ } ++ return result; ++ } ++ + // Array length may change if array is mutated during iteration. + for (uint32_t i = 0; i < v8_array->Length(); ++i) { + v8::Local v8_element; +@@ -1056,6 +1132,7 @@ CreateIDLSequenceFromV8ArraySlow(v8::Isolate* isolate, + return {}; + result.push_back(std::move(element)); + } ++ + // 3.2. If next is false, then return an IDL sequence value of type + // sequence of length i, where the value of the element at index j is Sj. + return result; +@@ -1398,6 +1475,7 @@ struct NativeValueTraits : public NativeValueTraitsBase { + } + }; + ++// Interface types + template + requires std::derived_from + struct NativeValueTraits> +@@ -1470,12 +1548,21 @@ struct NativeValueTraits : public NativeValueTraitsBase { + template + requires std::derived_from + struct NativeValueTraits : public NativeValueTraitsBase { ++ // This signifies that CreateIDLSequenceFromV8ArraySlow() may apply ++ // certain optimization based on assumptions about `NativeValue()` ++ // implementation below. For subclasses of ScriptWrappable that have ++ // different implementation of NativeValue(), this should remain false. ++ static constexpr bool supports_scriptwrappable_specific_fast_array_iteration = ++ true; ++ + static inline T* NativeValue(v8::Isolate* isolate, + v8::Local value, + ExceptionState& exception_state) { + const WrapperTypeInfo* wrapper_type_info = T::GetStaticWrapperTypeInfo(); +- if (V8PerIsolateData::From(isolate)->HasInstance(wrapper_type_info, value)) ++ if (V8PerIsolateData::From(isolate)->HasInstance(wrapper_type_info, ++ value)) { + return ToScriptWrappable(value.As())->template ToImpl(); ++ } + + bindings::NativeValueTraitsInterfaceNotOfType(wrapper_type_info, + exception_state); diff --git a/extra/chromium/chromium-121-constexpr.patch b/extra/chromium/chromium-121-constexpr.patch deleted file mode 100644 index a0b7166a5..000000000 --- a/extra/chromium/chromium-121-constexpr.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up chromium-121.0.6167.57/components/performance_manager/resource_attribution/query_params.h.me chromium-121.0.6167.57/components/performance_manager/resource_attribution/query_params.h ---- chromium-121.0.6167.57/components/performance_manager/resource_attribution/query_params.h.me 2024-01-18 17:00:24.791582422 +0100 -+++ chromium-121.0.6167.57/components/performance_manager/resource_attribution/query_params.h 2024-01-18 17:22:21.521682845 +0100 -@@ -27,7 +27,7 @@ struct QueryParams { - QueryParams(const QueryParams& other); - QueryParams& operator=(const QueryParams& other); - -- friend constexpr bool operator==(const QueryParams&, -+ friend bool operator==(const QueryParams&, - const QueryParams&) = default; - - // Individual resource contexts to measure. diff --git a/extra/chromium/chromium-constexpr.patch b/extra/chromium/chromium-constexpr.patch new file mode 100644 index 000000000..35acd392c --- /dev/null +++ b/extra/chromium/chromium-constexpr.patch @@ -0,0 +1,48 @@ +diff --git a/base/types/strong_alias.h b/base/types/strong_alias.h +index 9f80b7fc8adf..4d28bd195c8a 100644 +--- a/base/types/strong_alias.h ++++ b/base/types/strong_alias.h +@@ -110,7 +110,7 @@ class StrongAlias { + // a `StrongAlias`. + friend constexpr auto operator<=>(const StrongAlias& lhs, + const StrongAlias& rhs) = default; +- friend constexpr bool operator==(const StrongAlias& lhs, ++ friend bool operator==(const StrongAlias& lhs, + const StrongAlias& rhs) = default; + + // Hasher to use in std::unordered_map, std::unordered_set, etc. +diff --git a/components/autofill/core/common/unique_ids.h b/components/autofill/core/common/unique_ids.h +index eb8d5d2c8ec9..6bfabf286379 100644 +--- a/components/autofill/core/common/unique_ids.h ++++ b/components/autofill/core/common/unique_ids.h +@@ -137,7 +137,7 @@ struct GlobalId { + + friend constexpr auto operator<=>(const GlobalId& lhs, + const GlobalId& rhs) = default; +- friend constexpr bool operator==(const GlobalId& lhs, ++ friend bool operator==(const GlobalId& lhs, + const GlobalId& rhs) = default; + }; + +diff --git a/components/performance_manager/resource_attribution/query_params.h b/components/performance_manager/resource_attribution/query_params.h +index 4616f1665e91..679dfcabe999 100644 +--- a/components/performance_manager/resource_attribution/query_params.h ++++ b/components/performance_manager/resource_attribution/query_params.h +@@ -29,7 +29,7 @@ class ContextCollection { + ContextCollection(const ContextCollection& other); + ContextCollection& operator=(const ContextCollection& other); + +- friend constexpr bool operator==(const ContextCollection&, ++ friend bool operator==(const ContextCollection&, + const ContextCollection&) = default; + + // Adds `context` to the collection. +@@ -67,7 +67,7 @@ struct QueryParams { + QueryParams(const QueryParams& other); + QueryParams& operator=(const QueryParams& other); + +- friend constexpr bool operator==(const QueryParams&, ++ friend bool operator==(const QueryParams&, + const QueryParams&) = default; + + // Resource types to measure. diff --git a/extra/chromium/drop-flags-unsupported-by-clang16.patch b/extra/chromium/drop-flags-unsupported-by-clang16.patch index a180426eb..a146a6d5e 100644 --- a/extra/chromium/drop-flags-unsupported-by-clang16.patch +++ b/extra/chromium/drop-flags-unsupported-by-clang16.patch @@ -1,8 +1,8 @@ diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn -index 80bc79e5fb3..13b200e4cb0 100644 +index 89b4755ac8b3..94b457385663 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn -@@ -616,24 +616,6 @@ config("compiler") { +@@ -618,24 +618,6 @@ config("compiler") { } } @@ -27,25 +27,14 @@ index 80bc79e5fb3..13b200e4cb0 100644 # TODO(crbug.com/1235145): Investigate why/if this should be needed. if (is_win) { cflags += [ "/clang:-ffp-contract=off" ] -@@ -768,7 +750,6 @@ config("compiler") { - ldflags += [ - "/opt:lldltojobs=all", - "-mllvm:-import-instr-limit=$import_instr_limit", -- "-mllvm:-disable-auto-upgrade-debug-info", - ] - } else { - ldflags += [ "-flto=thin" ] -@@ -800,13 +781,6 @@ config("compiler") { +@@ -802,10 +784,6 @@ config("compiler") { if (is_apple) { ldflags += [ "-Wcrl,object_path_lto" ] } -- if (!is_chromeos) { -- # TODO(https://crbug.com/972449): turn on for ChromeOS when that -- # toolchain has this flag. -- # We only use one version of LLVM within a build so there's no need to -- # upgrade debug info, which can be expensive since it runs the verifier. -- ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ] -- } +- +- # We only use one version of LLVM within a build so there's no need to +- # upgrade debug info, which can be expensive since it runs the verifier. +- ldflags += [ "-Wl,-mllvm,-disable-auto-upgrade-debug-info" ] } # TODO(https://crbug.com/1211155): investigate why this isn't effective on diff --git a/extra/chromium/icu-74.patch b/extra/chromium/icu-74.patch deleted file mode 100644 index efb8fb161..000000000 --- a/extra/chromium/icu-74.patch +++ /dev/null @@ -1,21 +0,0 @@ -https://bugs.gentoo.org/917645 -(copied patch from qtwebengine:6 - https://bugs.gentoo.org/917633) - -Quick fix for a static_assert failure with icu74. Still waiting -for a proper upstream fix and unknown if entirely right, but is -an extension of [1] (is now 48 rather than 43). - -[1] https://crrev.com/e60b571faa3f14dd9119a6792dccf12f8bf80192 ---- a/third_party/blink/renderer/platform/text/text_break_iterator.cc -+++ b/third_party/blink/renderer/platform/text/text_break_iterator.cc -@@ -161,7 +161,9 @@ static const unsigned char kAsciiLineBreakTable[][(kAsciiLineBreakTableLastChar - }; - // clang-format on - --#if U_ICU_VERSION_MAJOR_NUM >= 58 -+#if U_ICU_VERSION_MAJOR_NUM >= 74 -+#define BA_LB_COUNT (U_LB_COUNT - 8) -+#elif U_ICU_VERSION_MAJOR_NUM >= 58 - #define BA_LB_COUNT (U_LB_COUNT - 3) - #else - #define BA_LB_COUNT U_LB_COUNT diff --git a/extra/chromium/support-ICU-74-in-LazyTextBreakIterator.patch b/extra/chromium/support-ICU-74-in-LazyTextBreakIterator.patch new file mode 100644 index 000000000..fd36b2e07 --- /dev/null +++ b/extra/chromium/support-ICU-74-in-LazyTextBreakIterator.patch @@ -0,0 +1,148 @@ +From f62990fb134b7e610502b6804945debaa51960a5 Mon Sep 17 00:00:00 2001 +From: Koji Ishii +Date: Fri, 9 Feb 2024 18:47:02 +0000 +Subject: [PATCH] Support ICU 74 in `LazyTextBreakIterator` + +This patch extends the `kBreakAllLineBreakClassTable` table +for 5 new LineBreak classes in ICU 74. + +They are for Brahmic scripts, which "line breaks can occur at +the boundaries of any orthographic syllable"[1]. The +`break-all` has no additional break opportunities that all +entries are `0`. + +This patch also adds `0` for 3 classes added in ICU 58[2], +instead of doing so in code, to make future additions +possible. + +[1] https://unicode.org/reports/tr14/#BreakOpportunities +[2] https://chromiumcodereview.appspot.com/2440923002 + +Bug: 324419151 +Change-Id: I8002edb927280f63b5b668b09076cc71feaeac3e +Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5279337 +Auto-Submit: Koji Ishii +Commit-Queue: Ian Kilpatrick +Reviewed-by: Ian Kilpatrick +Cr-Commit-Position: refs/heads/main@{#1258643} +--- + .../platform/text/text_break_iterator.cc | 98 ++++++++++--------- + 1 file changed, 53 insertions(+), 45 deletions(-) + +diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.cc b/third_party/blink/renderer/platform/text/text_break_iterator.cc +index 703dc2399075..38ab94a0a460 100644 +--- a/third_party/blink/renderer/platform/text/text_break_iterator.cc ++++ b/third_party/blink/renderer/platform/text/text_break_iterator.cc +@@ -161,11 +161,7 @@ static const unsigned char kAsciiLineBreakTable[][(kAsciiLineBreakTableLastChar + }; + // clang-format on + +-#if U_ICU_VERSION_MAJOR_NUM >= 58 +-#define BA_LB_COUNT (U_LB_COUNT - 3) +-#else + #define BA_LB_COUNT U_LB_COUNT +-#endif + // Line breaking table for CSS word-break: break-all. This table differs from + // asciiLineBreakTable in: + // - Indices are Line Breaking Classes defined in UAX#14 Unicode Line Breaking +@@ -174,47 +170,59 @@ static const unsigned char kAsciiLineBreakTable[][(kAsciiLineBreakTableLastChar + // normal line break, not "prohibit break." + // clang-format off + static const unsigned char kBreakAllLineBreakClassTable[][BA_LB_COUNT / 8 + 1] = { +- // XX AI AL B2 BA BB BK CB CL CM CR EX GL HY ID IN IS LF NS NU OP PO PR QU SA SG SP SY ZW NL WJ H2 H3 JL JT JV CP CJ HL RI +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // XX +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // AI +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // AL +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // B2 +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // BA +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // BB +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // BK +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CB +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // CL +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CM +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CR +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 1, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // EX +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // GL +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 1, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // HY +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // ID +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // IN +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // IS +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // LF +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // NS +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // NU +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // OP +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 1, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // PO +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // PR +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // QU +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // SA +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // SG +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // SP +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // SY +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // ZW +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // NL +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // WJ +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // H2 +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // H3 +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // JL +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // JT +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // JV +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // CP +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CJ +- { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0) }, // HL +- { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // RI ++ // XX AI AL B2 BA BB BK CB CL CM CR EX GL HY ID IN IS LF NS NU OP PO PR QU SA SG SP SY ZW NL WJ H2 H3 JL JT JV CP CJ HL RI EB EM ZWJ AK AP AS VF VI ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // XX ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // AI ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // AL ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // B2 ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // BA ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // BB ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // BK ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CB ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CL ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CM ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CR ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 1, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // EX ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // GL ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 1, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // HY ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // ID ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // IN ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // IS ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // LF ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // NS ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // NU ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // OP ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 1, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // PO ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // PR ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // QU ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // SA ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // SG ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // SP ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // SY ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // ZW ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // NL ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // WJ ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // H2 ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // H3 ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // JL ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // JT ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // JV ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 0, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CP ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // CJ ++ { B(0, 1, 1, 0, 1, 0, 0, 0), B(0, 0, 0, 0, 0, 1, 0, 0), B(0, 0, 0, 1, 1, 0, 1, 0), B(1, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 1, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // HL ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // RI ++ // Added in ICU 58. ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // EB ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // EM ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // ZWJ ++#if U_ICU_VERSION_MAJOR_NUM >= 74 ++ // Added in ICU 74. https://icu.unicode.org/download/74 ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // AK ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // AP ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // AS ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // VF ++ { B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0), B(0, 0, 0, 0, 0, 0, 0, 0) }, // VI ++#endif // U_ICU_VERSION_MAJOR_NUM >= 74 + }; + // clang-format on +