diff options
Diffstat (limited to 'deps/v8/src/runtime/runtime-promise.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-promise.cc | 115 |
1 files changed, 62 insertions, 53 deletions
diff --git a/deps/v8/src/runtime/runtime-promise.cc b/deps/v8/src/runtime/runtime-promise.cc index 2c28cd3c98..2d3a4fda50 100644 --- a/deps/v8/src/runtime/runtime-promise.cc +++ b/deps/v8/src/runtime/runtime-promise.cc @@ -1,8 +1,10 @@ // Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. + #include "src/runtime/runtime-utils.h" +#include "src/api.h" #include "src/arguments.h" #include "src/counters.h" #include "src/debug/debug.h" @@ -12,27 +14,6 @@ namespace v8 { namespace internal { -namespace { - -void PromiseRejectEvent(Isolate* isolate, Handle<JSPromise> promise, - Handle<Object> rejected_promise, Handle<Object> value, - bool debug_event) { - isolate->RunPromiseHook(PromiseHookType::kResolve, promise, - isolate->factory()->undefined_value()); - - if (isolate->debug()->is_active() && debug_event) { - isolate->debug()->OnPromiseReject(rejected_promise, value); - } - - // Report only if we don't actually have a handler. - if (!promise->has_handler()) { - isolate->ReportPromiseReject(promise, value, - v8::kPromiseRejectWithNoHandler); - } -} - -} // namespace - RUNTIME_FUNCTION(Runtime_PromiseRejectEventFromStack) { DCHECK_EQ(2, args.length()); HandleScope scope(isolate); @@ -41,21 +22,19 @@ RUNTIME_FUNCTION(Runtime_PromiseRejectEventFromStack) { Handle<Object> rejected_promise = promise; if (isolate->debug()->is_active()) { - // If the Promise.reject call is caught, then this will return - // undefined, which will be interpreted by PromiseRejectEvent - // as being a caught exception event. + // If the Promise.reject() call is caught, then this will return + // undefined, which we interpret as being a caught exception event. rejected_promise = isolate->GetPromiseOnStackOnThrow(); } - PromiseRejectEvent(isolate, promise, rejected_promise, value, true); - return isolate->heap()->undefined_value(); -} + isolate->RunPromiseHook(PromiseHookType::kResolve, promise, + isolate->factory()->undefined_value()); + isolate->debug()->OnPromiseReject(rejected_promise, value); -RUNTIME_FUNCTION(Runtime_ReportPromiseReject) { - DCHECK_EQ(2, args.length()); - HandleScope scope(isolate); - CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); - CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); - isolate->ReportPromiseReject(promise, value, v8::kPromiseRejectWithNoHandler); + // Report only if we don't actually have a handler. + if (!promise->has_handler()) { + isolate->ReportPromiseReject(promise, value, + v8::kPromiseRejectWithNoHandler); + } return isolate->heap()->undefined_value(); } @@ -73,7 +52,9 @@ RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) { RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSFunction, microtask, 0); + CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); + Handle<CallableTask> microtask = + isolate->factory()->NewCallableTask(function, isolate->native_context()); isolate->EnqueueMicrotask(microtask); return isolate->heap()->undefined_value(); } @@ -85,6 +66,17 @@ RUNTIME_FUNCTION(Runtime_RunMicrotasks) { return isolate->heap()->undefined_value(); } +RUNTIME_FUNCTION(Runtime_RunMicrotaskCallback) { + HandleScope scope(isolate); + DCHECK_EQ(2, args.length()); + CONVERT_ARG_CHECKED(Object, microtask_callback, 0); + CONVERT_ARG_CHECKED(Object, microtask_data, 1); + MicrotaskCallback callback = ToCData<MicrotaskCallback>(microtask_callback); + void* data = ToCData<void*>(microtask_data); + callback(data); + return isolate->heap()->undefined_value(); +} + RUNTIME_FUNCTION(Runtime_PromiseStatus) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); @@ -118,23 +110,17 @@ RUNTIME_FUNCTION(Runtime_PromiseHookInit) { return isolate->heap()->undefined_value(); } -RUNTIME_FUNCTION(Runtime_PromiseHookResolve) { - HandleScope scope(isolate); - DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); - isolate->RunPromiseHook(PromiseHookType::kResolve, promise, - isolate->factory()->undefined_value()); - return isolate->heap()->undefined_value(); -} - RUNTIME_FUNCTION(Runtime_PromiseHookBefore) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); - if (promise->IsJSPromise()) { - isolate->RunPromiseHook(PromiseHookType::kBefore, - Handle<JSPromise>::cast(promise), - isolate->factory()->undefined_value()); + CONVERT_ARG_HANDLE_CHECKED(HeapObject, payload, 0); + Handle<JSPromise> promise; + if (JSPromise::From(payload).ToHandle(&promise)) { + if (isolate->debug()->is_active()) isolate->PushPromise(promise); + if (promise->IsJSPromise()) { + isolate->RunPromiseHook(PromiseHookType::kBefore, promise, + isolate->factory()->undefined_value()); + } } return isolate->heap()->undefined_value(); } @@ -142,14 +128,37 @@ RUNTIME_FUNCTION(Runtime_PromiseHookBefore) { RUNTIME_FUNCTION(Runtime_PromiseHookAfter) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); - CONVERT_ARG_HANDLE_CHECKED(JSObject, promise, 0); - if (promise->IsJSPromise()) { - isolate->RunPromiseHook(PromiseHookType::kAfter, - Handle<JSPromise>::cast(promise), - isolate->factory()->undefined_value()); + CONVERT_ARG_HANDLE_CHECKED(HeapObject, payload, 0); + Handle<JSPromise> promise; + if (JSPromise::From(payload).ToHandle(&promise)) { + if (isolate->debug()->is_active()) isolate->PopPromise(); + if (promise->IsJSPromise()) { + isolate->RunPromiseHook(PromiseHookType::kAfter, promise, + isolate->factory()->undefined_value()); + } } return isolate->heap()->undefined_value(); } +RUNTIME_FUNCTION(Runtime_RejectPromise) { + HandleScope scope(isolate); + DCHECK_EQ(3, args.length()); + CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); + CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1); + CONVERT_ARG_HANDLE_CHECKED(Oddball, debug_event, 2); + return *JSPromise::Reject(promise, reason, debug_event->BooleanValue()); +} + +RUNTIME_FUNCTION(Runtime_ResolvePromise) { + HandleScope scope(isolate); + DCHECK_EQ(2, args.length()); + CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); + CONVERT_ARG_HANDLE_CHECKED(Object, resolution, 1); + Handle<Object> result; + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, + JSPromise::Resolve(promise, resolution)); + return *result; +} + } // namespace internal } // namespace v8 |