Commit cecf349b authored by Camillo Bruni's avatar Camillo Bruni Committed by V8 LUCI CQ

[promises] Perform microtask checkpoint for d8.promise.sethooks

Make sure we have no pending promises if correctness fuzzing is active.
Due to fast-paths we might not create all intermediate promises
that aren't spec visible. However, promise hooks might expose them
and cause different output which in turn breaks correctness fuzzing.

Drive-by-fix:
- Replace IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate
  with NeedsAnyPromiseHooks

Bug: v8:1207791
Change-Id: I5b956336c43348e029c3e283993d4140a8897439
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2886862Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74565}
parent baecc0cb
......@@ -473,8 +473,7 @@ void MicrotaskQueueBuiltinsAssembler::RunAllPromiseHooks(
TNode<HeapObject> promise_or_capability) {
Label hook(this, Label::kDeferred), done_hook(this);
TNode<Uint32T> promiseHookFlags = PromiseHookFlags();
Branch(IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
promiseHookFlags), &hook, &done_hook);
Branch(NeedsAnyPromiseHooks(promiseHookFlags), &hook, &done_hook);
BIND(&hook);
{
switch (type) {
......
......@@ -14065,18 +14065,8 @@ TNode<BoolT> CodeStubAssembler::
return IsSetWord32(flags, mask);
}
TNode<BoolT> CodeStubAssembler::
IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
TNode<Uint32T> flags) {
return Word32NotEqual(flags, Int32Constant(0));
}
TNode<BoolT> CodeStubAssembler::NeedsAnyPromiseHooks(TNode<Uint32T> flags) {
uint32_t mask = Isolate::PromiseHookFields::HasContextPromiseHook::kMask |
Isolate::PromiseHookFields::HasIsolatePromiseHook::kMask |
Isolate::PromiseHookFields::HasAsyncEventDelegate::kMask |
Isolate::PromiseHookFields::IsDebugActive::kMask;
return IsSetWord32(flags, mask);
return Word32NotEqual(flags, Int32Constant(0));
}
TNode<Code> CodeStubAssembler::LoadBuiltin(TNode<Smi> builtin_id) {
......
......@@ -3570,13 +3570,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
return IsIsolatePromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
PromiseHookFlags());
}
TNode<BoolT> IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
TNode<Uint32T> flags);
TNode<BoolT>
IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate() {
return IsAnyPromiseHookEnabledOrDebugIsActiveOrHasAsyncEventDelegate(
PromiseHookFlags());
}
TNode<BoolT> NeedsAnyPromiseHooks(TNode<Uint32T> flags);
TNode<BoolT> NeedsAnyPromiseHooks() {
......
......@@ -1942,6 +1942,13 @@ void Shell::AsyncHooksTriggerAsyncId(
void Shell::SetPromiseHooks(const v8::FunctionCallbackInfo<v8::Value>& args) {
Isolate* isolate = args.GetIsolate();
if (i::FLAG_correctness_fuzzer_suppressions) {
// Make sure we have no pending promises if correctness fuzzing is active.
// Due to fast-paths we might have not created all intermediate promises
// that aren't spec visible. However, the promise hook might expose them
// and cause different output.
isolate->PerformMicrotaskCheckpoint();
}
Local<Context> context = isolate->GetCurrentContext();
HandleScope handle_scope(isolate);
......
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