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) { |