Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 #include "src/code-stub-assembler.h" | 4 #include "src/code-stub-assembler.h" |
| 5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/frames-inl.h" | 6 #include "src/frames-inl.h" |
| 7 #include "src/frames.h" | 7 #include "src/frames.h" |
| 8 #include "src/promise-utils.h" | |
| 8 | 9 |
| 9 namespace v8 { | 10 namespace v8 { |
| 10 namespace internal { | 11 namespace internal { |
| 11 | 12 |
| 12 using compiler::Node; | 13 using compiler::Node; |
| 13 | 14 |
| 14 void CodeStubAssembler::Assert(const NodeGenerator& codition_body, | 15 void CodeStubAssembler::Assert(const NodeGenerator& codition_body, |
| 15 const char* message, const char* file, | 16 const char* message, const char* file, |
| 16 int line) { | 17 int line) { |
| 17 #if defined(DEBUG) | 18 #if defined(DEBUG) |
| (...skipping 8197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8215 } | 8216 } |
| 8216 | 8217 |
| 8217 Node* CodeStubAssembler::IsPromiseHookEnabled() { | 8218 Node* CodeStubAssembler::IsPromiseHookEnabled() { |
| 8218 Node* const is_promisehook_enabled = | 8219 Node* const is_promisehook_enabled = |
| 8219 Load(MachineType::Uint8(), | 8220 Load(MachineType::Uint8(), |
| 8220 ExternalConstant( | 8221 ExternalConstant( |
| 8221 ExternalReference::is_promisehook_enabled_address(isolate()))); | 8222 ExternalReference::is_promisehook_enabled_address(isolate()))); |
| 8222 return WordNotEqual(is_promisehook_enabled, Int32Constant(0)); | 8223 return WordNotEqual(is_promisehook_enabled, Int32Constant(0)); |
| 8223 } | 8224 } |
| 8224 | 8225 |
| 8226 Node* CodeStubAssembler::AllocateFunctionWithMapAndContext(Node* map, | |
| 8227 Node* shared_info, | |
| 8228 Node* context) { | |
| 8229 Node* const code = | |
| 8230 LoadObjectField(shared_info, SharedFunctionInfo::kCodeOffset); | |
| 8231 Node* const code_entry = | |
| 8232 IntPtrAdd(code, IntPtrConstant(Code::kHeaderSize - kHeapObjectTag)); | |
| 8233 | |
| 8234 Node* const fun = Allocate(JSFunction::kSize); | |
| 8235 StoreMapNoWriteBarrier(fun, map); | |
| 8236 StoreObjectFieldRoot(fun, JSObject::kPropertiesOffset, | |
| 8237 Heap::kEmptyFixedArrayRootIndex); | |
| 8238 StoreObjectFieldRoot(fun, JSObject::kElementsOffset, | |
| 8239 Heap::kEmptyFixedArrayRootIndex); | |
| 8240 StoreObjectFieldRoot(fun, JSFunction::kLiteralsOffset, | |
| 8241 Heap::kEmptyLiteralsArrayRootIndex); | |
| 8242 StoreObjectFieldRoot(fun, JSFunction::kPrototypeOrInitialMapOffset, | |
| 8243 Heap::kTheHoleValueRootIndex); | |
| 8244 StoreObjectFieldNoWriteBarrier(fun, JSFunction::kSharedFunctionInfoOffset, | |
| 8245 shared_info); | |
| 8246 StoreObjectFieldNoWriteBarrier(fun, JSFunction::kContextOffset, context); | |
| 8247 StoreObjectFieldNoWriteBarrier(fun, JSFunction::kCodeEntryOffset, code_entry); | |
| 8248 StoreObjectFieldRoot(fun, JSFunction::kNextFunctionLinkOffset, | |
| 8249 Heap::kUndefinedValueRootIndex); | |
| 8250 | |
| 8251 return fun; | |
| 8252 } | |
| 8253 | |
| 8254 Node* CodeStubAssembler::CreatePromiseResolvingFunctionsContext( | |
| 8255 Node* promise, Node* debug_event, Node* native_context) { | |
| 8256 Node* const context = | |
| 8257 Allocate(FixedArray::SizeFor(PromiseUtils::kPromiseContextLength)); | |
| 8258 Node* const map = HeapConstant(isolate()->factory()->function_context_map()); | |
| 8259 StoreMapNoWriteBarrier(context, map); | |
|
Igor Sheludko
2016/12/13 23:42:34
StoreMapNoWriteBarrier(context, Heap::kFunctionCon
gsathya
2016/12/19 20:12:43
Done.
| |
| 8260 StoreObjectFieldNoWriteBarrier( | |
| 8261 context, FixedArray::kLengthOffset, | |
| 8262 SmiConstant(PromiseUtils::kPromiseContextLength)); | |
| 8263 | |
| 8264 Node* const empty_fn = | |
| 8265 LoadContextElement(native_context, Context::CLOSURE_INDEX); | |
| 8266 StoreContextElement(context, Context::CLOSURE_INDEX, empty_fn); | |
|
Igor Sheludko
2016/12/13 23:42:34
We can skip write barriers here and below since th
gsathya
2016/12/19 20:12:43
Done.
| |
| 8267 StoreContextElement(context, Context::PREVIOUS_INDEX, UndefinedConstant()); | |
| 8268 StoreContextElement(context, Context::EXTENSION_INDEX, TheHoleConstant()); | |
| 8269 StoreContextElement(context, Context::NATIVE_CONTEXT_INDEX, native_context); | |
| 8270 StoreContextElement(context, PromiseUtils::kAlreadyVisitedSlot, | |
| 8271 SmiConstant(0)); | |
| 8272 StoreContextElement(context, PromiseUtils::kPromiseSlot, promise); | |
| 8273 StoreContextElement(context, PromiseUtils::kDebugEventSlot, debug_event); | |
| 8274 return context; | |
| 8275 } | |
| 8276 | |
| 8277 std::pair<Node*, Node*> CodeStubAssembler::CreatePromiseResolvingFunctions( | |
| 8278 Node* promise, Node* debug_event, Node* native_context) { | |
| 8279 Node* const promise_context = CreatePromiseResolvingFunctionsContext( | |
| 8280 promise, debug_event, native_context); | |
| 8281 Node* const resolve_info = | |
| 8282 LoadContextElement(native_context, Context::PROMISE_RESOLVE_SHARED_FUN); | |
|
Igor Sheludko
2016/12/13 23:42:34
Please move the load before the call to respective
gsathya
2016/12/19 20:12:43
Done.
| |
| 8283 Node* const reject_info = | |
| 8284 LoadContextElement(native_context, Context::PROMISE_REJECT_SHARED_FUN); | |
|
Igor Sheludko
2016/12/13 23:42:35
Same here.
gsathya
2016/12/19 20:12:43
Done.
| |
| 8285 | |
| 8286 Node* const map = LoadContextElement( | |
| 8287 native_context, Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX); | |
| 8288 Node* const resolve = | |
| 8289 AllocateFunctionWithMapAndContext(map, resolve_info, promise_context); | |
| 8290 Node* const reject = | |
| 8291 AllocateFunctionWithMapAndContext(map, reject_info, promise_context); | |
| 8292 | |
| 8293 return std::make_pair(resolve, reject); | |
| 8294 } | |
| 8295 | |
| 8225 Node* CodeStubAssembler::AllocateJSPromise(Node* context) { | 8296 Node* CodeStubAssembler::AllocateJSPromise(Node* context) { |
| 8226 Node* const native_context = LoadNativeContext(context); | 8297 Node* const native_context = LoadNativeContext(context); |
| 8227 Node* const promise_fun = | 8298 Node* const promise_fun = |
| 8228 LoadContextElement(native_context, Context::PROMISE_FUNCTION_INDEX); | 8299 LoadContextElement(native_context, Context::PROMISE_FUNCTION_INDEX); |
| 8229 Node* const initial_map = | 8300 Node* const initial_map = |
| 8230 LoadObjectField(promise_fun, JSFunction::kPrototypeOrInitialMapOffset); | 8301 LoadObjectField(promise_fun, JSFunction::kPrototypeOrInitialMapOffset); |
| 8231 Node* const instance = AllocateJSObjectFromMap(initial_map); | 8302 Node* const instance = AllocateJSObjectFromMap(initial_map); |
| 8232 | 8303 |
| 8233 return instance; | 8304 return instance; |
| 8234 } | 8305 } |
| 8235 | 8306 |
| 8236 void CodeStubAssembler::PromiseInit(Node* promise) { | 8307 void CodeStubAssembler::PromiseInit(Node* promise) { |
| 8237 StoreObjectField(promise, JSPromise::kStatusOffset, | 8308 StoreObjectField(promise, JSPromise::kStatusOffset, |
| 8238 SmiConstant(kPromisePending)); | 8309 SmiConstant(kPromisePending)); |
| 8239 StoreObjectField(promise, JSPromise::kFlagsOffset, SmiConstant(0)); | 8310 StoreObjectField(promise, JSPromise::kFlagsOffset, SmiConstant(0)); |
| 8240 } | 8311 } |
| 8241 | 8312 |
| 8242 void CodeStubAssembler::PromiseSet(Node* promise, Node* status, Node* result) { | 8313 void CodeStubAssembler::PromiseSet(Node* promise, Node* status, Node* result) { |
| 8243 CSA_ASSERT(this, TaggedIsSmi(status)); | 8314 CSA_ASSERT(this, TaggedIsSmi(status)); |
| 8244 StoreObjectField(promise, JSPromise::kStatusOffset, status); | 8315 StoreObjectField(promise, JSPromise::kStatusOffset, status); |
| 8245 StoreObjectField(promise, JSPromise::kResultOffset, result); | 8316 StoreObjectField(promise, JSPromise::kResultOffset, result); |
| 8246 StoreObjectField(promise, JSPromise::kFlagsOffset, SmiConstant(0)); | 8317 StoreObjectField(promise, JSPromise::kFlagsOffset, SmiConstant(0)); |
| 8247 } | 8318 } |
| 8248 | 8319 |
| 8249 } // namespace internal | 8320 } // namespace internal |
| 8250 } // namespace v8 | 8321 } // namespace v8 |
| OLD | NEW |