OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |