| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/execution/thread-local-top.h" |
| #include "src/execution/isolate.h" |
| #include "src/execution/simulator.h" |
| #include "src/trap-handler/trap-handler.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| void ThreadLocalTop::Initialize(Isolate* isolate) { |
| *this = ThreadLocalTop(); |
| isolate_ = isolate; |
| #ifdef USE_SIMULATOR |
| simulator_ = Simulator::current(isolate); |
| #endif |
| thread_id_ = ThreadId::Current(); |
| thread_in_wasm_flag_address_ = reinterpret_cast<Address>( |
| trap_handler::GetThreadInWasmThreadLocalAddress()); |
| |
| #ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING |
| stack_ = ::heap::base::Stack(base::Stack::GetStackStart()); |
| #endif |
| } |
| |
| void ThreadLocalTop::Free() { |
| // Match unmatched PopPromise calls. |
| while (promise_on_stack_) isolate_->PopPromise(); |
| } |
| |
| #if defined(USE_SIMULATOR) |
| void ThreadLocalTop::StoreCurrentStackPosition() { |
| last_api_entry_ = simulator_->get_sp(); |
| } |
| #elif defined(V8_USE_ADDRESS_SANITIZER) |
| void ThreadLocalTop::StoreCurrentStackPosition() { |
| last_api_entry_ = reinterpret_cast<Address>(GetCurrentStackPosition()); |
| } |
| #endif |
| |
| } // namespace internal |
| } // namespace v8 |