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);