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

Unified Diff: src/builtins/builtins-promise.cc

Issue 2611083002: [promises] Add AllocatePromiseResolveThenableJobInfo to TF (Closed)
Patch Set: rebase 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/builtins/builtins-promise.h ('k') | src/factory.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/builtins/builtins-promise.cc
diff --git a/src/builtins/builtins-promise.cc b/src/builtins/builtins-promise.cc
index 06809d6ae7629a83d9e3e0c67b5942b87490603a..c273a7e8606d387030dd0c696542c86983a5b7e9 100644
--- a/src/builtins/builtins-promise.cc
+++ b/src/builtins/builtins-promise.cc
@@ -647,6 +647,30 @@ void PromiseBuiltinsAssembler::BranchIfFastPath(Node* native_context,
Branch(proto_has_initialmap, if_isunmodified, if_ismodified);
}
+Node* PromiseBuiltinsAssembler::AllocatePromiseResolveThenableJobInfo(
+ Node* thenable, Node* then, Node* resolve, Node* reject, Node* context) {
+ Node* const info = Allocate(PromiseResolveThenableJobInfo::kSize);
+ StoreMapNoWriteBarrier(info,
+ Heap::kPromiseResolveThenableJobInfoMapRootIndex);
+ StoreObjectFieldNoWriteBarrier(
+ info, PromiseResolveThenableJobInfo::kThenableOffset, thenable);
+ StoreObjectFieldNoWriteBarrier(
+ info, PromiseResolveThenableJobInfo::kThenOffset, then);
+ StoreObjectFieldNoWriteBarrier(
+ info, PromiseResolveThenableJobInfo::kResolveOffset, resolve);
+ StoreObjectFieldNoWriteBarrier(
+ info, PromiseResolveThenableJobInfo::kRejectOffset, reject);
+ StoreObjectFieldNoWriteBarrier(info,
+ PromiseResolveThenableJobInfo::kDebugIdOffset,
+ SmiConstant(kDebugPromiseNoID));
+ StoreObjectFieldNoWriteBarrier(
+ info, PromiseResolveThenableJobInfo::kDebugNameOffset,
+ SmiConstant(kDebugNotActive));
+ StoreObjectFieldNoWriteBarrier(
+ info, PromiseResolveThenableJobInfo::kContextOffset, context);
+ return info;
+}
+
void PromiseBuiltinsAssembler::InternalResolvePromise(Node* context,
Node* promise,
Node* result) {
@@ -756,10 +780,33 @@ void PromiseBuiltinsAssembler::InternalResolvePromise(Node* context,
Bind(&do_enqueue);
{
+ // TODO(gsathya): Add fast path for native promises with unmodified
+ // PromiseThen (which don't need these resolving functions, but
+ // instead can just call resolve/reject directly).
+ Node* resolve = nullptr;
+ Node* reject = nullptr;
+ std::tie(resolve, reject) = CreatePromiseResolvingFunctions(
+ promise, FalseConstant(), native_context);
+
+ Node* const info = AllocatePromiseResolveThenableJobInfo(
+ result, var_then.value(), resolve, reject, context);
+
Label enqueue(this);
GotoUnless(IsDebugActive(), &enqueue);
+
+ Node* const debug_id = CallRuntime(Runtime::kDebugNextMicrotaskId, context);
+ Node* const debug_name = SmiConstant(kDebugPromiseResolveThenableJob);
+ CallRuntime(Runtime::kDebugAsyncTaskEvent, context,
+ SmiConstant(kDebugEnqueue), debug_id, debug_name);
+
+ StoreObjectField(info, PromiseResolveThenableJobInfo::kDebugIdOffset,
+ debug_id);
+ StoreObjectField(info, PromiseResolveThenableJobInfo::kDebugNameOffset,
+ debug_name);
+
GotoIf(TaggedIsSmi(result), &enqueue);
GotoUnless(HasInstanceType(result, JS_PROMISE_TYPE), &enqueue);
+
// Mark the dependency of the new promise on the resolution
Node* const key =
HeapConstant(isolate->factory()->promise_handled_by_symbol());
@@ -768,12 +815,10 @@ void PromiseBuiltinsAssembler::InternalResolvePromise(Node* context,
Goto(&enqueue);
// 12. Perform EnqueueJob("PromiseJobs",
- // PromiseResolveThenableJob, « promise, resolution, thenAction
- // »).
+ // PromiseResolveThenableJob, « promise, resolution, thenAction»).
Bind(&enqueue);
// TODO(gsathya): Move this to TF
- CallRuntime(Runtime::kEnqueuePromiseResolveThenableJob, context, promise,
- result, var_then.value());
+ CallRuntime(Runtime::kEnqueuePromiseResolveThenableJob, context, info);
Goto(&out);
}
« no previous file with comments | « src/builtins/builtins-promise.h ('k') | src/factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698