| Index: src/log.cc
|
| diff --git a/src/log.cc b/src/log.cc
|
| index 5de7429e5d244cfc69cc128add4fa1d3901d83b3..8622646c7cc4ad27dd607949c041b667f8108a9f 100644
|
| --- a/src/log.cc
|
| +++ b/src/log.cc
|
| @@ -39,8 +39,93 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +//
|
| +// VMState class implementation. A simple stack of VM states held by the
|
| +// logger and partially threaded through the call stack. States are pushed by
|
| +// VMState construction and popped by destruction.
|
| +//
|
| +
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
|
|
| +static const char* StateToString(StateTag state) {
|
| + switch (state) {
|
| + case JS:
|
| + return "JS";
|
| + case GC:
|
| + return "GC";
|
| + case COMPILER:
|
| + return "COMPILER";
|
| + case OTHER:
|
| + return "OTHER";
|
| + default:
|
| + UNREACHABLE();
|
| + return NULL;
|
| + }
|
| +}
|
| +
|
| +
|
| +void VMState::Initialize(StateTag state) {
|
| + ASSERT(Logger::is_logging());
|
| +
|
| + 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;
|
| + previous_ = Logger::current_state_;
|
| + Logger::current_state_ = this;
|
| +
|
| + if (FLAG_log_state_changes) {
|
| + LOG(UncheckedStringEvent("Entering", StateToString(state_)));
|
| + if (previous_ != NULL) {
|
| + LOG(UncheckedStringEvent("From", StateToString(previous_->state_)));
|
| + }
|
| + }
|
| +
|
| +#ifdef ENABLE_HEAP_PROTECTION
|
| + if (FLAG_protect_heap && previous_ != NULL) {
|
| + if (state_ == EXTERNAL) {
|
| + // We are leaving V8.
|
| + ASSERT(previous_->state_ != EXTERNAL);
|
| + Heap::Protect();
|
| + } else if (previous_->state_ == EXTERNAL) {
|
| + // We are entering V8.
|
| + Heap::Unprotect();
|
| + }
|
| + }
|
| +#endif
|
| +}
|
| +
|
| +
|
| +void VMState::Destroy() {
|
| + ASSERT(!disabled_);
|
| + Logger::current_state_ = previous_;
|
| +
|
| + if (FLAG_log_state_changes) {
|
| + LOG(UncheckedStringEvent("Leaving", StateToString(state_)));
|
| + if (previous_ != NULL) {
|
| + LOG(UncheckedStringEvent("To", StateToString(previous_->state_)));
|
| + }
|
| + }
|
| +
|
| +#ifdef ENABLE_HEAP_PROTECTION
|
| + if (FLAG_protect_heap && previous_ != NULL) {
|
| + if (state_ == EXTERNAL) {
|
| + // We are reentering V8.
|
| + ASSERT(previous_->state_ != EXTERNAL);
|
| + Heap::Unprotect();
|
| + } else if (previous_->state_ == EXTERNAL) {
|
| + // We are leaving V8.
|
| + Heap::Protect();
|
| + }
|
| + }
|
| +#endif
|
| +}
|
| +
|
| //
|
| // Sliding state window. Updates counters to keep track of the last
|
| // window of kBufferSize states. This is useful to track where we
|
|
|