[wasm] Enter CallDepthScope after compilation to execute microtasks

When async compilation finishes for WebAssembly, the promise returned by
`WebAssembly.compile()` gets resolved. Resolving the promise creates a
microtask that should get executed automatically when the call stack
empties up when MicrotasksPolicy::kAuto is used. However, this policy
requires a CallDepthScope to work, but there is no CallDepthScope when
WebAssembly compilation finishes. This CL adds this CallDepthScope.

R=jkummerow@chromium.org

Bug: chromium:1297672
Change-Id: I1bd607dec9daf08b3dbb1294393a8af255d222ff
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3679579
Auto-Submit: Andreas Haas <ahaas@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Jakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80872}
This commit is contained in:
Andreas Haas 2022-05-31 20:41:06 +02:00 committed by V8 LUCI CQ
parent efcbd13355
commit b1f896337d

View File

@ -2326,6 +2326,14 @@ void AsyncCompileJob::AsyncCompileSucceeded(Handle<WasmModuleObject> result) {
// the module's start function calls out to Blink.
Local<v8::Context> backup_incumbent_context =
Utils::ToLocal(incumbent_context_);
// We have to enter a MicrotasksScope here, because the
// CompilationResultResolver potentially creates a Microtask below in
// {OnCompilationSucceeded}.
MicrotasksScope microtasks_scope(reinterpret_cast<v8::Isolate*>(isolate()),
MicrotasksScope::kRunMicrotasks);
// Enter a {CallDepthScope} explicitly, because we did not go through
// {ENTER_V8}, and otherwise MicrotasksPolicy::kAuto does not work.
CallDepthScope<true> call_depth_scope(isolate(), backup_incumbent_context);
v8::Context::BackupIncumbentScope incumbent(backup_incumbent_context);
resolver_->OnCompilationSucceeded(result);
}