Commit 4bf051d5 authored by Anna Henningsen's avatar Anna Henningsen Committed by Commit Bot

[api] Add Context::GetMicrotaskQueue method

Add a method that returns the microtask queue that is being used
by the `v8::Context`.

This is helpful in non-monolithic embedders like Node.js, which
accept Contexts created by its own embedders like Electron, or
for native Node.js addons. In particular, it enables:

1. Making sure that “nested” `Context`s use the correct microtask
   queue, i.e. the one from the outer Context.
2. Enqueueing microtasks into the correct microtask queue.

Previously, these things only worked when the microtask queue for
a given Context was the Isolate’s default queue.

As an alternative, I considered adding a way to make new `Context`s
inherit the queue from the `Context` that was entered at the time
of their creation, but that seemed a bit more “magic”, less flexible,
and didn’t take care of concern 2 listed above.

Change-Id: I15ed796df90f23c97a545a8e1b30a3bf4a5c4320
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2579914Reviewed-by: 's avatarToon Verwaest <verwaest@chromium.org>
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71710}
parent 8ff422ad
......@@ -10554,9 +10554,12 @@ class V8_EXPORT Context {
*/
void Exit();
/** Returns an isolate associated with a current context. */
/** Returns the isolate associated with a current context. */
Isolate* GetIsolate();
/** Returns the microtask queue associated with a current context. */
MicrotaskQueue* GetMicrotaskQueue();
/**
* The field at kDebugIdIndex used to be reserved for the inspector.
* It now serves no purpose.
......
......@@ -6261,6 +6261,12 @@ v8::Isolate* Context::GetIsolate() {
return reinterpret_cast<Isolate*>(env->GetIsolate());
}
v8::MicrotaskQueue* Context::GetMicrotaskQueue() {
i::Handle<i::Context> env = Utils::OpenHandle(this);
CHECK(env->IsNativeContext());
return i::Handle<i::NativeContext>::cast(env)->microtask_queue();
}
v8::Local<v8::Object> Context::Global() {
i::Handle<i::Context> context = Utils::OpenHandle(this);
i::Isolate* isolate = context->GetIsolate();
......
......@@ -28801,3 +28801,13 @@ UNINITIALIZED_TEST(SingleThreadedDefaultPlatform) {
isolate->Dispose();
i::V8::SetPlatformForTesting(old_platform);
}
THREADED_TEST(MicrotaskQueueOfContext) {
auto microtask_queue = v8::MicrotaskQueue::New(CcTest::isolate());
v8::HandleScope scope(CcTest::isolate());
v8::Local<Context> context = Context::New(
CcTest::isolate(), nullptr, v8::MaybeLocal<ObjectTemplate>(),
v8::MaybeLocal<Value>(), v8::DeserializeInternalFieldsCallback(),
microtask_queue.get());
CHECK_EQ(context->GetMicrotaskQueue(), microtask_queue.get());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment