| Index: src/builtins/builtins-promise.cc
|
| diff --git a/src/builtins/builtins-promise.cc b/src/builtins/builtins-promise.cc
|
| index 829a0b64b152271d04596a48945b00699233220a..16cfc9fc2423367aca0e0754779a3445498d73ff 100644
|
| --- a/src/builtins/builtins-promise.cc
|
| +++ b/src/builtins/builtins-promise.cc
|
| @@ -29,6 +29,12 @@ BUILTIN(PromiseRejectClosure) {
|
| handle(PromiseUtils::GetDebugEvent(context), isolate);
|
| MaybeHandle<Object> maybe_result;
|
| Handle<Object> argv[] = {promise, value, debug_event};
|
| +
|
| + if (isolate->IsPromiseHookEnabled()) {
|
| + isolate->RunPromiseHook(PromiseHookType::kResolve, promise,
|
| + isolate->factory()->undefined_value());
|
| + }
|
| +
|
| RETURN_FAILURE_ON_EXCEPTION(
|
| isolate, Execution::Call(isolate, isolate->promise_internal_reject(),
|
| isolate->factory()->undefined_value(),
|
| @@ -98,6 +104,9 @@ void Builtins::Generate_PromiseConstructor(
|
| {
|
| Node* const instance = a.AllocateJSPromise(context);
|
| var_result.Bind(instance);
|
| + a.GotoUnless(a.IsPromiseHookEnabled(), &init);
|
| + a.CallRuntime(Runtime::kPromiseHookInit, context, instance,
|
| + a.UndefinedConstant());
|
| a.Goto(&init);
|
| }
|
|
|
| @@ -181,17 +190,26 @@ void Builtins::Generate_PromiseConstructor(
|
| void Builtins::Generate_PromiseInternalConstructor(
|
| compiler::CodeAssemblerState* state) {
|
| typedef compiler::Node Node;
|
| + typedef CodeStubAssembler::Label Label;
|
| CodeStubAssembler a(state);
|
|
|
| - Node* const context = a.Parameter(3);
|
| + Node* const parent = a.Parameter(1);
|
| + Node* const context = a.Parameter(4);
|
| Node* const instance = a.AllocateJSPromise(context);
|
| a.PromiseInit(instance);
|
| +
|
| + Label out(&a);
|
| + a.GotoUnless(a.IsPromiseHookEnabled(), &out);
|
| + a.CallRuntime(Runtime::kPromiseHookInit, context, instance, parent);
|
| + a.Goto(&out);
|
| + a.Bind(&out);
|
| a.Return(instance);
|
| }
|
|
|
| void Builtins::Generate_PromiseCreateAndSet(
|
| compiler::CodeAssemblerState* state) {
|
| typedef compiler::Node Node;
|
| + typedef CodeStubAssembler::Label Label;
|
| CodeStubAssembler a(state);
|
|
|
| Node* const status = a.Parameter(1);
|
| @@ -200,6 +218,13 @@ void Builtins::Generate_PromiseCreateAndSet(
|
|
|
| Node* const instance = a.AllocateJSPromise(context);
|
| a.PromiseSet(instance, status, result);
|
| +
|
| + Label out(&a);
|
| + a.GotoUnless(a.IsPromiseHookEnabled(), &out);
|
| + a.CallRuntime(Runtime::kPromiseHookInit, context, instance,
|
| + a.UndefinedConstant());
|
| + a.Goto(&out);
|
| + a.Bind(&out);
|
| a.Return(instance);
|
| }
|
|
|
| @@ -604,7 +629,7 @@ void Builtins::Generate_PromiseThen(compiler::CodeAssemblerState* state) {
|
| native_context, Context::INTERNAL_PROMISE_CAPABILITY_INDEX);
|
| Node* const capability =
|
| a.CallJS(call_callable, context, promise_internal_capability,
|
| - a.UndefinedConstant());
|
| + a.UndefinedConstant(), promise);
|
| var_deferred.Bind(capability);
|
| a.Goto(&perform_promise_then);
|
| }
|
| @@ -846,6 +871,12 @@ void Builtins::Generate_PromiseResolveClosure(
|
| Node* const promise = a.LoadFixedArrayElement(
|
| context, a.IntPtrConstant(PromiseUtils::kPromiseSlot));
|
|
|
| + Label run_resolve(&a);
|
| + a.GotoUnless(a.IsPromiseHookEnabled(), &run_resolve);
|
| + a.CallRuntime(Runtime::kPromiseHookResolve, context, promise);
|
| + a.Goto(&run_resolve);
|
| +
|
| + a.Bind(&run_resolve);
|
| InternalResolvePromise(&a, context, promise, value, &out);
|
|
|
| a.Bind(&out);
|
| @@ -909,6 +940,7 @@ void Builtins::Generate_PromiseHandle(compiler::CodeAssemblerState* state) {
|
| typedef CodeStubAssembler::Label Label;
|
| typedef CodeStubAssembler::Variable Variable;
|
|
|
| + Node* const promise = a.Parameter(1);
|
| Node* const value = a.Parameter(2);
|
| Node* const handler = a.Parameter(3);
|
| Node* const deferred = a.Parameter(4);
|
| @@ -926,11 +958,15 @@ void Builtins::Generate_PromiseHandle(compiler::CodeAssemblerState* state) {
|
|
|
| Node* const is_debug_active = a.IsDebugActive();
|
| Label run_handler(&a), if_rejectpromise(&a), debug_push(&a, Label::kDeferred),
|
| - debug_pop(&a, Label::kDeferred);
|
| - a.Branch(is_debug_active, &debug_push, &run_handler);
|
| + debug_pop(&a), promisehook_after(&a);
|
| +
|
| + a.GotoUnless(a.IsPromiseHookEnabled(), &debug_push);
|
| + a.CallRuntime(Runtime::kPromiseHookBefore, context, promise);
|
| + a.Goto(&debug_push);
|
|
|
| a.Bind(&debug_push);
|
| {
|
| + a.GotoUnless(is_debug_active, &run_handler);
|
| a.CallRuntime(Runtime::kDebugPushPromise, context, deferred_promise);
|
| a.Goto(&run_handler);
|
| }
|
| @@ -953,14 +989,15 @@ void Builtins::Generate_PromiseHandle(compiler::CodeAssemblerState* state) {
|
| a.Branch(a.IsUndefined(on_resolve), &if_internalhandler, &if_customhandler);
|
|
|
| a.Bind(&if_internalhandler);
|
| - InternalResolvePromise(&a, context, deferred_promise, result, &debug_pop);
|
| + InternalResolvePromise(&a, context, deferred_promise, result,
|
| + &promisehook_after);
|
|
|
| a.Bind(&if_customhandler);
|
| {
|
| Node* const maybe_exception = a.CallJS(call_callable, context, on_resolve,
|
| a.UndefinedConstant(), result);
|
| a.GotoIfException(maybe_exception, &if_rejectpromise, &var_reason);
|
| - a.Goto(&debug_pop);
|
| + a.Goto(&promisehook_after);
|
| }
|
| }
|
|
|
| @@ -974,13 +1011,19 @@ void Builtins::Generate_PromiseHandle(compiler::CodeAssemblerState* state) {
|
| Callable promise_handle_reject = CodeFactory::PromiseHandleReject(isolate);
|
| a.CallStub(promise_handle_reject, context, deferred_promise, on_reject,
|
| var_reason.value());
|
| + a.Goto(&promisehook_after);
|
| + }
|
| +
|
| + a.Bind(&promisehook_after);
|
| + {
|
| + a.GotoUnless(a.IsPromiseHookEnabled(), &debug_pop);
|
| + a.CallRuntime(Runtime::kPromiseHookAfter, context, promise);
|
| a.Goto(&debug_pop);
|
| }
|
|
|
| a.Bind(&debug_pop);
|
| {
|
| Label out(&a);
|
| -
|
| a.GotoUnless(is_debug_active, &out);
|
| a.CallRuntime(Runtime::kDebugPopPromise, context);
|
| a.Goto(&out);
|
|
|