Chromium Code Reviews| 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 = |