summaryrefslogtreecommitdiff
path: root/deps/v8/src/runtime/runtime-promise.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/runtime/runtime-promise.cc')
-rw-r--r--deps/v8/src/runtime/runtime-promise.cc115
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