v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
runtime-promise.cc
Go to the documentation of this file.
1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/api/api-inl.h"
6#include "src/debug/debug.h"
10
11namespace v8 {
12namespace internal {
13
14RUNTIME_FUNCTION(Runtime_PromiseRejectEventFromStack) {
15 DCHECK_EQ(2, args.length());
16 HandleScope scope(isolate);
17 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
18 DirectHandle<Object> value = args.at(1);
19
20 isolate->RunAllPromiseHooks(PromiseHookType::kResolve, promise,
21 isolate->factory()->undefined_value());
22 isolate->debug()->OnPromiseReject(promise, value);
23
24 // Report only if we don't actually have a handler.
25 if (!promise->has_handler()) {
26 isolate->ReportPromiseReject(promise, value,
28 }
29 return ReadOnlyRoots(isolate).undefined_value();
30}
31
32RUNTIME_FUNCTION(Runtime_PromiseRejectAfterResolved) {
33 DCHECK_EQ(2, args.length());
34 HandleScope scope(isolate);
35 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
36 DirectHandle<Object> reason = args.at(1);
37 isolate->ReportPromiseReject(promise, reason,
39 return ReadOnlyRoots(isolate).undefined_value();
40}
41
42RUNTIME_FUNCTION(Runtime_PromiseResolveAfterResolved) {
43 DCHECK_EQ(2, args.length());
44 HandleScope scope(isolate);
45 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
46 DirectHandle<Object> resolution = args.at(1);
47 isolate->ReportPromiseReject(promise, resolution,
49 return ReadOnlyRoots(isolate).undefined_value();
50}
51
52RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) {
53 DCHECK_EQ(1, args.length());
54 HandleScope scope(isolate);
55 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
56 // At this point, no revocation has been issued before
57 CHECK(!promise->has_handler());
58 isolate->ReportPromiseReject(promise, DirectHandle<Object>(),
60 return ReadOnlyRoots(isolate).undefined_value();
61}
62
63RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) {
64 HandleScope scope(isolate);
65 DCHECK_EQ(1, args.length());
67
68 DirectHandle<CallableTask> microtask = isolate->factory()->NewCallableTask(
69 function, direct_handle(function->native_context(), isolate));
71 function->native_context()->microtask_queue();
73 return ReadOnlyRoots(isolate).undefined_value();
74}
75
76RUNTIME_FUNCTION(Runtime_PerformMicrotaskCheckpoint) {
77 HandleScope scope(isolate);
78 DCHECK_EQ(0, args.length());
79 MicrotasksScope::PerformCheckpoint(reinterpret_cast<v8::Isolate*>(isolate));
80 return ReadOnlyRoots(isolate).undefined_value();
81}
82
83RUNTIME_FUNCTION(Runtime_RunMicrotaskCallback) {
84 HandleScope scope(isolate);
85 DCHECK_EQ(2, args.length());
86 Tagged<Object> microtask_callback = args[0];
87 Tagged<Object> microtask_data = args[1];
90 microtask_callback);
91 void* data =
92 ToCData<void*, kMicrotaskCallbackDataTag>(isolate, microtask_data);
93 callback(data);
95 return ReadOnlyRoots(isolate).undefined_value();
96}
97
98RUNTIME_FUNCTION(Runtime_PromiseHookInit) {
99 HandleScope scope(isolate);
100 DCHECK_EQ(2, args.length());
101 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
102 DirectHandle<Object> parent = args.at(1);
103 isolate->RunPromiseHook(PromiseHookType::kInit, promise, parent);
105 return ReadOnlyRoots(isolate).undefined_value();
106}
107
108RUNTIME_FUNCTION(Runtime_PromiseHookBefore) {
109 HandleScope scope(isolate);
110 DCHECK_EQ(1, args.length());
112 if (IsJSPromise(*promise)) {
113 isolate->OnPromiseBefore(Cast<JSPromise>(promise));
115 }
116 return ReadOnlyRoots(isolate).undefined_value();
117}
118
119RUNTIME_FUNCTION(Runtime_PromiseHookAfter) {
120 HandleScope scope(isolate);
121 DCHECK_EQ(1, args.length());
123 if (IsJSPromise(*promise)) {
124 isolate->OnPromiseAfter(Cast<JSPromise>(promise));
126 }
127 return ReadOnlyRoots(isolate).undefined_value();
128}
129
130RUNTIME_FUNCTION(Runtime_RejectPromise) {
131 HandleScope scope(isolate);
132 DCHECK_EQ(3, args.length());
133 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
134 DirectHandle<Object> reason = args.at(1);
135 DirectHandle<Boolean> debug_event = args.at<Boolean>(2);
136 return *JSPromise::Reject(promise, reason,
137 Object::BooleanValue(*debug_event, isolate));
138}
139
140RUNTIME_FUNCTION(Runtime_ResolvePromise) {
141 HandleScope scope(isolate);
142 DCHECK_EQ(2, args.length());
143 DirectHandle<JSPromise> promise = args.at<JSPromise>(0);
144 DirectHandle<Object> resolution = args.at(1);
147 JSPromise::Resolve(promise, resolution));
148 return *result;
149}
150
151// A helper function to be called when constructing AggregateError objects. This
152// takes care of the Error-related construction, e.g., stack traces.
153RUNTIME_FUNCTION(Runtime_ConstructAggregateErrorHelper) {
154 HandleScope scope(isolate);
155 DCHECK_EQ(4, args.length());
158 DirectHandle<Object> message = args.at(2);
159 DirectHandle<Object> options = args.at(3);
160
161 DCHECK_EQ(*target, *isolate->aggregate_error_function());
162
165 isolate, result,
166 ErrorUtils::Construct(isolate, target, new_target, message, options));
167 return *result;
168}
169
170// A helper function to be called when constructing AggregateError objects. This
171// takes care of the Error-related construction, e.g., stack traces.
172RUNTIME_FUNCTION(Runtime_ConstructInternalAggregateErrorHelper) {
173 HandleScope scope(isolate);
174 DCHECK_GE(args.length(), 1);
175 int message_template_index = args.smi_value_at(0);
176
177 constexpr int kMaxMessageArgs = 3;
178 DirectHandle<Object> message_args[kMaxMessageArgs];
179 int num_message_args = 0;
180
181 while (num_message_args < kMaxMessageArgs &&
182 args.length() > num_message_args + 1) {
183 message_args[num_message_args] = args.at(num_message_args + 1);
184 }
185
186 DirectHandle<Object> options =
187 args.length() >= 5 ? args.at(4) : isolate->factory()->undefined_value();
188
189 DirectHandle<Object> message_string =
190 MessageFormatter::Format(isolate, MessageTemplate(message_template_index),
191 base::VectorOf(message_args, num_message_args));
192
195 isolate, result,
196 ErrorUtils::Construct(isolate, isolate->aggregate_error_function(),
197 isolate->aggregate_error_function(), message_string,
198 options));
199 return *result;
200}
201
202RUNTIME_FUNCTION(Runtime_ConstructSuppressedError) {
203 HandleScope scope(isolate);
204 DCHECK_EQ(3, args.length());
207 DirectHandle<Object> message = args.at(2);
208
209 DCHECK_EQ(*target, *isolate->suppressed_error_function());
210
213 isolate, result,
214 ErrorUtils::Construct(isolate, target, new_target, message,
215 isolate->factory()->undefined_value()));
216 return *result;
217}
218
219} // namespace internal
220} // namespace v8
static void PerformCheckpoint(Isolate *isolate)
Definition api.cc:11011
static MaybeDirectHandle< JSObject > Construct(Isolate *isolate, DirectHandle< JSFunction > target, DirectHandle< Object > new_target, DirectHandle< Object > message, DirectHandle< Object > options)
Definition messages.cc:528
static Handle< Object > Reject(DirectHandle< JSPromise > promise, DirectHandle< Object > reason, bool debug_event=true)
Definition objects.cc:5069
static V8_WARN_UNUSED_RESULT MaybeHandle< Object > Resolve(DirectHandle< JSPromise > promise, DirectHandle< Object > resolution)
Definition objects.cc:5109
static DirectHandle< String > Format(Isolate *isolate, MessageTemplate index, base::Vector< const DirectHandle< Object > > args)
Definition messages.cc:396
void EnqueueMicrotask(v8::Isolate *isolate, v8::Local< Function > microtask) override
static V8_EXPORT_PRIVATE bool BooleanValue(Tagged< Object > obj, IsolateT *isolate)
#define RUNTIME_FUNCTION(Name)
Definition arguments.h:162
#define RETURN_FAILURE_IF_EXCEPTION(isolate)
Definition isolate.h:205
#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)
Definition isolate.h:284
MicrotaskQueue * microtask_queue
Definition execution.cc:77
base::Vector< const DirectHandle< Object > > args
Definition execution.cc:74
DirectHandle< Object > new_target
Definition execution.cc:75
TNode< Object > callback
ZoneVector< RpoNumber > & result
constexpr Vector< T > VectorOf(T *start, size_t size)
Definition vector.h:360
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
@ kPromiseHandlerAddedAfterReject
Definition v8-promise.h:149
@ kPromiseRejectWithNoHandler
Definition v8-promise.h:148
@ kPromiseRejectAfterResolved
Definition v8-promise.h:150
@ kPromiseResolveAfterResolved
Definition v8-promise.h:151
void(*)(void *data) MicrotaskCallback
T ToCData(i::Isolate *isolate, v8::internal::Tagged< v8::internal::Object > obj)
Definition api-inl.h:23
#define CHECK(condition)
Definition logging.h:124
#define DCHECK_GE(v1, v2)
Definition logging.h:488
#define DCHECK_EQ(v1, v2)
Definition logging.h:485