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

Side by Side Diff: src/isolate.cc

Issue 2554943002: Reland Create JSPromise (patchset #16 id:300001 of https://codereview.chromium.org/2536463002/ )" (Closed)
Patch Set: fix test 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 unified diff | Download patch
« no previous file with comments | « src/heap-symbols.h ('k') | src/js/async-await.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 4
5 #include "src/isolate.h" 5 #include "src/isolate.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <fstream> // NOLINT(readability/streams) 9 #include <fstream> // NOLINT(readability/streams)
10 #include <sstream> 10 #include <sstream>
(...skipping 3164 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 3175
3176 void Isolate::PromiseReactionJob(Handle<PromiseReactionJobInfo> info, 3176 void Isolate::PromiseReactionJob(Handle<PromiseReactionJobInfo> info,
3177 MaybeHandle<Object>* result, 3177 MaybeHandle<Object>* result,
3178 MaybeHandle<Object>* maybe_exception) { 3178 MaybeHandle<Object>* maybe_exception) {
3179 PromiseDebugEventScope helper(this, info->debug_id(), info->debug_name()); 3179 PromiseDebugEventScope helper(this, info->debug_id(), info->debug_name());
3180 3180
3181 Handle<Object> value(info->value(), this); 3181 Handle<Object> value(info->value(), this);
3182 Handle<Object> tasks(info->tasks(), this); 3182 Handle<Object> tasks(info->tasks(), this);
3183 Handle<JSFunction> promise_handle_fn = promise_handle(); 3183 Handle<JSFunction> promise_handle_fn = promise_handle();
3184 Handle<Object> undefined = factory()->undefined_value(); 3184 Handle<Object> undefined = factory()->undefined_value();
3185 Handle<Object> deferred(info->deferred(), this);
3185 3186
3186 // If tasks is an array we have multiple onFulfilled/onRejected callbacks 3187 if (deferred->IsFixedArray()) {
3187 // associated with the promise. The deferred object for each callback 3188 DCHECK(tasks->IsFixedArray());
3188 // is attached to this array as well. 3189 Handle<FixedArray> deferred_arr = Handle<FixedArray>::cast(deferred);
3189 // Otherwise, there is a single callback and the deferred object is attached 3190 Handle<FixedArray> tasks_arr = Handle<FixedArray>::cast(tasks);
3190 // directly to PromiseReactionJobInfo. 3191 for (int i = 0; i < deferred_arr->length(); i++) {
3191 if (tasks->IsJSArray()) { 3192 Handle<Object> argv[] = {value, handle(tasks_arr->get(i), this),
3192 Handle<JSArray> array = Handle<JSArray>::cast(tasks); 3193 handle(deferred_arr->get(i), this)};
3193 DCHECK(array->length()->IsSmi());
3194 int length = Smi::cast(array->length())->value();
3195 ElementsAccessor* accessor = array->GetElementsAccessor();
3196 DCHECK(length % 2 == 0);
3197 for (int i = 0; i < length; i += 2) {
3198 DCHECK(accessor->HasElement(array, i));
3199 DCHECK(accessor->HasElement(array, i + 1));
3200 Handle<Object> argv[] = {value, accessor->Get(array, i),
3201 accessor->Get(array, i + 1)};
3202 *result = Execution::TryCall(this, promise_handle_fn, undefined, 3194 *result = Execution::TryCall(this, promise_handle_fn, undefined,
3203 arraysize(argv), argv, maybe_exception); 3195 arraysize(argv), argv, maybe_exception);
3204 // If execution is terminating, just bail out. 3196 // If execution is terminating, just bail out.
3205 if (result->is_null() && maybe_exception->is_null()) { 3197 if (result->is_null() && maybe_exception->is_null()) {
3206 return; 3198 return;
3207 } 3199 }
3208 } 3200 }
3209 } else { 3201 } else {
3210 Handle<Object> deferred(info->deferred(), this);
3211 Handle<Object> argv[] = {value, tasks, deferred}; 3202 Handle<Object> argv[] = {value, tasks, deferred};
3212 *result = Execution::TryCall(this, promise_handle_fn, undefined, 3203 *result = Execution::TryCall(this, promise_handle_fn, undefined,
3213 arraysize(argv), argv, maybe_exception); 3204 arraysize(argv), argv, maybe_exception);
3214 } 3205 }
3215 } 3206 }
3216 3207
3217 void Isolate::PromiseResolveThenableJob( 3208 void Isolate::PromiseResolveThenableJob(
3218 Handle<PromiseResolveThenableJobInfo> info, MaybeHandle<Object>* result, 3209 Handle<PromiseResolveThenableJobInfo> info, MaybeHandle<Object>* result,
3219 MaybeHandle<Object>* maybe_exception) { 3210 MaybeHandle<Object>* maybe_exception) {
3220 PromiseDebugEventScope helper(this, info->debug_id(), info->debug_name()); 3211 PromiseDebugEventScope helper(this, info->debug_id(), info->debug_name());
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
3526 // Then check whether this scope intercepts. 3517 // Then check whether this scope intercepts.
3527 if ((flag & intercept_mask_)) { 3518 if ((flag & intercept_mask_)) {
3528 intercepted_flags_ |= flag; 3519 intercepted_flags_ |= flag;
3529 return true; 3520 return true;
3530 } 3521 }
3531 return false; 3522 return false;
3532 } 3523 }
3533 3524
3534 } // namespace internal 3525 } // namespace internal
3535 } // namespace v8 3526 } // namespace v8
OLDNEW
« no previous file with comments | « src/heap-symbols.h ('k') | src/js/async-await.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698