123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Charles Kerr <[email protected]>
- Date: Thu, 6 Mar 2025 14:31:19 -0600
- Subject: Revert "[api] Delete deprecated AttachCppHeap and DetachCppHeap"
- Restore this API because Node.js needs it.
- This patch can be removed after an upstream fix lands in Node.js,
- e.g. in https://github.com/nodejs/node-v8/tree/canary
- diff --git a/include/v8-isolate.h b/include/v8-isolate.h
- index 97f1030dd2ca47ca4b58ac64e2e11e615bc46130..24ef6b5e0af63179e557b9896134838e112c59db 100644
- --- a/include/v8-isolate.h
- +++ b/include/v8-isolate.h
- @@ -1172,6 +1172,28 @@ class V8_EXPORT Isolate {
- */
- void SetEmbedderRootsHandler(EmbedderRootsHandler* handler);
-
- + /**
- + * Attaches a managed C++ heap as an extension to the JavaScript heap. The
- + * embedder maintains ownership of the CppHeap. At most one C++ heap can be
- + * attached to V8.
- + *
- + * Multi-threaded use requires the use of v8::Locker/v8::Unlocker, see
- + * CppHeap.
- + *
- + * If a CppHeap is set via CreateParams, then this call is a noop.
- + */
- + V8_DEPRECATED("Set the heap on Isolate creation using CreateParams instead.")
- + void AttachCppHeap(CppHeap*);
- +
- + /**
- + * Detaches a managed C++ heap if one was attached using `AttachCppHeap()`.
- + *
- + * If a CppHeap is set via CreateParams, then this call is a noop.
- + */
- + V8_DEPRECATED(
- + "The CppHeap gets detached automatically during Isolate tear down.")
- + void DetachCppHeap();
- +
- using ReleaseCppHeapCallback = void (*)(std::unique_ptr<CppHeap>);
-
- /**
- @@ -1219,7 +1241,6 @@ class V8_EXPORT Isolate {
- class V8_DEPRECATED("AtomicsWaitWakeHandle is unused and will be removed.")
- #endif
- V8_EXPORT AtomicsWaitWakeHandle {
- -
- public:
- /**
- * Stop this `Atomics.wait()` call and call the |AtomicsWaitCallback|
- diff --git a/src/api/api.cc b/src/api/api.cc
- index 64044e9cf44d401c249787feafb651688ee0d9f9..1677e54b188b6a1699370d8cff37d2acf2933f38 100644
- --- a/src/api/api.cc
- +++ b/src/api/api.cc
- @@ -9876,6 +9876,16 @@ void Isolate::SetEmbedderRootsHandler(EmbedderRootsHandler* handler) {
- i_isolate->heap()->SetEmbedderRootsHandler(handler);
- }
-
- +void Isolate::AttachCppHeap(CppHeap* cpp_heap) {
- + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
- + i_isolate->heap()->AttachCppHeap(cpp_heap);
- +}
- +
- +void Isolate::DetachCppHeap() {
- + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(this);
- + i_isolate->heap()->DetachCppHeap();
- +}
- +
- CppHeap* Isolate::GetCppHeap() const {
- const i::Isolate* i_isolate = reinterpret_cast<const i::Isolate*>(this);
- return i_isolate->heap()->cpp_heap();
- diff --git a/src/heap/cppgc-js/cpp-heap.cc b/src/heap/cppgc-js/cpp-heap.cc
- index e033791ca1cdeba4a304e69b922d4169a22f9caa..706f81f7bbc1b5a7a1b73afe018b0b2c0184d9ef 100644
- --- a/src/heap/cppgc-js/cpp-heap.cc
- +++ b/src/heap/cppgc-js/cpp-heap.cc
- @@ -513,6 +513,11 @@ CppHeap::CppHeap(
- }
-
- CppHeap::~CppHeap() {
- + if (isolate_) {
- + // TODO(ahaas): Delete this code once `v8::Isolate::DetachCppHeap` has been
- + // deleted.
- + isolate_->heap()->DetachCppHeap();
- + }
- Terminate();
- }
-
- diff --git a/src/heap/heap.cc b/src/heap/heap.cc
- index da9d8810b307e94f01238e56532a0ff93f1ff325..252a1b354110764c6351119d41a4adddca0c2913 100644
- --- a/src/heap/heap.cc
- +++ b/src/heap/heap.cc
- @@ -6056,6 +6056,21 @@ void Heap::AttachCppHeap(v8::CppHeap* cpp_heap) {
- cpp_heap_ = cpp_heap;
- }
-
- +void Heap::DetachCppHeap() {
- + // The API function should be a noop in case a CppHeap was passed on Isolate
- + // creation.
- + if (owning_cpp_heap_) {
- + return;
- + }
- +
- + // The CppHeap may have been detached already.
- + if (!cpp_heap_) return;
- +
- + CppHeap::From(cpp_heap_)->StartDetachingIsolate();
- + CppHeap::From(cpp_heap_)->DetachIsolate();
- + cpp_heap_ = nullptr;
- +}
- +
- std::optional<StackState> Heap::overridden_stack_state() const {
- if (!embedder_stack_state_origin_) return {};
- return embedder_stack_state_;
- diff --git a/src/heap/heap.h b/src/heap/heap.h
- index 570cb682903cbead5f8f80573290b13ab1d81183..bccdb6c1bdb8fbbc6cc5aee0e54105f210ca2ab9 100644
- --- a/src/heap/heap.h
- +++ b/src/heap/heap.h
- @@ -1104,6 +1104,9 @@ class Heap final {
- // Unified heap (C++) support. ===============================================
- // ===========================================================================
-
- + V8_EXPORT_PRIVATE void AttachCppHeap(v8::CppHeap* cpp_heap);
- + V8_EXPORT_PRIVATE void DetachCppHeap();
- +
- v8::CppHeap* cpp_heap() const { return cpp_heap_; }
-
- std::optional<StackState> overridden_stack_state() const;
- @@ -1645,8 +1648,6 @@ class Heap final {
- private:
- class AllocationTrackerForDebugging;
-
- - void AttachCppHeap(v8::CppHeap* cpp_heap);
- -
- using ExternalStringTableUpdaterCallback =
- Tagged<String> (*)(Heap* heap, FullObjectSlot pointer);
-
|