diff options
Diffstat (limited to 'deps/v8/src/vm-state-inl.h')
-rw-r--r-- | deps/v8/src/vm-state-inl.h | 81 |
1 files changed, 39 insertions, 42 deletions
diff --git a/deps/v8/src/vm-state-inl.h b/deps/v8/src/vm-state-inl.h index 74f4a6a7a..da912b746 100644 --- a/deps/v8/src/vm-state-inl.h +++ b/deps/v8/src/vm-state-inl.h @@ -29,6 +29,7 @@ #define V8_VM_STATE_INL_H_ #include "vm-state.h" +#include "runtime-profiler.h" namespace v8 { namespace internal { @@ -49,52 +50,31 @@ inline const char* StateToString(StateTag state) { return "COMPILER"; case OTHER: return "OTHER"; + case EXTERNAL: + return "EXTERNAL"; default: UNREACHABLE(); return NULL; } } -VMState::VMState(StateTag state) - : disabled_(true), - state_(OTHER), - external_callback_(NULL) { -#ifdef ENABLE_LOGGING_AND_PROFILING - if (!Logger::is_logging() && !CpuProfiler::is_profiling()) { - return; - } -#endif - - disabled_ = false; -#if !defined(ENABLE_HEAP_PROTECTION) - // When not protecting the heap, there is no difference between - // EXTERNAL and OTHER. As an optimization in that case, we will not - // perform EXTERNAL->OTHER transitions through the API. We thus - // compress the two states into one. - if (state == EXTERNAL) state = OTHER; -#endif - state_ = state; - // Save the previous state. - previous_ = Top::current_vm_state(); - // Install the new state. - Top::set_current_vm_state(this); - +VMState::VMState(StateTag tag) : previous_tag_(Top::current_vm_state()) { #ifdef ENABLE_LOGGING_AND_PROFILING if (FLAG_log_state_changes) { - LOG(UncheckedStringEvent("Entering", StateToString(state_))); - if (previous_ != NULL) { - LOG(UncheckedStringEvent("From", StateToString(previous_->state_))); - } + LOG(UncheckedStringEvent("Entering", StateToString(tag))); + LOG(UncheckedStringEvent("From", StateToString(previous_tag_))); } #endif + Top::SetCurrentVMState(tag); + #ifdef ENABLE_HEAP_PROTECTION if (FLAG_protect_heap) { - if (state_ == EXTERNAL) { + if (tag == EXTERNAL) { // We are leaving V8. - ASSERT((previous_ != NULL) && (previous_->state_ != EXTERNAL)); + ASSERT(previous_tag_ != EXTERNAL); Heap::Protect(); - } else if ((previous_ == NULL) || (previous_->state_ == EXTERNAL)) { + } else if (previous_tag_ = EXTERNAL) { // We are entering V8. Heap::Unprotect(); } @@ -104,34 +84,51 @@ VMState::VMState(StateTag state) VMState::~VMState() { - if (disabled_) return; - // Return to the previous state. - Top::set_current_vm_state(previous_); - #ifdef ENABLE_LOGGING_AND_PROFILING if (FLAG_log_state_changes) { - LOG(UncheckedStringEvent("Leaving", StateToString(state_))); - if (previous_ != NULL) { - LOG(UncheckedStringEvent("To", StateToString(previous_->state_))); - } + LOG(UncheckedStringEvent("Leaving", + StateToString(Top::current_vm_state()))); + LOG(UncheckedStringEvent("To", StateToString(previous_tag_))); } #endif // ENABLE_LOGGING_AND_PROFILING #ifdef ENABLE_HEAP_PROTECTION + StateTag tag = Top::current_vm_state(); +#endif + + Top::SetCurrentVMState(previous_tag_); + +#ifdef ENABLE_HEAP_PROTECTION if (FLAG_protect_heap) { - if (state_ == EXTERNAL) { + if (tag == EXTERNAL) { // We are reentering V8. - ASSERT((previous_ != NULL) && (previous_->state_ != EXTERNAL)); + ASSERT(previous_tag_ != EXTERNAL); Heap::Unprotect(); - } else if ((previous_ == NULL) || (previous_->state_ == EXTERNAL)) { + } else if (previous_tag_ == EXTERNAL) { // We are leaving V8. Heap::Protect(); } } #endif // ENABLE_HEAP_PROTECTION } + #endif // ENABLE_VMSTATE_TRACKING + +#ifdef ENABLE_LOGGING_AND_PROFILING + +ExternalCallbackScope::ExternalCallbackScope(Address callback) + : previous_callback_(Top::external_callback()) { + Top::set_external_callback(callback); +} + +ExternalCallbackScope::~ExternalCallbackScope() { + Top::set_external_callback(previous_callback_); +} + +#endif // ENABLE_LOGGING_AND_PROFILING + + } } // namespace v8::internal #endif // V8_VM_STATE_INL_H_ |