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

Unified Diff: src/code-stub-assembler.cc

Issue 2567033003: [promises] Port CreateResolvingFunctions to TF (Closed)
Patch Set: add tests 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 side-by-side diff with in-line comments
Download patch
Index: src/code-stub-assembler.cc
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
index e67f81f8e1ad28afb5ac25e2ac682167e964a484..b5b2935dc4bb1c547ae42dfdf2ede673975ccd2f 100644
--- a/src/code-stub-assembler.cc
+++ b/src/code-stub-assembler.cc
@@ -5,6 +5,7 @@
#include "src/code-factory.h"
#include "src/frames-inl.h"
#include "src/frames.h"
+#include "src/promise-utils.h"
namespace v8 {
namespace internal {
@@ -8222,6 +8223,75 @@ Node* CodeStubAssembler::IsPromiseHookEnabled() {
return WordNotEqual(is_promisehook_enabled, Int32Constant(0));
}
+Node* CodeStubAssembler::AllocateFunctionWithMapAndContext(Node* map,
jgruber 2016/12/13 10:44:04 Wouldn't 'AllocateFunction' be simpler (since this
gsathya 2016/12/13 13:01:46 Seemed like there's precedent with AllocateHeapNum
jgruber 2016/12/13 13:20:52 Ok, let's wait and see what Igor says, CSA is his
gsathya 2016/12/13 13:29:33 Acknowledged.
Igor Sheludko 2016/12/13 23:42:34 Let this function be :)
+ Node* shared_info,
+ Node* context) {
+ Node* const code =
+ LoadObjectField(shared_info, SharedFunctionInfo::kCodeOffset);
+ Node* code_entry =
jgruber 2016/12/13 10:44:04 Why is this one not const? Same below - if you're
gsathya 2016/12/13 13:01:46 I guess. Changed
+ IntPtrAdd(code, IntPtrConstant(Code::kHeaderSize - kHeapObjectTag));
+
+ Node* fun = Allocate(JSFunction::kSize);
+ StoreMapNoWriteBarrier(fun, map);
+ StoreObjectFieldRoot(fun, JSObject::kPropertiesOffset,
+ Heap::kEmptyFixedArrayRootIndex);
+ StoreObjectFieldRoot(fun, JSObject::kElementsOffset,
+ Heap::kEmptyFixedArrayRootIndex);
+ StoreObjectFieldRoot(fun, JSFunction::kLiteralsOffset,
+ Heap::kEmptyLiteralsArrayRootIndex);
+ StoreObjectFieldRoot(fun, JSFunction::kPrototypeOrInitialMapOffset,
+ Heap::kTheHoleValueRootIndex);
+ StoreObjectFieldNoWriteBarrier(fun, JSFunction::kSharedFunctionInfoOffset,
+ shared_info);
+ StoreObjectFieldNoWriteBarrier(fun, JSFunction::kContextOffset, context);
+ StoreObjectFieldNoWriteBarrier(fun, JSFunction::kCodeEntryOffset, code_entry);
+ StoreObjectFieldRoot(fun, JSFunction::kNextFunctionLinkOffset,
+ Heap::kUndefinedValueRootIndex);
+
+ return fun;
+}
+
+Node* CodeStubAssembler::CreatePromiseResolvingFunctionsContext(
+ Node* promise, Node* debug_event, Node* native_context) {
+ Node* context =
+ Allocate(FixedArray::SizeFor(PromiseUtils::kPromiseContextLength));
+ Node* map = HeapConstant(isolate()->factory()->function_context_map());
+ StoreMapNoWriteBarrier(context, map);
+ StoreObjectFieldNoWriteBarrier(
+ context, FixedArray::kLengthOffset,
+ SmiConstant(PromiseUtils::kPromiseContextLength));
+
+ Node* empty_fn = LoadContextElement(native_context, Context::CLOSURE_INDEX);
+ StoreContextElement(context, Context::CLOSURE_INDEX, empty_fn);
jgruber 2016/12/13 10:44:04 Perhaps this could be refactored to a more generic
gsathya 2016/12/13 13:01:47 All of these are pretty specific to promise
jgruber 2016/12/13 13:20:52 Really? Isn't this almost identical to Factory::Ne
gsathya 2016/12/13 13:29:33 Can't have the FUNCTION_SCOPE check, can't set pre
+ StoreContextElement(context, Context::PREVIOUS_INDEX, UndefinedConstant());
+ StoreContextElement(context, Context::EXTENSION_INDEX, TheHoleConstant());
+ StoreContextElement(context, Context::NATIVE_CONTEXT_INDEX, native_context);
+ StoreContextElement(context, PromiseUtils::kAlreadyVisitedSlot,
+ SmiConstant(0));
+ StoreContextElement(context, PromiseUtils::kPromiseSlot, promise);
+ StoreContextElement(context, PromiseUtils::kDebugEventSlot, debug_event);
+ return context;
+}
+
+std::pair<Node*, Node*> CodeStubAssembler::CreatePromiseResolvingFunctions(
jgruber 2016/12/13 10:44:05 This would probably be better as a member of the P
gsathya 2016/12/13 13:01:46 These will be used in other builtins I think. cait
Igor Sheludko 2016/12/13 23:42:34 +1. Maybe there should be an assembler class with
+ Node* promise, Node* debug_event, Node* native_context) {
+ Node* promise_context = CreatePromiseResolvingFunctionsContext(
+ promise, debug_event, native_context);
+ Node* resolve_info =
+ LoadContextElement(native_context, Context::PROMISE_RESOLVE_SHARED_FUN);
+ Node* reject_info =
+ LoadContextElement(native_context, Context::PROMISE_REJECT_SHARED_FUN);
+
+ Node* const map = LoadContextElement(
+ native_context, Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX);
+ Node* const resolve =
+ AllocateFunctionWithMapAndContext(map, resolve_info, promise_context);
+ Node* const reject =
+ AllocateFunctionWithMapAndContext(map, reject_info, promise_context);
+
+ return std::make_pair(resolve, reject);
+}
+
Node* CodeStubAssembler::AllocateJSPromise(Node* context) {
Node* const native_context = LoadNativeContext(context);
Node* const promise_fun =

Powered by Google App Engine
This is Rietveld 408576698