pkgsrc-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

CVS commit: pkgsrc



Module Name:    pkgsrc
Committed By:   wiz
Date:           Wed Nov 11 11:48:37 UTC 2026

Modified Files:
        pkgsrc/lang/nodejs: distinfo
        pkgsrc/lang/nodejs22: Makefile distinfo
        pkgsrc/lang/nodejs24: distinfo
        pkgsrc/www/qt6-qtwebengine: Makefile distinfo
        pkgsrc/x11/qt5-qtwebengine: distinfo
Added Files:
        pkgsrc/lang/nodejs/patches:
            patch-deps_v8_src_regexp_gen-regexp-special-case.cc
            patch-deps_v8_src_regexp_regexp-parser.cc
            patch-deps_v8_src_regexp_special-case.h
        pkgsrc/lang/nodejs22/patches:
            patch-deps_v8_src_regexp_gen-regexp-special-case.cc
            patch-deps_v8_src_regexp_regexp-parser.cc
            patch-deps_v8_src_regexp_special-case.h
        pkgsrc/lang/nodejs24/patches:
            patch-deps_v8_src_regexp_gen-regexp-special-case.cc
            patch-deps_v8_src_regexp_regexp-parser.cc
            patch-deps_v8_src_regexp_special-case.h
        pkgsrc/x11/qt5-qtwebengine/patches:
            patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc
            patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc
            patch-src_3rdparty_chromium_v8_src_regexp_special-case.h

Log Message:
*: add patches for icu 79 compatibility


To generate a diff of this commit:
cvs rdiff -u -r1.337 -r1.338 pkgsrc/lang/nodejs/distinfo
cvs rdiff -u -r0 -r1.1 \
    pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc \
    pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_regexp-parser.cc \
    pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_special-case.h
cvs rdiff -u -r1.28 -r1.29 pkgsrc/lang/nodejs22/Makefile
cvs rdiff -u -r1.26 -r1.27 pkgsrc/lang/nodejs22/distinfo
cvs rdiff -u -r0 -r1.1 \
    pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc \
    pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_regexp-parser.cc \
    pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_special-case.h
cvs rdiff -u -r1.21 -r1.22 pkgsrc/lang/nodejs24/distinfo
cvs rdiff -u -r0 -r1.1 \
    pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc \
    pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_regexp-parser.cc \
    pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_special-case.h
cvs rdiff -u -r1.20 -r1.21 pkgsrc/www/qt6-qtwebengine/Makefile
cvs rdiff -u -r1.10 -r1.11 pkgsrc/www/qt6-qtwebengine/distinfo
cvs rdiff -u -r1.37 -r1.38 pkgsrc/x11/qt5-qtwebengine/distinfo
cvs rdiff -u -r0 -r1.1 \
    pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc \
    pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc \
    pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_special-case.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: pkgsrc/lang/nodejs/distinfo
diff -u pkgsrc/lang/nodejs/distinfo:1.337 pkgsrc/lang/nodejs/distinfo:1.338
--- pkgsrc/lang/nodejs/distinfo:1.337   Thu Oct 29 10:26:59 2026
+++ pkgsrc/lang/nodejs/distinfo Wed Nov 11 11:48:36 2026
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.337 2026/10/29 10:26:59 adam Exp $
+$NetBSD: distinfo,v 1.338 2026/11/11 11:48:36 wiz Exp $
 
 BLAKE2s (node-v26.13.0.tar.xz) = 53ee857343785aca9e6b227094b78f6791b027d21db3a08f85d88b323fa1ca0f
 SHA512 (node-v26.13.0.tar.xz) = b26477a172f99513c03ec9bb32f7f72bf88c05443acc2383a6c4bc28f796061ba81f78358353bc4aeaf77d7e2de818746503ac287a2ff74032ee1d261d0388e6
@@ -15,6 +15,9 @@ SHA1 (patch-deps_v8_src_base_platform_se
 SHA1 (patch-deps_v8_src_base_strings.h) = 4d2b37491f2f74f1a573f8c1942790204e23a8bb
 SHA1 (patch-deps_v8_src_codegen_arm_cpu-arm.cc) = 84c75d61bc99c2ff9adeac3152f5b11ebb0e582b
 SHA1 (patch-deps_v8_src_common_globals.h) = 86637724864389f2b24251904de41669a2f00fbc
+SHA1 (patch-deps_v8_src_regexp_gen-regexp-special-case.cc) = e96996cfc6171cebeabd0a887739df7888fd3e73
+SHA1 (patch-deps_v8_src_regexp_regexp-parser.cc) = b00e8184f51496798b9da8b28b0e31289bfc3693
+SHA1 (patch-deps_v8_src_regexp_special-case.h) = bdea3389166d7f5ef2ad45dffabc067429278e0b
 SHA1 (patch-deps_v8_src_strings_string-hasher.cc) = 655d497ba45c073b79527b3733ecff4e6aab8ddf
 SHA1 (patch-deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc) = ccca21704265f98801bb97968b51c1432136b556
 SHA1 (patch-deps_v8_tools_profiling_run-llprof.sh) = b19994d3195cc97424a3cc2ffd3ae02eacc6ffa8

Index: pkgsrc/lang/nodejs22/Makefile
diff -u pkgsrc/lang/nodejs22/Makefile:1.28 pkgsrc/lang/nodejs22/Makefile:1.29
--- pkgsrc/lang/nodejs22/Makefile:1.28  Thu Oct 22 11:17:46 2026
+++ pkgsrc/lang/nodejs22/Makefile       Wed Nov 11 11:48:36 2026
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.28 2026/10/22 11:17:46 adam Exp $
+# $NetBSD: Makefile,v 1.29 2026/11/11 11:48:36 wiz Exp $
 
 DISTNAME=      node-v22.23.4
 EXTRACT_SUFX=  .tar.xz
@@ -32,6 +32,9 @@ post-install: minusx
 minusx:
        ${CHMOD} -x ${DESTDIR}${PREFIX}/lib/node_modules/corepack/shims/*.cmd
 
+# "Please use python3.14 or python3.13 or python3.12 or python3.11 or python3.10 or python3.9 or python3.8."
+PYTHON_VERSIONS_INCOMPATIBLE=  315
+
 .include "../../lang/nodejs/options.mk"
 
 # Node turns on -latomic for arm, mips and ppc.

Index: pkgsrc/lang/nodejs22/distinfo
diff -u pkgsrc/lang/nodejs22/distinfo:1.26 pkgsrc/lang/nodejs22/distinfo:1.27
--- pkgsrc/lang/nodejs22/distinfo:1.26  Thu Oct 22 11:17:46 2026
+++ pkgsrc/lang/nodejs22/distinfo       Wed Nov 11 11:48:36 2026
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.26 2026/10/22 11:17:46 adam Exp $
+$NetBSD: distinfo,v 1.27 2026/11/11 11:48:36 wiz Exp $
 
 BLAKE2s (node-v22.23.4.tar.xz) = 626a831649961835db4106e52eb7bd2ea41b1ce63e656b8dacbaddf02ae10735
 SHA512 (node-v22.23.4.tar.xz) = b35ec69ff34f12ea79de6f95522e69c15d44f39ff2f58f5b4e56dc5ab853db4e9ca7ae2605554b4fdd9bdcea64cf923f3c3aef31a72a78838b9d68e0fc41965b
@@ -17,6 +17,9 @@ SHA1 (patch-deps_v8_src_codegen_arm_cpu-
 SHA1 (patch-deps_v8_src_common_globals.h) = 86637724864389f2b24251904de41669a2f00fbc
 SHA1 (patch-deps_v8_src_compiler_types.h) = 2a212282ab9d71e98ae56827fdb1d9778a6047a5
 SHA1 (patch-deps_v8_src_heap_code-range.cc) = b281f76f4e3d8e562f596235049a6be7c5ff4de2
+SHA1 (patch-deps_v8_src_regexp_gen-regexp-special-case.cc) = e96996cfc6171cebeabd0a887739df7888fd3e73
+SHA1 (patch-deps_v8_src_regexp_regexp-parser.cc) = 9cc23522a205ba1dd1bacf2e93e7ea8708d97ff6
+SHA1 (patch-deps_v8_src_regexp_special-case.h) = bdea3389166d7f5ef2ad45dffabc067429278e0b
 SHA1 (patch-deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc) = bba375652b00a412b1051eedb26432126605718e
 SHA1 (patch-deps_v8_tools_profiling_run-llprof.sh) = b19994d3195cc97424a3cc2ffd3ae02eacc6ffa8
 SHA1 (patch-node.gypi) = 4a104dba6c22702211009bc60a6be6f87554e2fa

Index: pkgsrc/lang/nodejs24/distinfo
diff -u pkgsrc/lang/nodejs24/distinfo:1.21 pkgsrc/lang/nodejs24/distinfo:1.22
--- pkgsrc/lang/nodejs24/distinfo:1.21  Thu Oct 29 10:26:22 2026
+++ pkgsrc/lang/nodejs24/distinfo       Wed Nov 11 11:48:36 2026
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.21 2026/10/29 10:26:22 adam Exp $
+$NetBSD: distinfo,v 1.22 2026/11/11 11:48:36 wiz Exp $
 
 BLAKE2s (node-v24.22.2.tar.xz) = abbed0992ffc28ae468233ac4d53da2c6a391009f1b834c343655a3c7e7deaa7
 SHA512 (node-v24.22.2.tar.xz) = 2ec4c4fbeebda4eb8d6bd1456d95010a7ee4c3cc8f4609efb5301869f220fc42642aa450b5414541be58e4b42b7731a86f6ba5e0212a3d0ba4311175fca60b5c
@@ -18,6 +18,9 @@ SHA1 (patch-deps_v8_src_base_strings.h) 
 SHA1 (patch-deps_v8_src_codegen_arm_cpu-arm.cc) = 84c75d61bc99c2ff9adeac3152f5b11ebb0e582b
 SHA1 (patch-deps_v8_src_common_globals.h) = 86637724864389f2b24251904de41669a2f00fbc
 SHA1 (patch-deps_v8_src_compiler_turboshaft_int64-lowering-reducer.h) = 583f6bf6fd251c8cb177c5bc660898ff9ee1da5d
+SHA1 (patch-deps_v8_src_regexp_gen-regexp-special-case.cc) = e96996cfc6171cebeabd0a887739df7888fd3e73
+SHA1 (patch-deps_v8_src_regexp_regexp-parser.cc) = b00e8184f51496798b9da8b28b0e31289bfc3693
+SHA1 (patch-deps_v8_src_regexp_special-case.h) = bdea3389166d7f5ef2ad45dffabc067429278e0b
 SHA1 (patch-deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc) = 51bfbd80a8157d38e5da434ba6bd2f9b6f7762b2
 SHA1 (patch-deps_v8_tools_profiling_run-llprof.sh) = b19994d3195cc97424a3cc2ffd3ae02eacc6ffa8
 SHA1 (patch-node.gypi) = 4a104dba6c22702211009bc60a6be6f87554e2fa

Index: pkgsrc/www/qt6-qtwebengine/Makefile
diff -u pkgsrc/www/qt6-qtwebengine/Makefile:1.20 pkgsrc/www/qt6-qtwebengine/Makefile:1.21
--- pkgsrc/www/qt6-qtwebengine/Makefile:1.20    Sat Nov  7 19:12:05 2026
+++ pkgsrc/www/qt6-qtwebengine/Makefile Wed Nov 11 11:48:37 2026
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.20 2026/11/07 19:12:05 wiz Exp $
+# $NetBSD: Makefile,v 1.21 2026/11/11 11:48:37 wiz Exp $
 
 DISTNAME=      qtwebengine-everywhere-src-${QTVERSION}
 PKGNAME=       qt6-qtwebengine-${QTVERSION}
@@ -6,6 +6,8 @@ PKGREVISION=    1
 COMMENT=       Qt6 webengine module
 CATEGORIES=    www
 LICENSE=       gnu-lgpl-v3 OR gnu-gpl-v2 OR gnu-gpl-v3
+PATCHFILES=    qtwebengine-6.11.3-icu4c_79-1.patch
+PATCH_SITES=   https://www.linuxfromscratch.org/patches/blfs/svn/
 
 CMAKE_GENERATORS_INCOMPATIBLE= make
 

Index: pkgsrc/www/qt6-qtwebengine/distinfo
diff -u pkgsrc/www/qt6-qtwebengine/distinfo:1.10 pkgsrc/www/qt6-qtwebengine/distinfo:1.11
--- pkgsrc/www/qt6-qtwebengine/distinfo:1.10    Fri Nov  6 09:08:57 2026
+++ pkgsrc/www/qt6-qtwebengine/distinfo Wed Nov 11 11:48:37 2026
@@ -1,8 +1,11 @@
-$NetBSD: distinfo,v 1.10 2026/11/06 09:08:57 adam Exp $
+$NetBSD: distinfo,v 1.11 2026/11/11 11:48:37 wiz Exp $
 
 BLAKE2s (kikadf-chromium-audioio-v130.0.tar.gz) = 45fe07cb8280f81b8ef490059002da426b59fe69b5ebd53951fe1dc3e9495a10
 SHA512 (kikadf-chromium-audioio-v130.0.tar.gz) = 840aed119dc69982f14fd5f4767e144bfc8a66672b660f0f05f5459070d7f6a36b8719ae7c0de049f7345dec39266759aedcdd5ee37aa4e98bcd2b44d06a3a4c
 Size (kikadf-chromium-audioio-v130.0.tar.gz) = 7824 bytes
+BLAKE2s (qtwebengine-6.11.3-icu4c_79-1.patch) = c67e25045e696eb850958268c59bbcf0a2489bb869eb556de0fae9f48ce23f6a
+SHA512 (qtwebengine-6.11.3-icu4c_79-1.patch) = 5d4b4365e86590c7aee4429c62a2d86e9035bfcee46c4bd0e39d70a41ec243861cc66b750ecb26d22b7027460e2c448afaab3f9ed75203cfd3a05e09daa3b086
+Size (qtwebengine-6.11.3-icu4c_79-1.patch) = 7826 bytes
 BLAKE2s (qtwebengine-everywhere-src-6.11.3.tar.xz) = beb5d04b80d347c7b692e6877525ffad51a324ae7fbf89598478483578da476d
 SHA512 (qtwebengine-everywhere-src-6.11.3.tar.xz) = c24f14c9b0b2c15614af89f74f7ea126bbb98e98e80c824cefbeb7be650f0cc226bb8e3bb60edf5fa2ef007c58fd6e19e45592d4fec72131a3c5dd657009e23d
 Size (qtwebengine-everywhere-src-6.11.3.tar.xz) = 580447120 bytes

Index: pkgsrc/x11/qt5-qtwebengine/distinfo
diff -u pkgsrc/x11/qt5-qtwebengine/distinfo:1.37 pkgsrc/x11/qt5-qtwebengine/distinfo:1.38
--- pkgsrc/x11/qt5-qtwebengine/distinfo:1.37    Mon May 25 06:18:16 2026
+++ pkgsrc/x11/qt5-qtwebengine/distinfo Wed Nov 11 11:48:37 2026
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.37 2026/05/25 06:18:16 adam Exp $
+$NetBSD: distinfo,v 1.38 2026/11/11 11:48:37 wiz Exp $
 
 BLAKE2s (qtwebengine-everywhere-opensource-src-5.15.19.tar.xz) = 017a224f994e81829cb694863aa28b9a97d6ad30201053fcd66c4189794b6ec6
 SHA512 (qtwebengine-everywhere-opensource-src-5.15.19.tar.xz) = 1b26848cd5a6720d6ad181cf05501f139686a0fbb8a6e6c2f525a9dc442a94befc88fa13c19b80dcec1d2b1cf4101e07805570911bef90064602bd9ecb488ef0
@@ -844,6 +844,9 @@ SHA1 (patch-src_3rdparty_chromium_v8_gni
 SHA1 (patch-src_3rdparty_chromium_v8_src_api_api.cc) = d563a6b50e5dff265d5a4b1b516de02e7149cab6
 SHA1 (patch-src_3rdparty_chromium_v8_src_base_cpu.cc) = f6ec99bba983bb93e8515478f64681440ffbda1e
 SHA1 (patch-src_3rdparty_chromium_v8_src_base_platform_platform-posix.cc) = 7e587fac8a26a975b33a93aa09ccf9af82afabb7
+SHA1 (patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc) = b31e81272d903f88f23a11ac856a2fdaa5d7cd84
+SHA1 (patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc) = 6482774d38861e0477662472ac3278cec395a4b8
+SHA1 (patch-src_3rdparty_chromium_v8_src_regexp_special-case.h) = f6d1a0cc48ec0db50292be052f56085e09d0aa26
 SHA1 (patch-src_3rdparty_chromium_v8_src_trap-handler_handler-inside-posix.cc) = 01a6e7e6c5cd3a30cbe85e3f418dc36e7884c4b8
 SHA1 (patch-src_3rdparty_chromium_v8_src_trap-handler_handler-inside-posix.h) = a64ca7574cca4cb804e0ca24dd3454507d3d556d
 SHA1 (patch-src_3rdparty_chromium_v8_src_trap-handler_trap-handler.h) = d0b72fff980d5072d2221dd31b2e95526cd33875

Added files:

Index: pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc
diff -u /dev/null pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc      Wed Nov 11 11:48:36 2026
@@ -0,0 +1,103 @@
+$NetBSD: patch-deps_v8_src_regexp_gen-regexp-special-case.cc,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/gen-regexp-special-case.cc.orig 2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/gen-regexp-special-case.cc
+@@ -9,6 +9,7 @@
+ 
+ #include "src/base/strings.h"
+ #include "src/regexp/special-case.h"
++#include "unicode/uchar.h"
+ 
+ namespace v8 {
+ namespace internal {
+@@ -17,6 +18,19 @@ static const base::uc32 kNonBmpStart = 0x10000;
+ static const base::uc32 kSurrogateEnd = 0xdfff;
+ static const base::uc32 kNonBmpStart = 0x10000;
+ 
++// Removes supplementary code points from |set| and returns whether any were
++// present. Since Unicode 18, the case closure of a BMP character can contain
++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH
++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode
++// ignoreCase matching compares UTF-16 code units, so a supplementary code
++// point never matches a BMP character and does not take part in Canonicalize.
++bool RemoveSupplementary(icu::UnicodeSet& set) {
++  constexpr UChar32 kFirstSupplementary = static_cast<UChar32>(kNonBmpStart);
++  if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false;
++  set.remove(kFirstSupplementary, UCHAR_MAX_VALUE);
++  return true;
++}
++
+ // The following code generates "src/regexp/special-case.cc".
+ void PrintSet(std::ofstream& out, const char* name,
+               const icu::UnicodeSet& set) {
+@@ -51,6 +65,7 @@ void PrintSpecial(std::ofstream& out) {
+   icu::UnicodeSet current;
+   icu::UnicodeSet special_add;
+   icu::UnicodeSet ignore;
++  icu::UnicodeSet supplementary_equivalents;
+   UErrorCode status = U_ZERO_ERROR;
+   icu::UnicodeSet upper("[\\p{Lu}]", status);
+   CHECK(U_SUCCESS(status));
+@@ -63,6 +78,7 @@ void PrintSpecial(std::ofstream& out) {
+     }
+     current.set(i, i);
+     current.closeOver(USET_CASE_INSENSITIVE);
++    if (RemoveSupplementary(current)) supplementary_equivalents.add(i);
+ 
+     // Check to see if all characters in the case-folding equivalence
+     // class as defined by UnicodeSet::closeOver all map to the same
+@@ -112,6 +128,7 @@ void PrintSpecial(std::ofstream& out) {
+       UChar32 canonical = RegExpCaseFolding::Canonicalize(c);
+       current.set(c, c);
+       current.closeOver(USET_CASE_INSENSITIVE);
++      RemoveSupplementary(current);
+       current.removeAll(ignore);
+       for (int32_t j = 0; j < current.getRangeCount(); j++) {
+         for (UChar32 c2 = current.getRangeStart(j);
+@@ -124,6 +141,7 @@ void PrintSpecial(std::ofstream& out) {
+ 
+   PrintSet(out, "IgnoreSet", ignore);
+   PrintSet(out, "SpecialAddSet", special_add);
++  PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents);
+ }
+ 
+ void WriteHeader(const char* header_filename) {
Index: pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_regexp-parser.cc
diff -u /dev/null pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_regexp-parser.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_regexp-parser.cc        Wed Nov 11 11:48:36 2026
@@ -0,0 +1,86 @@
+$NetBSD: patch-deps_v8_src_regexp_regexp-parser.cc,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/regexp-parser.cc.orig   2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/regexp-parser.cc
+@@ -10,6 +10,7 @@
+ #include "src/regexp/regexp-ast.h"
+ #include "src/regexp/regexp-macro-assembler.h"
+ #include "src/regexp/regexp.h"
++#include "src/regexp/special-case.h"
+ #include "src/strings/char-predicates-inl.h"
+ #include "src/utils/ostreams.h"
+ #include "src/utils/utils.h"
+@@ -156,6 +157,10 @@ void RegExpTextBuilder::AddCharacter(base::uc16 c) {
+ 
+ void RegExpTextBuilder::AddCharacter(base::uc16 c) {
+   FlushPendingSurrogate();
++  if (NeedsDesugaringForIgnoreCase(c)) {
++    AddClassRangesForDesugaring(c);
++    return;
++  }
+   if (characters_ == nullptr) {
+     characters_ = zone()->New<ZoneList<base::uc16>>(4, zone());
+   }
+@@ -238,15 +243,18 @@ bool RegExpTextBuilder::NeedsDesugaringForUnicode(RegE
+   return false;
+ }
+ 
+-// We only use this for characters made of surrogate pairs.  All other
+-// characters outside of character classes are made case independent in the
+-// code generation.
++// Desugar supplementary characters with case equivalents and BMP characters
++// with supplementary equivalents. Other atoms are folded during code
++// generation.
+ bool RegExpTextBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) {
+ #ifdef V8_INTL_SUPPORT
+   if (IsUnicodeMode() && ignore_case()) {
++    if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) {
++      return RegExpCaseFolding::HasSupplementaryEquivalents(
++          static_cast<base::uc16>(c));
++    }
+     icu::UnicodeSet set(c, c);
+-    set.closeOver(USET_CASE_INSENSITIVE);
+-    set.removeAllStrings();
++    RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode);
+     return set.size() > 1;
+   }
+   // In the case where ICU is not included, we act as if the unicode flag is
Index: pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_special-case.h
diff -u /dev/null pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_special-case.h:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs/patches/patch-deps_v8_src_regexp_special-case.h  Wed Nov 11 11:48:36 2026
@@ -0,0 +1,115 @@
+$NetBSD: patch-deps_v8_src_regexp_special-case.h,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/special-case.h.orig     2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/special-case.h
+@@ -7,8 +7,8 @@
+ 
+ #ifdef V8_INTL_SUPPORT
+ #include "src/base/logging.h"
++#include "src/base/strings.h"
+ #include "src/common/globals.h"
+-
+ #include "unicode/uchar.h"
+ #include "unicode/uniset.h"
+ #include "unicode/unistr.h"
+@@ -71,9 +71,17 @@ namespace internal {
+ // another character. Characters that match no other characters in
+ // their equivalence class are added to IgnoreSet. Characters that
+ // match at least one other character are added to SpecialAddSet.
++// Supplementary code points are ignored throughout: non-unicode matching
++// compares UTF-16 code units, so they can never match a BMP character.
++//
++// The generator additionally emits SupplementaryEquivalentsSet, the BMP
++// characters whose Unicode case closure contains supplementary code points.
++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents.
+ 
+ class RegExpCaseFolding final : public AllStatic {
+  public:
++  enum class Mode { kNonUnicode, kUnicode };
++
+   static const icu::UnicodeSet& IgnoreSet();
+   static const icu::UnicodeSet& SpecialAddSet();
+ 
+@@ -107,6 +115,43 @@ class RegExpCaseFolding final : public AllStatic {
+ 
+     // h. Return cu.
+     return cu;
++  }
++
++  // Close a set of characters under case equivalence, preserving its
++  // original members. Non-unicode inputs must be UTF-16 code units.
++  static void CloseOver(icu::UnicodeSet& set, Mode mode) {
++    if (mode == Mode::kUnicode) {
++      set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++      return;
++    }
++    DCHECK(!set.containsSome(0x10000, 0x10ffff));
++    if (IgnoreSet().containsNone(set)) {
++      CloseOverNonUnicode(set);
++      return;
++    }
++    if (IgnoreSet().containsAll(set)) return;
++    // Ignored characters neither contribute nor acquire equivalents, but
++    // must remain in the result if they were explicitly present.
++    icu::UnicodeSet ignored(set);
++    ignored.retainAll(IgnoreSet());
++    set.removeAll(IgnoreSet());
++    CloseOverNonUnicode(set);
++    set.addAll(ignored);
++  }
++
++  // Whether c has supplementary Unicode case equivalents.
++  static bool HasSupplementaryEquivalents(base::uc16 c) {
++    return SupplementaryEquivalentsSet().contains(c);
++  }
++
++ private:
++  static const icu::UnicodeSet& SupplementaryEquivalentsSet();
++
++  // Requires a set containing no IgnoreSet characters.
++  static void CloseOverNonUnicode(icu::UnicodeSet& set) {
++    set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++    set.removeAll(IgnoreSet());
++    set.remove(0x10000, 0x10ffff);
+   }
+ };
+ 

Index: pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc
diff -u /dev/null pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc    Wed Nov 11 11:48:36 2026
@@ -0,0 +1,103 @@
+$NetBSD: patch-deps_v8_src_regexp_gen-regexp-special-case.cc,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/gen-regexp-special-case.cc.orig 2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/gen-regexp-special-case.cc
+@@ -9,6 +9,7 @@
+ 
+ #include "src/base/strings.h"
+ #include "src/regexp/special-case.h"
++#include "unicode/uchar.h"
+ 
+ namespace v8 {
+ namespace internal {
+@@ -17,6 +18,19 @@ static const base::uc32 kNonBmpStart = 0x10000;
+ static const base::uc32 kSurrogateEnd = 0xdfff;
+ static const base::uc32 kNonBmpStart = 0x10000;
+ 
++// Removes supplementary code points from |set| and returns whether any were
++// present. Since Unicode 18, the case closure of a BMP character can contain
++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH
++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode
++// ignoreCase matching compares UTF-16 code units, so a supplementary code
++// point never matches a BMP character and does not take part in Canonicalize.
++bool RemoveSupplementary(icu::UnicodeSet& set) {
++  constexpr UChar32 kFirstSupplementary = static_cast<UChar32>(kNonBmpStart);
++  if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false;
++  set.remove(kFirstSupplementary, UCHAR_MAX_VALUE);
++  return true;
++}
++
+ // The following code generates "src/regexp/special-case.cc".
+ void PrintSet(std::ofstream& out, const char* name,
+               const icu::UnicodeSet& set) {
+@@ -51,6 +65,7 @@ void PrintSpecial(std::ofstream& out) {
+   icu::UnicodeSet current;
+   icu::UnicodeSet special_add;
+   icu::UnicodeSet ignore;
++  icu::UnicodeSet supplementary_equivalents;
+   UErrorCode status = U_ZERO_ERROR;
+   icu::UnicodeSet upper("[\\p{Lu}]", status);
+   CHECK(U_SUCCESS(status));
+@@ -63,6 +78,7 @@ void PrintSpecial(std::ofstream& out) {
+     }
+     current.set(i, i);
+     current.closeOver(USET_CASE_INSENSITIVE);
++    if (RemoveSupplementary(current)) supplementary_equivalents.add(i);
+ 
+     // Check to see if all characters in the case-folding equivalence
+     // class as defined by UnicodeSet::closeOver all map to the same
+@@ -112,6 +128,7 @@ void PrintSpecial(std::ofstream& out) {
+       UChar32 canonical = RegExpCaseFolding::Canonicalize(c);
+       current.set(c, c);
+       current.closeOver(USET_CASE_INSENSITIVE);
++      RemoveSupplementary(current);
+       current.removeAll(ignore);
+       for (int32_t j = 0; j < current.getRangeCount(); j++) {
+         for (UChar32 c2 = current.getRangeStart(j);
+@@ -124,6 +141,7 @@ void PrintSpecial(std::ofstream& out) {
+ 
+   PrintSet(out, "IgnoreSet", ignore);
+   PrintSet(out, "SpecialAddSet", special_add);
++  PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents);
+ }
+ 
+ void WriteHeader(const char* header_filename) {
Index: pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_regexp-parser.cc
diff -u /dev/null pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_regexp-parser.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_regexp-parser.cc      Wed Nov 11 11:48:36 2026
@@ -0,0 +1,72 @@
+$NetBSD: patch-deps_v8_src_regexp_regexp-parser.cc,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/regexp-parser.cc.orig   2026-10-20 19:59:14.000000000 +0000
++++ deps/v8/src/regexp/regexp-parser.cc
+@@ -9,6 +9,7 @@
+ #include "src/regexp/regexp-ast.h"
+ #include "src/regexp/regexp-macro-assembler.h"
+ #include "src/regexp/regexp.h"
++#include "src/regexp/special-case.h"
+ #include "src/strings/char-predicates-inl.h"
+ #include "src/utils/ostreams.h"
+ #include "src/utils/utils.h"
+@@ -241,12 +242,18 @@ bool RegExpTextBuilder::NeedsDesugaringForUnicode(RegE
+   return false;
+ }
+ 
++// Desugar supplementary characters with case equivalents and BMP characters
++// with supplementary equivalents. Other atoms are folded during code
++// generation.
+ bool RegExpTextBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) {
+ #ifdef V8_INTL_SUPPORT
+   if (IsUnicodeMode() && ignore_case()) {
++    if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) {
++      return RegExpCaseFolding::HasSupplementaryEquivalents(
++          static_cast<base::uc16>(c));
++    }
+     icu::UnicodeSet set(c, c);
+-    set.closeOver(USET_CASE_INSENSITIVE);
+-    set.removeAllStrings();
++    RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode);
+     return set.size() > 1;
+   }
+   // In the case where ICU is not included, we act as if the unicode flag is
Index: pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_special-case.h
diff -u /dev/null pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_special-case.h:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs22/patches/patch-deps_v8_src_regexp_special-case.h        Wed Nov 11 11:48:36 2026
@@ -0,0 +1,115 @@
+$NetBSD: patch-deps_v8_src_regexp_special-case.h,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/special-case.h.orig     2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/special-case.h
+@@ -7,8 +7,8 @@
+ 
+ #ifdef V8_INTL_SUPPORT
+ #include "src/base/logging.h"
++#include "src/base/strings.h"
+ #include "src/common/globals.h"
+-
+ #include "unicode/uchar.h"
+ #include "unicode/uniset.h"
+ #include "unicode/unistr.h"
+@@ -71,9 +71,17 @@ namespace internal {
+ // another character. Characters that match no other characters in
+ // their equivalence class are added to IgnoreSet. Characters that
+ // match at least one other character are added to SpecialAddSet.
++// Supplementary code points are ignored throughout: non-unicode matching
++// compares UTF-16 code units, so they can never match a BMP character.
++//
++// The generator additionally emits SupplementaryEquivalentsSet, the BMP
++// characters whose Unicode case closure contains supplementary code points.
++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents.
+ 
+ class RegExpCaseFolding final : public AllStatic {
+  public:
++  enum class Mode { kNonUnicode, kUnicode };
++
+   static const icu::UnicodeSet& IgnoreSet();
+   static const icu::UnicodeSet& SpecialAddSet();
+ 
+@@ -107,6 +115,43 @@ class RegExpCaseFolding final : public AllStatic {
+ 
+     // h. Return cu.
+     return cu;
++  }
++
++  // Close a set of characters under case equivalence, preserving its
++  // original members. Non-unicode inputs must be UTF-16 code units.
++  static void CloseOver(icu::UnicodeSet& set, Mode mode) {
++    if (mode == Mode::kUnicode) {
++      set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++      return;
++    }
++    DCHECK(!set.containsSome(0x10000, 0x10ffff));
++    if (IgnoreSet().containsNone(set)) {
++      CloseOverNonUnicode(set);
++      return;
++    }
++    if (IgnoreSet().containsAll(set)) return;
++    // Ignored characters neither contribute nor acquire equivalents, but
++    // must remain in the result if they were explicitly present.
++    icu::UnicodeSet ignored(set);
++    ignored.retainAll(IgnoreSet());
++    set.removeAll(IgnoreSet());
++    CloseOverNonUnicode(set);
++    set.addAll(ignored);
++  }
++
++  // Whether c has supplementary Unicode case equivalents.
++  static bool HasSupplementaryEquivalents(base::uc16 c) {
++    return SupplementaryEquivalentsSet().contains(c);
++  }
++
++ private:
++  static const icu::UnicodeSet& SupplementaryEquivalentsSet();
++
++  // Requires a set containing no IgnoreSet characters.
++  static void CloseOverNonUnicode(icu::UnicodeSet& set) {
++    set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++    set.removeAll(IgnoreSet());
++    set.remove(0x10000, 0x10ffff);
+   }
+ };
+ 

Index: pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc
diff -u /dev/null pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_gen-regexp-special-case.cc    Wed Nov 11 11:48:36 2026
@@ -0,0 +1,103 @@
+$NetBSD: patch-deps_v8_src_regexp_gen-regexp-special-case.cc,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/gen-regexp-special-case.cc.orig 2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/gen-regexp-special-case.cc
+@@ -9,6 +9,7 @@
+ 
+ #include "src/base/strings.h"
+ #include "src/regexp/special-case.h"
++#include "unicode/uchar.h"
+ 
+ namespace v8 {
+ namespace internal {
+@@ -17,6 +18,19 @@ static const base::uc32 kNonBmpStart = 0x10000;
+ static const base::uc32 kSurrogateEnd = 0xdfff;
+ static const base::uc32 kNonBmpStart = 0x10000;
+ 
++// Removes supplementary code points from |set| and returns whether any were
++// present. Since Unicode 18, the case closure of a BMP character can contain
++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH
++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode
++// ignoreCase matching compares UTF-16 code units, so a supplementary code
++// point never matches a BMP character and does not take part in Canonicalize.
++bool RemoveSupplementary(icu::UnicodeSet& set) {
++  constexpr UChar32 kFirstSupplementary = static_cast<UChar32>(kNonBmpStart);
++  if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false;
++  set.remove(kFirstSupplementary, UCHAR_MAX_VALUE);
++  return true;
++}
++
+ // The following code generates "src/regexp/special-case.cc".
+ void PrintSet(std::ofstream& out, const char* name,
+               const icu::UnicodeSet& set) {
+@@ -51,6 +65,7 @@ void PrintSpecial(std::ofstream& out) {
+   icu::UnicodeSet current;
+   icu::UnicodeSet special_add;
+   icu::UnicodeSet ignore;
++  icu::UnicodeSet supplementary_equivalents;
+   UErrorCode status = U_ZERO_ERROR;
+   icu::UnicodeSet upper("[\\p{Lu}]", status);
+   CHECK(U_SUCCESS(status));
+@@ -63,6 +78,7 @@ void PrintSpecial(std::ofstream& out) {
+     }
+     current.set(i, i);
+     current.closeOver(USET_CASE_INSENSITIVE);
++    if (RemoveSupplementary(current)) supplementary_equivalents.add(i);
+ 
+     // Check to see if all characters in the case-folding equivalence
+     // class as defined by UnicodeSet::closeOver all map to the same
+@@ -112,6 +128,7 @@ void PrintSpecial(std::ofstream& out) {
+       UChar32 canonical = RegExpCaseFolding::Canonicalize(c);
+       current.set(c, c);
+       current.closeOver(USET_CASE_INSENSITIVE);
++      RemoveSupplementary(current);
+       current.removeAll(ignore);
+       for (int32_t j = 0; j < current.getRangeCount(); j++) {
+         for (UChar32 c2 = current.getRangeStart(j);
+@@ -124,6 +141,7 @@ void PrintSpecial(std::ofstream& out) {
+ 
+   PrintSet(out, "IgnoreSet", ignore);
+   PrintSet(out, "SpecialAddSet", special_add);
++  PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents);
+ }
+ 
+ void WriteHeader(const char* header_filename) {
Index: pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_regexp-parser.cc
diff -u /dev/null pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_regexp-parser.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_regexp-parser.cc      Wed Nov 11 11:48:36 2026
@@ -0,0 +1,86 @@
+$NetBSD: patch-deps_v8_src_regexp_regexp-parser.cc,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/regexp-parser.cc.orig   2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/regexp-parser.cc
+@@ -10,6 +10,7 @@
+ #include "src/regexp/regexp-ast.h"
+ #include "src/regexp/regexp-macro-assembler.h"
+ #include "src/regexp/regexp.h"
++#include "src/regexp/special-case.h"
+ #include "src/strings/char-predicates-inl.h"
+ #include "src/utils/ostreams.h"
+ #include "src/utils/utils.h"
+@@ -156,6 +157,10 @@ void RegExpTextBuilder::AddCharacter(base::uc16 c) {
+ 
+ void RegExpTextBuilder::AddCharacter(base::uc16 c) {
+   FlushPendingSurrogate();
++  if (NeedsDesugaringForIgnoreCase(c)) {
++    AddClassRangesForDesugaring(c);
++    return;
++  }
+   if (characters_ == nullptr) {
+     characters_ = zone()->New<ZoneList<base::uc16>>(4, zone());
+   }
+@@ -238,15 +243,18 @@ bool RegExpTextBuilder::NeedsDesugaringForUnicode(RegE
+   return false;
+ }
+ 
+-// We only use this for characters made of surrogate pairs.  All other
+-// characters outside of character classes are made case independent in the
+-// code generation.
++// Desugar supplementary characters with case equivalents and BMP characters
++// with supplementary equivalents. Other atoms are folded during code
++// generation.
+ bool RegExpTextBuilder::NeedsDesugaringForIgnoreCase(base::uc32 c) {
+ #ifdef V8_INTL_SUPPORT
+   if (IsUnicodeMode() && ignore_case()) {
++    if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) {
++      return RegExpCaseFolding::HasSupplementaryEquivalents(
++          static_cast<base::uc16>(c));
++    }
+     icu::UnicodeSet set(c, c);
+-    set.closeOver(USET_CASE_INSENSITIVE);
+-    set.removeAllStrings();
++    RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode);
+     return set.size() > 1;
+   }
+   // In the case where ICU is not included, we act as if the unicode flag is
Index: pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_special-case.h
diff -u /dev/null pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_special-case.h:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/lang/nodejs24/patches/patch-deps_v8_src_regexp_special-case.h        Wed Nov 11 11:48:36 2026
@@ -0,0 +1,115 @@
+$NetBSD: patch-deps_v8_src_regexp_special-case.h,v 1.1 2026/11/11 11:48:36 wiz Exp $
+
+From e455d955bd6b7a7549106d1b9d7ae5bb3b9e77b4 Mon Sep 17 00:00:00 2001
+From: Jakob Linke <jgruber%chromium.org@localhost>
+Date: Fri, 9 Oct 2026 12:41:30 +0200
+Subject: [PATCH] [regexp] Handle supplementary case equivalents of BMP
+ characters
+
+Unicode 18 adds U+1DF95, which simple-folds to U+00DF. This creates the
+first case-equivalence class spanning BMP and supplementary characters:
+{U+00DF, U+1E9E, U+1DF95}.
+
+Discard supplementary characters from the generator's non-unicode
+closures before calling Canonicalize, which requires UTF-16 code units
+and otherwise CHECK-fails with ICU 79. Apply the same filtering in
+runtime non-unicode closure.
+
+Generate SupplementaryEquivalentsSet and desugar its BMP characters into
+character classes under /iu and /iv, allowing literals to match
+surrogate pairs.
+
+Backreferences with differing UTF-16 character widths remain unsupported
+and are tracked in crbug.com/571793821.
+
+IgnoreSet is unchanged with ICU 78 and with ICU 78.2 patched to upstream
+Unicode 18 case data. With the patched data, the generator succeeds,
+SupplementaryEquivalentsSet is {U+00DF, U+1E9E}, and regexp tests pass
+in release and debug.
+
+Bug: 571232615, 571668686
+Change-Id: I9eacb273a74c66e17f0cfb1b256e863f2718c130
+Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8548134
+Reviewed-by: Patrick Thier <pthier%chromium.org@localhost>
+Commit-Queue: Jakob Linke <jgruber%chromium.org@localhost>
+Cr-Commit-Position: refs/heads/main@{#110522}
+---
+ src/regexp/gen-regexp-special-case.cc | 18 ++++++++++
+ src/regexp/regexp-parser.cc           | 18 +++++++---
+ src/regexp/special-case.h             | 47 ++++++++++++++++++++++++++-
+ 3 files changed, 77 insertions(+), 6 deletions(-)
+
+--- deps/v8/src/regexp/special-case.h.orig     2026-10-21 07:17:30.000000000 +0000
++++ deps/v8/src/regexp/special-case.h
+@@ -7,8 +7,8 @@
+ 
+ #ifdef V8_INTL_SUPPORT
+ #include "src/base/logging.h"
++#include "src/base/strings.h"
+ #include "src/common/globals.h"
+-
+ #include "unicode/uchar.h"
+ #include "unicode/uniset.h"
+ #include "unicode/unistr.h"
+@@ -71,9 +71,17 @@ namespace internal {
+ // another character. Characters that match no other characters in
+ // their equivalence class are added to IgnoreSet. Characters that
+ // match at least one other character are added to SpecialAddSet.
++// Supplementary code points are ignored throughout: non-unicode matching
++// compares UTF-16 code units, so they can never match a BMP character.
++//
++// The generator additionally emits SupplementaryEquivalentsSet, the BMP
++// characters whose Unicode case closure contains supplementary code points.
++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents.
+ 
+ class RegExpCaseFolding final : public AllStatic {
+  public:
++  enum class Mode { kNonUnicode, kUnicode };
++
+   static const icu::UnicodeSet& IgnoreSet();
+   static const icu::UnicodeSet& SpecialAddSet();
+ 
+@@ -107,6 +115,43 @@ class RegExpCaseFolding final : public AllStatic {
+ 
+     // h. Return cu.
+     return cu;
++  }
++
++  // Close a set of characters under case equivalence, preserving its
++  // original members. Non-unicode inputs must be UTF-16 code units.
++  static void CloseOver(icu::UnicodeSet& set, Mode mode) {
++    if (mode == Mode::kUnicode) {
++      set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++      return;
++    }
++    DCHECK(!set.containsSome(0x10000, 0x10ffff));
++    if (IgnoreSet().containsNone(set)) {
++      CloseOverNonUnicode(set);
++      return;
++    }
++    if (IgnoreSet().containsAll(set)) return;
++    // Ignored characters neither contribute nor acquire equivalents, but
++    // must remain in the result if they were explicitly present.
++    icu::UnicodeSet ignored(set);
++    ignored.retainAll(IgnoreSet());
++    set.removeAll(IgnoreSet());
++    CloseOverNonUnicode(set);
++    set.addAll(ignored);
++  }
++
++  // Whether c has supplementary Unicode case equivalents.
++  static bool HasSupplementaryEquivalents(base::uc16 c) {
++    return SupplementaryEquivalentsSet().contains(c);
++  }
++
++ private:
++  static const icu::UnicodeSet& SupplementaryEquivalentsSet();
++
++  // Requires a set containing no IgnoreSet characters.
++  static void CloseOverNonUnicode(icu::UnicodeSet& set) {
++    set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++    set.removeAll(IgnoreSet());
++    set.remove(0x10000, 0x10ffff);
+   }
+ };
+ 

Index: pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc
diff -u /dev/null pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc     Wed Nov 11 11:48:37 2026
@@ -0,0 +1,67 @@
+$NetBSD: patch-src_3rdparty_chromium_v8_src_regexp_gen-regexp-special-case.cc,v 1.1 2026/11/11 11:48:37 wiz Exp $
+
+ICU 79 support, based on
+https://www.linuxfromscratch.org/patches/blfs/svn/qtwebengine-6.11.3-icu4c_79-1.patch
+
+--- src/3rdparty/chromium/v8/src/regexp/gen-regexp-special-case.cc.orig        2025-04-22 13:00:44.000000000 +0000
++++ src/3rdparty/chromium/v8/src/regexp/gen-regexp-special-case.cc
+@@ -8,6 +8,7 @@
+ #include <sstream>
+ 
+ #include "src/regexp/special-case.h"
++#include "unicode/uchar.h"
+ 
+ namespace v8 {
+ namespace internal {
+@@ -16,6 +17,19 @@ static const uc32 kNonBmpStart = 0x10000;
+ static const uc32 kSurrogateEnd = 0xdfff;
+ static const uc32 kNonBmpStart = 0x10000;
+ 
++// Removes supplementary code points from |set| and returns whether any were
++// present. Since Unicode 18, the case closure of a BMP character can contain
++// supplementary code points (U+1DF95 LATIN SMALL LIGATURE LONG S WITH
++// DESCENDER S case-folds to U+00DF LATIN SMALL LETTER SHARP S). Non-unicode
++// ignoreCase matching compares UTF-16 code units, so a supplementary code
++// point never matches a BMP character and does not take part in Canonicalize.
++bool RemoveSupplementary(icu::UnicodeSet& set) {
++  constexpr UChar32 kFirstSupplementary = static_cast<UChar32>(kNonBmpStart);
++  if (!set.containsSome(kFirstSupplementary, UCHAR_MAX_VALUE)) return false;
++  set.remove(kFirstSupplementary, UCHAR_MAX_VALUE);
++  return true;
++}
++
+ // The following code generates "src/regexp/special-case.cc".
+ void PrintSet(std::ofstream& out, const char* name,
+               const icu::UnicodeSet& set) {
+@@ -50,6 +64,7 @@ void PrintSpecial(std::ofstream& out) {
+   icu::UnicodeSet current;
+   icu::UnicodeSet special_add;
+   icu::UnicodeSet ignore;
++  icu::UnicodeSet supplementary_equivalents;
+   UErrorCode status = U_ZERO_ERROR;
+   icu::UnicodeSet upper("[\\p{Lu}]", status);
+   CHECK(U_SUCCESS(status));
+@@ -62,6 +77,7 @@ void PrintSpecial(std::ofstream& out) {
+     }
+     current.set(i, i);
+     current.closeOver(USET_CASE_INSENSITIVE);
++    if (RemoveSupplementary(current)) supplementary_equivalents.add(i);
+ 
+     // Check to see if all characters in the case-folding equivalence
+     // class as defined by UnicodeSet::closeOver all map to the same
+@@ -111,6 +127,7 @@ void PrintSpecial(std::ofstream& out) {
+       UChar32 canonical = RegExpCaseFolding::Canonicalize(c);
+       current.set(c, c);
+       current.closeOver(USET_CASE_INSENSITIVE);
++      RemoveSupplementary(current);
+       current.removeAll(ignore);
+       for (int32_t j = 0; j < current.getRangeCount(); j++) {
+         for (UChar32 c2 = current.getRangeStart(j);
+@@ -123,6 +140,7 @@ void PrintSpecial(std::ofstream& out) {
+ 
+   PrintSet(out, "IgnoreSet", ignore);
+   PrintSet(out, "SpecialAddSet", special_add);
++  PrintSet(out, "SupplementaryEquivalentsSet", supplementary_equivalents);
+ }
+ 
+ void WriteHeader(const char* header_filename) {
Index: pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc
diff -u /dev/null pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc       Wed Nov 11 11:48:37 2026
@@ -0,0 +1,30 @@
+$NetBSD: patch-src_3rdparty_chromium_v8_src_regexp_regexp-parser.cc,v 1.1 2026/11/11 11:48:37 wiz Exp $
+
+ICU 79 support, based on
+https://www.linuxfromscratch.org/patches/blfs/svn/qtwebengine-6.11.3-icu4c_79-1.patch
+
+--- src/3rdparty/chromium/v8/src/regexp/regexp-parser.cc.orig  2025-04-22 13:00:44.000000000 +0000
++++ src/3rdparty/chromium/v8/src/regexp/regexp-parser.cc
+@@ -12,6 +12,7 @@
+ #include "src/regexp/property-sequences.h"
+ #include "src/regexp/regexp-macro-assembler.h"
+ #include "src/regexp/regexp.h"
++#include "src/regexp/special-case.h"
+ #include "src/strings/char-predicates-inl.h"
+ #include "src/utils/ostreams.h"
+ #include "src/utils/utils.h"
+@@ -2056,9 +2057,14 @@ bool RegExpBuilder::NeedsDesugaringForIgnoreCase(uc32 
+ bool RegExpBuilder::NeedsDesugaringForIgnoreCase(uc32 c) {
+ #ifdef V8_INTL_SUPPORT
+   if (unicode() && ignore_case()) {
++    if (c <= unibrow::Utf16::kMaxNonSurrogateCharCode) {
++      return RegExpCaseFolding::HasSupplementaryEquivalents(
++          static_cast<uc16>(c));
++    }
+     icu::UnicodeSet set(c, c);
+     set.closeOver(USET_CASE_INSENSITIVE);
+     set.removeAllStrings();
++    RegExpCaseFolding::CloseOver(set, RegExpCaseFolding::Mode::kUnicode);
+     return set.size() > 1;
+   }
+   // In the case where ICU is not included, we act as if the unicode flag is
Index: pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_special-case.h
diff -u /dev/null pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_special-case.h:1.1
--- /dev/null   Wed Nov 11 11:48:37 2026
+++ pkgsrc/x11/qt5-qtwebengine/patches/patch-src_3rdparty_chromium_v8_src_regexp_special-case.h Wed Nov 11 11:48:37 2026
@@ -0,0 +1,77 @@
+$NetBSD: patch-src_3rdparty_chromium_v8_src_regexp_special-case.h,v 1.1 2026/11/11 11:48:37 wiz Exp $
+
+ICU 79 support, based on
+https://www.linuxfromscratch.org/patches/blfs/svn/qtwebengine-6.11.3-icu4c_79-1.patch
+
+--- src/3rdparty/chromium/v8/src/regexp/special-case.h.orig    2025-04-22 13:00:44.000000000 +0000
++++ src/3rdparty/chromium/v8/src/regexp/special-case.h
+@@ -8,7 +8,6 @@
+ #ifdef V8_INTL_SUPPORT
+ #include "src/base/logging.h"
+ #include "src/common/globals.h"
+-
+ #include "unicode/uchar.h"
+ #include "unicode/uniset.h"
+ #include "unicode/unistr.h"
+@@ -71,9 +70,17 @@ namespace internal {
+ // another character. Characters that match no other characters in
+ // their equivalence class are added to IgnoreSet. Characters that
+ // match at least one other character are added to SpecialAddSet.
++// Supplementary code points are ignored throughout: non-unicode matching
++// compares UTF-16 code units, so they can never match a BMP character.
++//
++// The generator additionally emits SupplementaryEquivalentsSet, the BMP
++// characters whose Unicode case closure contains supplementary code points.
++// This set is used for unicode-mode matching, see HasSupplementaryEquivalents.
+ 
+ class RegExpCaseFolding final : public AllStatic {
+  public:
++  enum class Mode { kNonUnicode, kUnicode };
++
+   static const icu::UnicodeSet& IgnoreSet();
+   static const icu::UnicodeSet& SpecialAddSet();
+ 
+@@ -107,6 +114,43 @@ class RegExpCaseFolding final : public AllStatic {
+ 
+     // h. Return cu.
+     return cu;
++  }
++
++  // Close a set of characters under case equivalence, preserving its
++  // original members. Non-unicode inputs must be UTF-16 code units.
++  static void CloseOver(icu::UnicodeSet& set, Mode mode) {
++    if (mode == Mode::kUnicode) {
++      set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++      return;
++    }
++    DCHECK(!set.containsSome(0x10000, 0x10ffff));
++    if (IgnoreSet().containsNone(set)) {
++      CloseOverNonUnicode(set);
++      return;
++    }
++    if (IgnoreSet().containsAll(set)) return;
++    // Ignored characters neither contribute nor acquire equivalents, but
++    // must remain in the result if they were explicitly present.
++    icu::UnicodeSet ignored(set);
++    ignored.retainAll(IgnoreSet());
++    set.removeAll(IgnoreSet());
++    CloseOverNonUnicode(set);
++    set.addAll(ignored);
++  }
++
++  // Whether c has supplementary Unicode case equivalents.
++  static bool HasSupplementaryEquivalents(uc16 c) {
++    return SupplementaryEquivalentsSet().contains(c);
++  }
++
++ private:
++  static const icu::UnicodeSet& SupplementaryEquivalentsSet();
++
++  // Requires a set containing no IgnoreSet characters.
++  static void CloseOverNonUnicode(icu::UnicodeSet& set) {
++    set.closeOver(USET_SIMPLE_CASE_INSENSITIVE);
++    set.removeAll(IgnoreSet());
++    set.remove(0x10000, 0x10ffff);
+   }
+ };
+ 



Home | Main Index | Thread Index | Old Index