From 0216108195b4d77a93387abd04c2d05fb21b733d Mon Sep 17 00:00:00 2001 From: Martok Date: Sun, 22 Jan 2023 00:10:50 +0100 Subject: [PATCH] No issue - Throw error when resolving or rejecting promise returned by async function with testing function Based-on: m-c 1418106 --- js/src/builtin/Promise.cpp | 7 +++++++ js/src/builtin/Promise.h | 3 +++ js/src/builtin/TestingFunctions.cpp | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/js/src/builtin/Promise.cpp b/js/src/builtin/Promise.cpp index faba010950..2cd26d87d6 100644 --- a/js/src/builtin/Promise.cpp +++ b/js/src/builtin/Promise.cpp @@ -2577,6 +2577,13 @@ js::CreatePromiseObjectForAsync(JSContext* cx, HandleValue generatorVal) return promise; } +bool +js::IsPromiseForAsync(JSObject* promise) +{ + return promise->is() && + PromiseHasAnyFlag(promise->as(), PROMISE_FLAG_ASYNC); +} + // ES 2018 draft 25.5.5.2 steps 3.f, 3.g. MOZ_MUST_USE bool js::AsyncFunctionThrown(JSContext* cx, Handle resultPromise) diff --git a/js/src/builtin/Promise.h b/js/src/builtin/Promise.h index 04cc46920f..d8d178891a 100644 --- a/js/src/builtin/Promise.h +++ b/js/src/builtin/Promise.h @@ -141,6 +141,9 @@ PromiseResolve(JSContext* cx, HandleObject constructor, HandleValue value); MOZ_MUST_USE PromiseObject* CreatePromiseObjectForAsync(JSContext* cx, HandleValue generatorVal); +MOZ_MUST_USE bool +IsPromiseForAsync(JSObject* promise); + MOZ_MUST_USE bool AsyncFunctionReturned(JSContext* cx, Handle resultPromise, HandleValue value); diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp index 48cdc827ba..914d3b989b 100644 --- a/js/src/builtin/TestingFunctions.cpp +++ b/js/src/builtin/TestingFunctions.cpp @@ -1398,6 +1398,11 @@ ResolvePromise(JSContext* cx, unsigned argc, Value* vp) return false; } + if (IsPromiseForAsync(promise)) { + JS_ReportErrorASCII(cx, "async function's promise shouldn't be manually resolved"); + return false; + } + bool result = JS::ResolvePromise(cx, promise, resolution); if (result) args.rval().setUndefined(); @@ -1425,6 +1430,11 @@ RejectPromise(JSContext* cx, unsigned argc, Value* vp) return false; } + if (IsPromiseForAsync(promise)) { + JS_ReportErrorASCII(cx, "async function's promise shouldn't be manually rejected"); + return false; + } + bool result = JS::RejectPromise(cx, promise, reason); if (result) args.rval().setUndefined();