summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorgraysky2024-02-23 14:19:16 -0500
committergraysky2024-02-23 14:19:16 -0500
commit4ef757d7d8e9e461f81837f13a5f42bdacd9732b (patch)
tree674eff98718879279a7bd5631dd2119caa1da05c
parent76a88119c53808938bf8514b0221620b5b1b11c8 (diff)
downloadaur-4ef757d7d8e9e461f81837f13a5f42bdacd9732b.tar.gz
Update to 122.0.6261.57-1
-rw-r--r--.SRCINFO24
-rw-r--r--PKGBUILD28
-rw-r--r--REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch174
-rw-r--r--chromium-121-constexpr.patch12
-rw-r--r--chromium-constexpr.patch48
-rw-r--r--drop-flags-unsupported-by-clang16.patch25
-rw-r--r--icu-74.patch21
-rw-r--r--support-ICU-74-in-LazyTextBreakIterator.patch148
8 files changed, 404 insertions, 76 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 547a4898f5dc..d33cc92eb428 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = chromium-no-extras
pkgdesc = Chromium without hangout services, widevine, or chromedriver
- pkgver = 121.0.6167.184
+ pkgver = 122.0.6261.57
pkgrel = 1
url = https://www.chromium.org/Home
arch = x86_64
@@ -52,25 +52,27 @@ pkgbase = chromium-no-extras
optdepends = gtk4: for --gtk-version=4 (GTK4 IME might work better on Wayland)
optdepends = org.freedesktop.secrets: password storage backend on GNOME / Xfce
optdepends = kwallet: support for storing passwords in KWallet on Plasma
- provides = chromium=121.0.6167.184
+ provides = chromium=122.0.6261.57
conflicts = chromium
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.57.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 = 1594635f8c2db05c8d17f9f2e591b554eaf821a1a2249c271e91926db49fa7cd
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/PKGBUILD b/PKGBUILD
index 8cac187d354b..ea60a1c313e7 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -6,7 +6,7 @@
_pkgname=chromium
pkgname=chromium-no-extras
-pkgver=121.0.6167.184
+pkgver=122.0.6261.57
pkgrel=1
_launcher_ver=8
_manual_clone=0
@@ -32,19 +32,21 @@ 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)
-sha256sums=('9fd6b82e7077ac26ec264bfcfc8ac8e0c2a0240378f035c9c0f34ad467aef09d'
+sha256sums=('1594635f8c2db05c8d17f9f2e591b554eaf821a1a2249c271e91926db49fa7cd'
'213e50f48b67feb4441078d50b0fd431df34323be15be97c55302d3fdac4483a'
- 'e9113c1ed2900b84b488e608774ce25212d3c60094abdae005d8a943df9b505e'
+ '1f6acf165578288dc84edc7d9dcfabf7d38f55153b63a37ee5afa929f0e2baad'
+ '8c256b2a9498a63706a6e7a55eadbeb8cc814be66a75e49aec3716c6be450c6c'
'318df8f8662071cebcdf953698408058e17f59f184500b7e12e01a04a4206b50'
- 'ff9ebd86b0010e1c604d47303ab209b1d76c3e888c423166779cefbc22de297f'
- '09677c39ff9b910c732a049252969bfa03587e70502765d68b0345bac396c0b2'
- '8d1cdf3ddd8ff98f302c90c13953f39cd804b3479b13b69b8ef138ac57c83556'
+ '00e06b889e4face0ef41293233ce55bd52064ab040f1fdd84aa19525f8ac3601'
+ 'a061f83e2b628927feb4dbc441eb54f8b8c3d81348e447cf3b90755d7cda5f54'
+ '53774fd7f807ad42f77d45cab9e5480cc2bcb0a5c5138110a434407521af9607'
'8a2649dcc6ff8d8f24ddbe40dc2a171824f681c6f33c39c4792b645b87c9dcab'
'e393174d7695d0bafed69e868c5fbfecf07aa6969f3b64596d0bae8b067e1711')
@@ -124,16 +126,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
@@ -145,7 +146,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/REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch b/REVERT-use-v8-Array-Iterate-for-converting-script-wrappables.patch
new file mode 100644
index 000000000000..8db4a848aed4
--- /dev/null
+++ b/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 <caseq@chromium.org>
+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 <caseq@chromium.org>
+Reviewed-by: Yuki Shiino <yukishiino@chromium.org>
+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<ImplType> ||
+ 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 <typename... ExtraArgs>
+ 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<IDLSequence<T>>::ImplType result;
++ using ResultType = typename NativeValueTraits<IDLSequence<T>>::ImplType;
++ ResultType result;
+ result.ReserveInitialCapacity(length);
+ v8::Local<v8::Context> 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<ScriptWrappable, T>) {
++ 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::Value> v8_element,
++ void* data) {
++ CallbackData* callback_data = reinterpret_cast<CallbackData*>(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<v8::Object>())
++ ->template ToImpl<T>();
++ callback_data->result.push_back(std::move(value));
++ return v8::Array::CallbackResult::kContinue;
++ }
++ }
++ auto&& element = NativeValueTraits<T>::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::Value> 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<T> of length i, where the value of the element at index j is Sj.
+ return result;
+@@ -1398,6 +1475,7 @@ struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
+ }
+ };
+
++// Interface types
+ template <typename T>
+ requires std::derived_from<T, CallbackInterfaceBase>
+ struct NativeValueTraits<IDLNullable<T>>
+@@ -1470,12 +1548,21 @@ struct NativeValueTraits<T> : public NativeValueTraitsBase<T> {
+ template <typename T>
+ requires std::derived_from<T, ScriptWrappable>
+ struct NativeValueTraits<T> : public NativeValueTraitsBase<T*> {
++ // 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<v8::Value> 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<v8::Object>())->template ToImpl<T>();
++ }
+
+ bindings::NativeValueTraitsInterfaceNotOfType(wrapper_type_info,
+ exception_state);
diff --git a/chromium-121-constexpr.patch b/chromium-121-constexpr.patch
deleted file mode 100644
index a0b7166a5c8f..000000000000
--- a/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/chromium-constexpr.patch b/chromium-constexpr.patch
new file mode 100644
index 000000000000..35acd392c3ec
--- /dev/null
+++ b/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<W>`.
+ 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<RendererId>& lhs,
+ const GlobalId<RendererId>& rhs) = default;
+- friend constexpr bool operator==(const GlobalId<RendererId>& lhs,
++ friend bool operator==(const GlobalId<RendererId>& lhs,
+ const GlobalId<RendererId>& 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/drop-flags-unsupported-by-clang16.patch b/drop-flags-unsupported-by-clang16.patch
index a180426eb856..a146a6d5ee49 100644
--- a/drop-flags-unsupported-by-clang16.patch
+++ b/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/icu-74.patch b/icu-74.patch
deleted file mode 100644
index efb8fb161c61..000000000000
--- a/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/support-ICU-74-in-LazyTextBreakIterator.patch b/support-ICU-74-in-LazyTextBreakIterator.patch
new file mode 100644
index 000000000000..fd36b2e07bfc
--- /dev/null
+++ b/support-ICU-74-in-LazyTextBreakIterator.patch
@@ -0,0 +1,148 @@
+From f62990fb134b7e610502b6804945debaa51960a5 Mon Sep 17 00:00:00 2001
+From: Koji Ishii <kojii@chromium.org>
+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 <kojii@chromium.org>
+Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
+Reviewed-by: Ian Kilpatrick <ikilpatrick@chromium.org>
+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
+