mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-21 22:57:31 +09:00
Bug 1336705 - Part 2: Add self-hosting intrinsics for resolving/rejecting Promises and adding reactions.
Tag #1287
This commit is contained in:
parent
f15e675b86
commit
4ce0bb5e0a
1 changed files with 108 additions and 0 deletions
|
|
@ -27,6 +27,7 @@
|
||||||
#include "builtin/MapObject.h"
|
#include "builtin/MapObject.h"
|
||||||
#include "builtin/ModuleObject.h"
|
#include "builtin/ModuleObject.h"
|
||||||
#include "builtin/Object.h"
|
#include "builtin/Object.h"
|
||||||
|
#include "builtin/Promise.h"
|
||||||
#include "builtin/Reflect.h"
|
#include "builtin/Reflect.h"
|
||||||
#include "builtin/SelfHostingDefines.h"
|
#include "builtin/SelfHostingDefines.h"
|
||||||
#include "builtin/SIMD.h"
|
#include "builtin/SIMD.h"
|
||||||
|
|
@ -2135,6 +2136,105 @@ intrinsic_PromiseResolve(JSContext* cx, unsigned argc, Value* vp)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_CreatePendingPromise(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() == 0);
|
||||||
|
RootedObject promise(cx, PromiseObject::createSkippingExecutor(cx));
|
||||||
|
if (!promise)
|
||||||
|
return false;
|
||||||
|
args.rval().setObject(*promise);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_CreatePromiseResolvedWith(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() == 1);
|
||||||
|
RootedObject promise(cx, PromiseObject::unforgeableResolve(cx, args[0]));
|
||||||
|
if (!promise)
|
||||||
|
return false;
|
||||||
|
args.rval().setObject(*promise);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_CreatePromiseRejectedWith(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() == 1);
|
||||||
|
RootedObject promise(cx, PromiseObject::unforgeableReject(cx, args[0]));
|
||||||
|
if (!promise)
|
||||||
|
return false;
|
||||||
|
args.rval().setObject(*promise);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_ResolvePromise(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() == 2);
|
||||||
|
Rooted<PromiseObject*> promise(cx, &args[0].toObject().as<PromiseObject>());
|
||||||
|
if (!PromiseObject::resolve(cx, promise, args[1]))
|
||||||
|
return false;
|
||||||
|
args.rval().setUndefined();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_RejectPromise(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() == 2);
|
||||||
|
Rooted<PromiseObject*> promise(cx, &args[0].toObject().as<PromiseObject>());
|
||||||
|
if (!PromiseObject::reject(cx, promise, args[1]))
|
||||||
|
return false;
|
||||||
|
args.rval().setUndefined();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_CallOriginalPromiseThen(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() >= 2);
|
||||||
|
|
||||||
|
RootedObject promise(cx, &args[0].toObject());
|
||||||
|
Value val = args[1];
|
||||||
|
RootedObject onResolvedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
|
||||||
|
val = args.get(2);
|
||||||
|
RootedObject onRejectedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
|
||||||
|
|
||||||
|
RootedObject resultPromise(cx, JS::CallOriginalPromiseThen(cx, promise, onResolvedObj,
|
||||||
|
onRejectedObj));
|
||||||
|
if (!resultPromise)
|
||||||
|
return false;
|
||||||
|
args.rval().setObject(*resultPromise);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_AddPromiseReactions(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() >= 2);
|
||||||
|
|
||||||
|
RootedObject promise(cx, &args[0].toObject());
|
||||||
|
Value val = args[1];
|
||||||
|
RootedObject onResolvedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
|
||||||
|
val = args.get(2);
|
||||||
|
RootedObject onRejectedObj(cx, val.isUndefined() ? nullptr : val.toObjectOrNull());
|
||||||
|
|
||||||
|
bool result = JS::AddPromiseReactions(cx, promise, onResolvedObj, onRejectedObj);
|
||||||
|
if (!result)
|
||||||
|
return false;
|
||||||
|
args.rval().setUndefined();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// The self-hosting global isn't initialized with the normal set of builtins.
|
// The self-hosting global isn't initialized with the normal set of builtins.
|
||||||
// Instead, individual C++-implemented functions that're required by
|
// Instead, individual C++-implemented functions that're required by
|
||||||
// self-hosted code are defined as global functions. Accessing these
|
// self-hosted code are defined as global functions. Accessing these
|
||||||
|
|
@ -2536,6 +2636,14 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||||
JS_FN("AddModuleNamespaceBinding", intrinsic_AddModuleNamespaceBinding, 4, 0),
|
JS_FN("AddModuleNamespaceBinding", intrinsic_AddModuleNamespaceBinding, 4, 0),
|
||||||
JS_FN("ModuleNamespaceExports", intrinsic_ModuleNamespaceExports, 1, 0),
|
JS_FN("ModuleNamespaceExports", intrinsic_ModuleNamespaceExports, 1, 0),
|
||||||
|
|
||||||
|
JS_FN("CreatePendingPromise", intrinsic_CreatePendingPromise, 0, 0),
|
||||||
|
JS_FN("CreatePromiseResolvedWith", intrinsic_CreatePromiseResolvedWith, 1, 0),
|
||||||
|
JS_FN("CreatePromiseRejectedWith", intrinsic_CreatePromiseRejectedWith, 1, 0),
|
||||||
|
JS_FN("ResolvePromise", intrinsic_ResolvePromise, 2, 0),
|
||||||
|
JS_FN("RejectPromise", intrinsic_RejectPromise, 2, 0),
|
||||||
|
JS_FN("AddPromiseReactions", intrinsic_AddPromiseReactions, 3, 0),
|
||||||
|
JS_FN("CallOriginalPromiseThen", intrinsic_CallOriginalPromiseThen, 3, 0),
|
||||||
|
|
||||||
JS_FN("IsPromiseObject", intrinsic_IsInstanceOfBuiltin<PromiseObject>, 1, 0),
|
JS_FN("IsPromiseObject", intrinsic_IsInstanceOfBuiltin<PromiseObject>, 1, 0),
|
||||||
JS_FN("CallPromiseMethodIfWrapped", CallNonGenericSelfhostedMethod<Is<PromiseObject>>, 2, 0),
|
JS_FN("CallPromiseMethodIfWrapped", CallNonGenericSelfhostedMethod<Is<PromiseObject>>, 2, 0),
|
||||||
JS_FN("PromiseResolve", intrinsic_PromiseResolve, 2, 0),
|
JS_FN("PromiseResolve", intrinsic_PromiseResolve, 2, 0),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue