Skip to content

Commit 8fe2976

Browse files
joshualittCommit Bot
authored andcommitted
[promises] Port PromiseCapabilityDefault* to torque.
Bug: v8:9838 Change-Id: I8f1ca56517c4de097cab7e5fbd63ef3fe56d8f8c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1904120 Reviewed-by: Maya Lekova <mslekova@chromium.org> Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org> Commit-Queue: Joshua Litt <joshualitt@chromium.org> Cr-Commit-Position: refs/heads/master@{#64923}
1 parent 72b652e commit 8fe2976

3 files changed

Lines changed: 67 additions & 73 deletions

File tree

src/builtins/builtins-definitions.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -748,11 +748,6 @@ namespace internal {
748748
/* ES #sec-promise-resolve-functions */ \
749749
/* Starting at step 6 of "Promise Resolve Functions" */ \
750750
TFS(ResolvePromise, kPromise, kResolution) \
751-
/* ES #sec-promise-reject-functions */ \
752-
TFJ(PromiseCapabilityDefaultReject, 1, kReceiver, kReason) \
753-
/* ES #sec-promise-resolve-functions */ \
754-
TFJ(PromiseCapabilityDefaultResolve, 1, kReceiver, kResolution) \
755-
/* ES6 #sec-getcapabilitiesexecutor-functions */ \
756751
TFJ(PromiseGetCapabilitiesExecutor, 2, kReceiver, kResolve, kReject) \
757752
TFJ(PromiseConstructorLazyDeoptContinuation, 4, kReceiver, kPromise, \
758753
kReject, kException, kResult) \

src/builtins/builtins-promise-gen.cc

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -630,72 +630,6 @@ void PromiseBuiltinsAssembler::SetPromiseHandledByIfTrue(
630630
BIND(&done);
631631
}
632632

633-
// ES #sec-promise-reject-functions
634-
TF_BUILTIN(PromiseCapabilityDefaultReject, PromiseBuiltinsAssembler) {
635-
Node* const reason = Parameter(Descriptor::kReason);
636-
Node* const context = Parameter(Descriptor::kContext);
637-
638-
// 2. Let promise be F.[[Promise]].
639-
const TNode<Object> promise =
640-
LoadContextElement(context, PromiseBuiltins::kPromiseSlot);
641-
642-
// 3. Let alreadyResolved be F.[[AlreadyResolved]].
643-
Label if_already_resolved(this, Label::kDeferred);
644-
const TNode<Object> already_resolved =
645-
LoadContextElement(context, PromiseBuiltins::kAlreadyResolvedSlot);
646-
647-
// 4. If alreadyResolved.[[Value]] is true, return undefined.
648-
GotoIf(IsTrue(already_resolved), &if_already_resolved);
649-
650-
// 5. Set alreadyResolved.[[Value]] to true.
651-
StoreContextElementNoWriteBarrier(
652-
context, PromiseBuiltins::kAlreadyResolvedSlot, TrueConstant());
653-
654-
// 6. Return RejectPromise(promise, reason).
655-
const TNode<Object> debug_event =
656-
LoadContextElement(context, PromiseBuiltins::kDebugEventSlot);
657-
Return(CallBuiltin(Builtins::kRejectPromise, context, promise, reason,
658-
debug_event));
659-
660-
BIND(&if_already_resolved);
661-
{
662-
Return(CallRuntime(Runtime::kPromiseRejectAfterResolved, context, promise,
663-
reason));
664-
}
665-
}
666-
667-
// ES #sec-promise-resolve-functions
668-
TF_BUILTIN(PromiseCapabilityDefaultResolve, PromiseBuiltinsAssembler) {
669-
Node* const resolution = Parameter(Descriptor::kResolution);
670-
Node* const context = Parameter(Descriptor::kContext);
671-
672-
// 2. Let promise be F.[[Promise]].
673-
const TNode<Object> promise =
674-
LoadContextElement(context, PromiseBuiltins::kPromiseSlot);
675-
676-
// 3. Let alreadyResolved be F.[[AlreadyResolved]].
677-
Label if_already_resolved(this, Label::kDeferred);
678-
const TNode<Object> already_resolved =
679-
LoadContextElement(context, PromiseBuiltins::kAlreadyResolvedSlot);
680-
681-
// 4. If alreadyResolved.[[Value]] is true, return undefined.
682-
GotoIf(IsTrue(already_resolved), &if_already_resolved);
683-
684-
// 5. Set alreadyResolved.[[Value]] to true.
685-
StoreContextElementNoWriteBarrier(
686-
context, PromiseBuiltins::kAlreadyResolvedSlot, TrueConstant());
687-
688-
// The rest of the logic (and the catch prediction) is
689-
// encapsulated in the dedicated ResolvePromise builtin.
690-
Return(CallBuiltin(Builtins::kResolvePromise, context, promise, resolution));
691-
692-
BIND(&if_already_resolved);
693-
{
694-
Return(CallRuntime(Runtime::kPromiseResolveAfterResolved, context, promise,
695-
resolution));
696-
}
697-
}
698-
699633
TF_BUILTIN(PromiseConstructorLazyDeoptContinuation, PromiseBuiltinsAssembler) {
700634
Node* promise = Parameter(Descriptor::kPromise);
701635
Node* reject = Parameter(Descriptor::kReject);

src/builtins/promise-abstract-operations.tq

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,15 @@
77

88
namespace runtime {
99
extern transitioning runtime
10-
RejectPromise(implicit context: Context)(JSPromise, JSAny, Boolean): Object;
10+
RejectPromise(implicit context: Context)(JSPromise, JSAny, Boolean): JSAny;
11+
12+
extern transitioning runtime
13+
PromiseRejectAfterResolved(implicit context: Context)(JSPromise, JSAny):
14+
JSAny;
15+
16+
extern transitioning runtime
17+
PromiseResolveAfterResolved(implicit context: Context)(JSPromise, JSAny):
18+
JSAny;
1119
}
1220

1321
// https://tc39.es/ecma262/#sec-promise-abstract-operations
@@ -36,6 +44,8 @@ namespace promise {
3644
extern macro PromiseReactionMapConstant(): Map;
3745
extern macro PromiseFulfillReactionJobTaskMapConstant(): Map;
3846
extern macro PromiseRejectReactionJobTaskMapConstant(): Map;
47+
extern transitioning builtin
48+
ResolvePromise(Context, JSPromise, JSAny): JSAny;
3949

4050
extern transitioning builtin
4151
EnqueueMicrotask(Context, PromiseReactionJobTask): Undefined;
@@ -196,7 +206,7 @@ namespace promise {
196206
// https://tc39.es/ecma262/#sec-rejectpromise
197207
transitioning builtin
198208
RejectPromise(implicit context: Context)(
199-
promise: JSPromise, reason: JSAny, debugEvent: Boolean): Object {
209+
promise: JSPromise, reason: JSAny, debugEvent: Boolean): JSAny {
200210
// If promise hook is enabled or the debugger is active, let
201211
// the runtime handle this operation, which greatly reduces
202212
// the complexity here and also avoids a couple of back and
@@ -233,6 +243,12 @@ namespace promise {
233243
generates 'PromiseBuiltins::kCapabilitiesContextLength';
234244
const kPromiseBuiltinsCapabilitySlot: constexpr ContextSlot
235245
generates 'PromiseBuiltins::kCapabilitySlot';
246+
const kPromiseBuiltinsPromiseSlot: constexpr ContextSlot
247+
generates 'PromiseBuiltins::kPromiseSlot';
248+
const kPromiseBuiltinsAlreadyResolvedSlot: constexpr ContextSlot
249+
generates 'PromiseBuiltins::kAlreadyResolvedSlot';
250+
const kPromiseBuiltinsDebugEventSlot: constexpr ContextSlot
251+
generates 'PromiseBuiltins::kDebugEventSlot';
236252

237253
extern macro
238254
PromiseBuiltinsAssembler::AllocateAndInitJSPromise(Context): JSPromise;
@@ -340,4 +356,53 @@ namespace promise {
340356
}
341357
}
342358
}
359+
360+
// https://tc39.es/ecma262/#sec-promise-reject-functions
361+
transitioning javascript builtin
362+
PromiseCapabilityDefaultReject(js-implicit context: Context, receiver: JSAny)(
363+
reason: JSAny): JSAny {
364+
// 2. Let promise be F.[[Promise]].
365+
const promise = UnsafeCast<JSPromise>(context[kPromiseBuiltinsPromiseSlot]);
366+
367+
// 3. Let alreadyResolved be F.[[AlreadyResolved]].
368+
const alreadyResolved =
369+
UnsafeCast<Boolean>(context[kPromiseBuiltinsAlreadyResolvedSlot]);
370+
371+
// 4. If alreadyResolved.[[Value]] is true, return undefined.
372+
if (alreadyResolved == True) {
373+
return runtime::PromiseRejectAfterResolved(promise, reason);
374+
}
375+
376+
// 5. Set alreadyResolved.[[Value]] to true.
377+
context[kPromiseBuiltinsAlreadyResolvedSlot] = True;
378+
379+
// 6. Return RejectPromise(promise, reason).
380+
const debugEvent =
381+
UnsafeCast<Boolean>(context[kPromiseBuiltinsDebugEventSlot]);
382+
return RejectPromise(promise, reason, debugEvent);
383+
}
384+
385+
// https://tc39.es/ecma262/#sec-promise-resolve-functions
386+
transitioning javascript builtin
387+
PromiseCapabilityDefaultResolve(
388+
js-implicit context: Context, receiver: JSAny)(resolution: JSAny): JSAny {
389+
// 2. Let promise be F.[[Promise]].
390+
const promise = UnsafeCast<JSPromise>(context[kPromiseBuiltinsPromiseSlot]);
391+
392+
// 3. Let alreadyResolved be F.[[AlreadyResolved]].
393+
const alreadyResolved =
394+
UnsafeCast<Boolean>(context[kPromiseBuiltinsAlreadyResolvedSlot]);
395+
396+
// 4. If alreadyResolved.[[Value]] is true, return undefined.
397+
if (alreadyResolved == True) {
398+
return runtime::PromiseResolveAfterResolved(promise, resolution);
399+
}
400+
401+
// 5. Set alreadyResolved.[[Value]] to true.
402+
context[kPromiseBuiltinsAlreadyResolvedSlot] = True;
403+
404+
// The rest of the logic (and the catch prediction) is
405+
// encapsulated in the dedicated ResolvePromise builtin.
406+
return ResolvePromise(context, promise, resolution);
407+
}
343408
}

0 commit comments

Comments
 (0)