Chromium Code Reviews| Index: src/builtins/builtins-promise.cc |
| diff --git a/src/builtins/builtins-promise.cc b/src/builtins/builtins-promise.cc |
| index 323bfea5b5a74268d4b4665b8de7b46a0516cbcf..2039e203dba05efc27970d4285e79d43ffddaa21 100644 |
| --- a/src/builtins/builtins-promise.cc |
| +++ b/src/builtins/builtins-promise.cc |
| @@ -643,8 +643,8 @@ void PromiseBuiltinsAssembler::InternalResolvePromise(Node* context, |
| Bind(&if_fulfilled); |
| { |
| - CallRuntime(Runtime::kPromiseFulfill, context, promise, |
| - SmiConstant(v8::Promise::kFulfilled), thenable_value); |
| + PromiseFulfill(context, promise, thenable_value, |
| + v8::Promise::kFulfilled); |
| PromiseSetHasHandler(promise); |
| Goto(&out); |
| } |
| @@ -715,8 +715,7 @@ void PromiseBuiltinsAssembler::InternalResolvePromise(Node* context, |
| // 7.b Return FulfillPromise(promise, resolution). |
| Bind(&fulfill); |
| { |
| - CallRuntime(Runtime::kPromiseFulfill, context, promise, |
| - SmiConstant(v8::Promise::kFulfilled), result); |
| + PromiseFulfill(context, promise, result, v8::Promise::kFulfilled); |
| Goto(&out); |
| } |
| @@ -743,6 +742,50 @@ void PromiseBuiltinsAssembler::InternalResolvePromise(Node* context, |
| Bind(&out); |
| } |
| +void PromiseBuiltinsAssembler::PromiseFulfill( |
| + Node* context, Node* promise, Node* result, |
| + v8::Promise::PromiseState status) { |
| + Label do_promisereset(this); |
| + |
| + Node* const status_smi = SmiConstant(static_cast<int>(status)); |
| + Node* const deferred_promise = |
| + LoadObjectField(promise, JSPromise::kDeferredPromiseOffset); |
| + |
| + GotoIf(IsUndefined(deferred_promise), &do_promisereset); |
| + |
| + Node* const tasks = SelectConstant( |
|
Igor Sheludko
2017/01/04 08:39:32
Please use Select() here otherwise both Fulfill an
gsathya
2017/01/04 19:51:01
Done.
|
| + SmiEqual(status_smi, SmiConstant(v8::Promise::kFulfilled)), |
|
Igor Sheludko
2017/01/04 08:39:32
BTW, this check looks like a compile-time one.
gsathya
2017/01/04 19:51:01
Done.
|
| + LoadObjectField(promise, JSPromise::kFulfillReactionsOffset), |
| + LoadObjectField(promise, JSPromise::kRejectReactionsOffset), |
| + MachineRepresentation::kTaggedPointer); |
| + Node* const deferred_on_resolve = |
| + LoadObjectField(promise, JSPromise::kDeferredOnResolveOffset); |
| + Node* const deferred_on_reject = |
| + LoadObjectField(promise, JSPromise::kDeferredOnRejectOffset); |
| + |
| + Node* const info = AllocatePromiseReactionJobInfo( |
| + promise, result, tasks, deferred_promise, deferred_on_resolve, |
| + deferred_on_reject, context); |
| + CallRuntime(Runtime::kEnqueuePromiseReactionJob, context, info, status_smi); |
| + Goto(&do_promisereset); |
| + |
| + Bind(&do_promisereset); |
| + { |
| + StoreObjectField(promise, JSPromise::kStatusOffset, status_smi); |
| + StoreObjectField(promise, JSPromise::kResultOffset, result); |
| + StoreObjectFieldRoot(promise, JSPromise::kDeferredPromiseOffset, |
| + Heap::kUndefinedValueRootIndex); |
| + StoreObjectFieldRoot(promise, JSPromise::kDeferredOnResolveOffset, |
| + Heap::kUndefinedValueRootIndex); |
| + StoreObjectFieldRoot(promise, JSPromise::kDeferredOnRejectOffset, |
| + Heap::kUndefinedValueRootIndex); |
| + StoreObjectFieldRoot(promise, JSPromise::kFulfillReactionsOffset, |
| + Heap::kUndefinedValueRootIndex); |
| + StoreObjectFieldRoot(promise, JSPromise::kRejectReactionsOffset, |
| + Heap::kUndefinedValueRootIndex); |
| + } |
| +} |
| + |
| // ES#sec-promise-reject-functions |
| // Promise Reject Functions |
| BUILTIN(PromiseRejectClosure) { |