Commit c4c11636b14 for nodejs
commit c4c11636b1420fd996e16a583b37309c179d17df
Author: Steven R. Loomis <srl295@gmail.com>
Date: Fri Aug 21 12:58:48 2026 -0500
deps: V8: backport 9fb4444bfc46
Original commit message:
Fix Temporal compilation with system or no ICU
build: Fix Temporal compilation with system or no ICU
Add new build flag, v8_enable_temporal_systemicu, off by default When
on, it will remove references to the internal ICU udatamem.h header file
Obviates CLs 7769990 / 7831715
See: https://unicode-org.atlassian.net/browse/ICU-23400 See: Node:
https://github.com/nodejs/node/issues/62676 See: V8:
https://chromium-review.googlesource.com/c/v8/v8/+/7831715 See:
Homebrew: https://github.com/Homebrew/homebrew-core/pull/281707
Change-Id: Ibc460c68189d32e154c53eddfcda56bc7bca4fc6
Also includes:
fix: fix for no-icu build
thanks @aduh95
https://github.com/nodejs/node/issues/62676#issuecomment-5371270979
NO_IFTTT=No Temporal via Bazel
Change-Id: Ibc460c68189d32e154c53eddfcda56bc7bca4fc6
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8281487
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Commit-Queue: Chengzhong Wu <cwu631@bloomberg.net>
Reviewed-by: Olivier Flückiger <olivf@chromium.org>
Cr-Commit-Position: refs/heads/main@{#110039}
Refs: https://github.com/v8/v8/commit/9fb4444bfc464a5e54219acb04f0828b83dd15b5
PR-URL: https://github.com/nodejs/node/pull/65992
Fixes: https://github.com/nodejs/node/issues/62676
Refs: https://github.com/srl295/v8/commit/cd89fe6f7acb6f5d069f6cc741fa68303214e98f
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Reviewed-By: Richard Lau <richard.lau@ibm.com>
diff --git a/common.gypi b/common.gypi
index 71712d30847..7eaad1e5ea1 100644
--- a/common.gypi
+++ b/common.gypi
@@ -43,7 +43,7 @@
# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
- 'v8_embedder_string': '-node.34',
+ 'v8_embedder_string': '-node.35',
##### V8 defaults for Node.js #####
diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS
index ef0aeedaca5..cf468f85950 100644
--- a/deps/v8/AUTHORS
+++ b/deps/v8/AUTHORS
@@ -290,6 +290,7 @@ Stefan Penner <stefan.penner@gmail.com>
Stefan Stojanovic <stefko.stojanovic@gmail.com>
Stephan Hartmann <stha09@googlemail.com>
Stephen Belanger <stephen.belanger@datadoghq.com>
+Steven R. Loomis <srl295@gmail.com>
Sylvestre Ledru <sledru@mozilla.com>
Takeshi Yoneda <takeshi@tetrate.io>
Taketoshi Aono <brn@b6n.ch>
diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn
index 276641b09aa..560d4d42a94 100644
--- a/deps/v8/BUILD.gn
+++ b/deps/v8/BUILD.gn
@@ -1307,6 +1307,9 @@ config("features") {
if (v8_enable_temporal_support) {
defines += [ "V8_TEMPORAL_SUPPORT" ]
}
+ if (v8_enable_temporal_systemicu) {
+ defines += [ "V8_ENABLE_TEMPORAL_SYSTEMICU" ]
+ }
if (v8_enable_local_handle_zapping) {
defines += [ "ENABLE_LOCAL_HANDLE_ZAPPING" ]
}
@@ -3110,6 +3113,7 @@ generated_file("v8_generate_features_json") {
v8_enable_hugepage = v8_enable_hugepage
v8_enable_i18n_support = v8_enable_i18n_support
v8_enable_temporal_support = v8_enable_temporal_support
+ v8_enable_temporal_systemicu = v8_enable_temporal_systemicu
v8_enable_javascript_promise_hooks = v8_enable_javascript_promise_hooks
v8_enable_lite_mode = v8_enable_lite_mode
v8_enable_map_packing = v8_enable_map_packing
diff --git a/deps/v8/gni/v8.gni b/deps/v8/gni/v8.gni
index e29a7c5de3c..ea430b3a0a9 100644
--- a/deps/v8/gni/v8.gni
+++ b/deps/v8/gni/v8.gni
@@ -63,6 +63,10 @@ declare_args() {
# Furthermore, some architectures don't have Rust toolchains in Chromium
v8_enable_temporal_support = !(defined(build_with_node) && build_with_node)
+ # by default, don't enable compiling Temporal with a system ICU4C
+ # (assume private headers are available)
+ v8_enable_temporal_systemicu = false
+
# Use static libraries instead of source_sets.
v8_static_library = false
diff --git a/deps/v8/src/objects/js-temporal-zoneinfo64.cc b/deps/v8/src/objects/js-temporal-zoneinfo64.cc
index 99dd3a84c1e..007d63589c5 100644
--- a/deps/v8/src/objects/js-temporal-zoneinfo64.cc
+++ b/deps/v8/src/objects/js-temporal-zoneinfo64.cc
@@ -11,8 +11,36 @@
#include "temporal_rs/TimeZone.hpp"
#ifdef V8_INTL_SUPPORT
+#ifndef V8_ENABLE_TEMPORAL_SYSTEMICU
+// ICU internal header file
#include "udatamem.h"
#else
+/**
+ * Shadow definition of UDataMemory
+ * This is functionally identical to the definition in udatamem.h
+ * Irrelevant fields are marked 'ignored' and should not be used.
+ *
+ * This definition is copied here so that the result of udata_open()
+ * can be used and length-checked without needing to resort to
+ * calling internal ICU functions.
+ *
+ * Note, there is an ICU ticket,
+ * https://unicode-org.atlassian.net/browse/ICU-23400
+ * to consider whether the API surface should be changed
+ * here. If and when this is done, such an API could be used.
+ */
+struct UDataMemoryShadow {
+ const void* ignored1;
+ const void* data; //< pointer to header of data object
+ const void* ignored2;
+ UBool ignored3;
+ void* ignored4;
+ void* ignored5;
+ int32_t
+ length; //< length of entire region pointed to by data if known, else -1
+};
+#endif
+#else
// Defined in builtins-temporal-zoneinfo64-data.cc, generated by
// include-file-as-bytes.py
extern "C" uint32_t zoneinfo64_static_data[];
@@ -30,17 +58,29 @@ ZoneInfo64Provider::ZoneInfo64Provider() {
provider = temporal_rs::Provider::empty();
return;
}
+#ifndef V8_ENABLE_TEMPORAL_SYSTEMICU
// NOT udata_getLength: this ignores the header,
// and we're parsing resb files with the header
auto length = memory->length;
const void* data = udata_getRawMemory(memory);
- DCHECK_WITH_MSG(length % 4 == 0, "ICU4C should align udata to uint32_t");
- if (length % 4 != 0) {
- // This really shouldn't happen: ICU4C aligns these files
- // to 4 when baking them in
+#else
+ // reinterpret with a local struct
+ const UDataMemoryShadow* shadowMemory =
+ reinterpret_cast<const UDataMemoryShadow*>(memory);
+ // just need the length and data
+ auto length = shadowMemory->length;
+ auto data = shadowMemory->data;
+#endif
+ // This really shouldn't happen: ICU4C pads these files
+ // to 4 when baking them in
+ DCHECK_WITH_MSG(length % 4 == 0, "ICU4C should pad udata to uint32_t");
+ // Length may not be known. If we're not OK with that, don't proceed.
+ DCHECK_WITH_MSG(length != -1, "ICU4C usually knows the length");
+ if (length % 4 != 0 || length == -1) {
provider = temporal_rs::Provider::empty();
return;
}
+ DCHECK_WITH_MSG(data != nullptr, "ICU4C returned nullptr");
const uint32_t* data_32 = static_cast<const uint32_t*>(data);
std::span<const uint32_t> data_span(data_32, length / 4);