1// Copyright 2010 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_VM_STATE_INL_H_ 6#define V8_VM_STATE_INL_H_ 7 8#include "src/vm-state.h" 9#include "src/log.h" 10#include "src/simulator.h" 11 12namespace v8 { 13namespace internal { 14 15// 16// VMState class implementation. A simple stack of VM states held by the 17// logger and partially threaded through the call stack. States are pushed by 18// VMState construction and popped by destruction. 19// 20inline const char* StateToString(StateTag state) { 21 switch (state) { 22 case JS: 23 return "JS"; 24 case GC: 25 return "GC"; 26 case COMPILER: 27 return "COMPILER"; 28 case OTHER: 29 return "OTHER"; 30 case EXTERNAL: 31 return "EXTERNAL"; 32 default: 33 UNREACHABLE(); 34 return NULL; 35 } 36} 37 38 39template <StateTag Tag> 40VMState<Tag>::VMState(Isolate* isolate) 41 : isolate_(isolate), previous_tag_(isolate->current_vm_state()) { 42 if (FLAG_log_timer_events && previous_tag_ != EXTERNAL && Tag == EXTERNAL) { 43 LOG(isolate_, TimerEvent(Logger::START, TimerEventExternal::name())); 44 } 45 isolate_->set_current_vm_state(Tag); 46} 47 48 49template <StateTag Tag> 50VMState<Tag>::~VMState() { 51 if (FLAG_log_timer_events && previous_tag_ != EXTERNAL && Tag == EXTERNAL) { 52 LOG(isolate_, TimerEvent(Logger::END, TimerEventExternal::name())); 53 } 54 isolate_->set_current_vm_state(previous_tag_); 55} 56 57 58ExternalCallbackScope::ExternalCallbackScope(Isolate* isolate, Address callback) 59 : isolate_(isolate), 60 callback_(callback), 61 previous_scope_(isolate->external_callback_scope()) { 62#ifdef USE_SIMULATOR 63 scope_address_ = Simulator::current(isolate)->get_sp(); 64#endif 65 isolate_->set_external_callback_scope(this); 66} 67 68ExternalCallbackScope::~ExternalCallbackScope() { 69 isolate_->set_external_callback_scope(previous_scope_); 70} 71 72Address ExternalCallbackScope::scope_address() { 73#ifdef USE_SIMULATOR 74 return scope_address_; 75#else 76 return reinterpret_cast<Address>(this); 77#endif 78} 79 80 81} } // namespace v8::internal 82 83#endif // V8_VM_STATE_INL_H_ 84