Skip to content

Commit

Permalink
deps: V8: backport 4bf051d536a1
Browse files Browse the repository at this point in the history
Original commit message:

    [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/+/2579914
    Reviewed-by: Toon Verwaest <verwaest@chromium.org>
    Commit-Queue: Toon Verwaest <verwaest@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#71710}

Refs: v8/v8@4bf051d

PR-URL: nodejs#36482
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
addaleax authored and targos committed Feb 7, 2021
1 parent 4928098 commit ae02344
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 2 deletions.
2 changes: 1 addition & 1 deletion common.gypi
Expand Up @@ -36,7 +36,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.15',
'v8_embedder_string': '-node.16',

##### V8 defaults for Node.js #####

Expand Down
5 changes: 4 additions & 1 deletion deps/v8/include/v8.h
Expand Up @@ -10494,9 +10494,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.
Expand Down
6 changes: 6 additions & 0 deletions deps/v8/src/api/api.cc
Expand Up @@ -6137,6 +6137,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();
Expand Down
10 changes: 10 additions & 0 deletions deps/v8/test/cctest/test-api.cc
Expand Up @@ -28804,3 +28804,13 @@ TEST(CodeLikeFunction) {
CHECK(CompileRun("new Function(new Other())()").IsEmpty());
ExpectInt32("new Function(new CodeLike())()", 7);
}

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

0 comments on commit ae02344

Please sign in to comment.