From d6372e7f2940759a67cd57d315ba12ca654a675d Mon Sep 17 00:00:00 2001 From: Igor Sheludko Date: Mon, 22 Jun 2026 21:48:30 +0200 Subject: [PATCH] [v8] Prepare for migrating v8::MicrotaskQueue to cppgc --- src/node_contextify.cc | 11 ++++++++++- src/node_contextify.h | 12 ++++++++++++ test/cctest/test_environment.cc | 17 ++++++++++++++--- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/node_contextify.cc b/src/node_contextify.cc index f971f2683c5b9c..15c2b19c8da67e 100644 --- a/src/node_contextify.cc +++ b/src/node_contextify.cc @@ -125,7 +125,11 @@ ContextifyContext* ContextifyContext::New(Environment* env, MicrotaskQueue* queue = options->own_microtask_queue +#ifdef V8_CPPGC_MICROTASK_QUEUE + ? options->own_microtask_queue +#else ? options->own_microtask_queue.get() +#endif : env->isolate()->GetCurrentContext()->GetMicrotaskQueue(); Local v8_context; @@ -146,9 +150,14 @@ ContextifyContext::ContextifyContext(Environment* env, Local wrapper, Local v8_context, ContextOptions* options) +#ifdef V8_CPPGC_MICROTASK_QUEUE + : microtask_queue_(options->own_microtask_queue) +#else : microtask_queue_(options->own_microtask_queue ? options->own_microtask_queue.release() - : nullptr) { + : nullptr) +#endif +{ CppgcMixin::Wrap(this, env, wrapper); context_.Reset(env->isolate(), v8_context); diff --git a/src/node_contextify.h b/src/node_contextify.h index 446cab2f580b65..0fe57da1b9c73c 100644 --- a/src/node_contextify.h +++ b/src/node_contextify.h @@ -18,7 +18,11 @@ struct ContextOptions { v8::Local origin; v8::Local allow_code_gen_strings; v8::Local allow_code_gen_wasm; +#ifdef V8_CPPGC_MICROTASK_QUEUE + v8::MicrotaskQueue* own_microtask_queue = nullptr; +#else std::unique_ptr own_microtask_queue; +#endif v8::Local host_defined_options_id; bool vanilla = false; }; @@ -122,7 +126,11 @@ class ContextifyContext final : CPPGC_MIXIN(ContextifyContext) { } inline v8::MicrotaskQueue* microtask_queue() const { +#ifdef V8_CPPGC_MICROTASK_QUEUE + return microtask_queue_; +#else return microtask_queue_.get(); +#endif } template @@ -186,7 +194,11 @@ class ContextifyContext final : CPPGC_MIXIN(ContextifyContext) { const v8::PropertyCallbackInfo& args); v8::TracedReference context_; +#ifdef V8_CPPGC_MICROTASK_QUEUE + cppgc::Persistent microtask_queue_; +#else std::unique_ptr microtask_queue_; +#endif }; class ContextifyScript final : CPPGC_MIXIN(ContextifyScript) { diff --git a/test/cctest/test_environment.cc b/test/cctest/test_environment.cc index 3ed91e69073ace..d09e00d1accb34 100644 --- a/test/cctest/test_environment.cc +++ b/test/cctest/test_environment.cc @@ -750,15 +750,26 @@ TEST_F(EnvironmentTest, NestedMicrotaskQueue) { const v8::HandleScope handle_scope(isolate_); const Argv argv; - std::unique_ptr queue = v8::MicrotaskQueue::New( - isolate_, v8::MicrotasksPolicy::kExplicit); +#ifdef V8_CPPGC_MICROTASK_QUEUE + v8::MicrotaskQueue* +#else + std::unique_ptr +#endif + queue = + v8::MicrotaskQueue::New(isolate_, v8::MicrotasksPolicy::kExplicit); + v8::Local context = v8::Context::New(isolate_, nullptr, {}, {}, v8::DeserializeInternalFieldsCallback(), - queue.get()); +#ifdef V8_CPPGC_MICROTASK_QUEUE + queue +#else + queue.get() +#endif + ); node::InitializeContext(context); v8::Context::Scope context_scope(context);