Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1047)

Unified Diff: src/builtins/builtins-promise.cc

Issue 2575313002: [promisehook] Implement PromiseHook (Closed)
Patch Set: move resolve hook Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/builtins/builtins-promise.cc
diff --git a/src/builtins/builtins-promise.cc b/src/builtins/builtins-promise.cc
index 3d4f6c3a50a97cc562594214a60cc675688c02b7..bb259258054b0b3f2cc796780b08057dea44d7a6 100644
--- a/src/builtins/builtins-promise.cc
+++ b/src/builtins/builtins-promise.cc
@@ -24,11 +24,13 @@ BUILTIN(PromiseRejectClosure) {
PromiseUtils::SetAlreadyVisited(context);
Handle<Object> value = args.atOrUndefined(isolate, 1);
- Handle<JSObject> promise = handle(PromiseUtils::GetPromise(context), isolate);
+ Handle<JSPromise> promise =
+ handle(PromiseUtils::GetPromise(context), isolate);
Handle<Object> debug_event =
handle(PromiseUtils::GetDebugEvent(context), isolate);
MaybeHandle<Object> maybe_result;
Handle<Object> argv[] = {promise, value, debug_event};
+
RETURN_FAILURE_ON_EXCEPTION(
isolate, Execution::Call(isolate, isolate->promise_internal_reject(),
isolate->factory()->undefined_value(),
@@ -98,6 +100,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 +186,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 +214,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 +625,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);
}
@@ -677,6 +698,12 @@ void InternalResolvePromise(CodeStubAssembler* a, compiler::Node* context,
Label do_enqueue(a), fulfill(a), if_cycle(a, Label::kDeferred),
if_rejectpromise(a, Label::kDeferred);
+ Label cycle_check(a);
+ a->GotoUnless(a->IsPromiseHookEnabled(), &cycle_check);
+ a->CallRuntime(Runtime::kPromiseHookResolve, context, promise);
+ a->Goto(&cycle_check);
+
+ a->Bind(&cycle_check);
// 6. If SameValue(resolution, promise) is true, then
a->GotoIf(a->SameValue(promise, result, context), &if_cycle);
@@ -909,6 +936,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 +954,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);
Dan Ehrenberg 2016/12/15 22:21:48 Nit: It would feel a little cleaner to me if the b
gsathya 2016/12/16 00:55:16 Done.
a.Bind(&debug_push);
{
+ a.GotoUnless(is_debug_active, &run_handler);
a.CallRuntime(Runtime::kDebugPushPromise, context, deferred_promise);
a.Goto(&run_handler);
}
@@ -953,14 +985,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 +1007,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);
« no previous file with comments | « src/builtins/builtins.h ('k') | src/code-stub-assembler.cc » ('j') | test/cctest/test-api.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698