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

Side by Side Diff: src/runtime/runtime-promise.cc

Issue 2630593004: [promises] Remove runtime call from fastpath in PromiseReject (Closed)
Patch Set: remove helper Created 3 years, 11 months 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 unified diff | Download patch
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 #include "src/runtime/runtime-utils.h" 4 #include "src/runtime/runtime-utils.h"
5 5
6 #include "src/debug/debug.h" 6 #include "src/debug/debug.h"
7 #include "src/elements.h" 7 #include "src/elements.h"
8 #include "src/promise-utils.h" 8 #include "src/promise-utils.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 // as being a caught exception event. 44 // as being a caught exception event.
45 rejected_promise = isolate->GetPromiseOnStackOnThrow(); 45 rejected_promise = isolate->GetPromiseOnStackOnThrow();
46 isolate->debug()->OnAsyncTaskEvent( 46 isolate->debug()->OnAsyncTaskEvent(
47 debug::kDebugEnqueuePromiseReject, 47 debug::kDebugEnqueuePromiseReject,
48 isolate->debug()->NextAsyncTaskId(promise)); 48 isolate->debug()->NextAsyncTaskId(promise));
49 } 49 }
50 PromiseRejectEvent(isolate, promise, rejected_promise, value, true); 50 PromiseRejectEvent(isolate, promise, rejected_promise, value, true);
51 return isolate->heap()->undefined_value(); 51 return isolate->heap()->undefined_value();
52 } 52 }
53 53
54 RUNTIME_FUNCTION(Runtime_ReportPromiseReject) {
55 DCHECK_EQ(2, args.length());
56 HandleScope scope(isolate);
57 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
58 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
59 isolate->ReportPromiseReject(Handle<JSObject>::cast(promise), value,
60 v8::kPromiseRejectWithNoHandler);
61 return isolate->heap()->undefined_value();
62 }
63
54 RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) { 64 RUNTIME_FUNCTION(Runtime_PromiseRevokeReject) {
55 DCHECK_EQ(1, args.length()); 65 DCHECK_EQ(1, args.length());
56 HandleScope scope(isolate); 66 HandleScope scope(isolate);
57 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 67 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
58 // At this point, no revocation has been issued before 68 // At this point, no revocation has been issued before
59 CHECK(!promise->has_handler()); 69 CHECK(!promise->has_handler());
60 isolate->ReportPromiseReject(promise, Handle<Object>(), 70 isolate->ReportPromiseReject(promise, Handle<Object>(),
61 v8::kPromiseHandlerAddedAfterReject); 71 v8::kPromiseHandlerAddedAfterReject);
62 return isolate->heap()->undefined_value(); 72 return isolate->heap()->undefined_value();
63 } 73 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 void EnqueuePromiseReactionJob(Isolate* isolate, Handle<JSPromise> promise, 133 void EnqueuePromiseReactionJob(Isolate* isolate, Handle<JSPromise> promise,
124 Handle<PromiseReactionJobInfo> info, 134 Handle<PromiseReactionJobInfo> info,
125 int status) { 135 int status) {
126 if (isolate->debug()->is_active()) { 136 if (isolate->debug()->is_active()) {
127 SetDebugInfo(isolate, promise, info, status); 137 SetDebugInfo(isolate, promise, info, status);
128 } 138 }
129 139
130 isolate->EnqueueMicrotask(info); 140 isolate->EnqueueMicrotask(info);
131 } 141 }
132 142
133 void PromiseSet(Isolate* isolate, Handle<JSPromise> promise, int status,
134 Handle<Object> result) {
135 promise->set_status(status);
136 promise->set_result(*result);
137 promise->set_deferred_promise(isolate->heap()->undefined_value());
138 promise->set_deferred_on_resolve(isolate->heap()->undefined_value());
139 promise->set_deferred_on_reject(isolate->heap()->undefined_value());
140 promise->set_fulfill_reactions(isolate->heap()->undefined_value());
141 promise->set_reject_reactions(isolate->heap()->undefined_value());
142 }
143
144 void PromiseFulfill(Isolate* isolate, Handle<JSPromise> promise, int status,
145 Handle<Object> value) {
146 if (isolate->debug()->is_active()) {
147 isolate->debug()->OnAsyncTaskEvent(
148 status == v8::Promise::kFulfilled ? debug::kDebugEnqueuePromiseResolve
149 : debug::kDebugEnqueuePromiseReject,
150 isolate->debug()->NextAsyncTaskId(promise));
151 }
152 // Check if there are any callbacks.
153 if (!promise->deferred_promise()->IsUndefined(isolate)) {
154 Handle<Object> tasks((status == v8::Promise::kFulfilled)
155 ? promise->fulfill_reactions()
156 : promise->reject_reactions(),
157 isolate);
158 Handle<PromiseReactionJobInfo> info =
159 isolate->factory()->NewPromiseReactionJobInfo(
160 value, tasks, handle(promise->deferred_promise(), isolate),
161 handle(promise->deferred_on_resolve(), isolate),
162 handle(promise->deferred_on_reject(), isolate),
163 isolate->native_context());
164 EnqueuePromiseReactionJob(isolate, promise, info, status);
165 }
166
167 PromiseSet(isolate, promise, status, value);
168 }
169
170 } // namespace 143 } // namespace
171 144
172 RUNTIME_FUNCTION(Runtime_PromiseReject) {
173 DCHECK_EQ(3, args.length());
174 HandleScope scope(isolate);
175 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
176 CONVERT_ARG_HANDLE_CHECKED(Object, reason, 1);
177 CONVERT_BOOLEAN_ARG_CHECKED(debug_event, 2);
178
179 PromiseRejectEvent(isolate, promise, promise, reason, debug_event);
180 PromiseFulfill(isolate, promise, v8::Promise::kRejected, reason);
181
182 return isolate->heap()->undefined_value();
183 }
184
185 RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) { 145 RUNTIME_FUNCTION(Runtime_EnqueuePromiseReactionJob) {
186 HandleScope scope(isolate); 146 HandleScope scope(isolate);
187 DCHECK_EQ(3, args.length()); 147 DCHECK_EQ(3, args.length());
188 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 148 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
189 CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 1); 149 CONVERT_ARG_HANDLE_CHECKED(PromiseReactionJobInfo, info, 1);
190 CONVERT_SMI_ARG_CHECKED(status, 2); 150 CONVERT_SMI_ARG_CHECKED(status, 2);
191 EnqueuePromiseReactionJob(isolate, promise, info, status); 151 EnqueuePromiseReactionJob(isolate, promise, info, status);
192 return isolate->heap()->undefined_value(); 152 return isolate->heap()->undefined_value();
193 } 153 }
194 154
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 HandleScope scope(isolate); 239 HandleScope scope(isolate);
280 DCHECK_EQ(1, args.length()); 240 DCHECK_EQ(1, args.length());
281 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0); 241 CONVERT_ARG_HANDLE_CHECKED(JSPromise, promise, 0);
282 isolate->RunPromiseHook(PromiseHookType::kAfter, promise, 242 isolate->RunPromiseHook(PromiseHookType::kAfter, promise,
283 isolate->factory()->undefined_value()); 243 isolate->factory()->undefined_value());
284 return isolate->heap()->undefined_value(); 244 return isolate->heap()->undefined_value();
285 } 245 }
286 246
287 } // namespace internal 247 } // namespace internal
288 } // namespace v8 248 } // namespace v8
OLDNEW
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698