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#include "src/tracing/trace-event.h" 12 13namespace v8 { 14namespace internal { 15 16// 17// VMState class implementation. A simple stack of VM states held by the 18// logger and partially threaded through the call stack. States are pushed by 19// VMState construction and popped by destruction. 20// 21inline const char* StateToString(StateTag state) { 22 switch (state) { 23 case JS: 24 return "JS"; 25 case GC: 26 return "GC"; 27 case COMPILER: 28 return "COMPILER"; 29 case OTHER: 30 return "OTHER"; 31 case EXTERNAL: 32 return "EXTERNAL"; 33 default: 34 UNREACHABLE(); 35 return NULL; 36 } 37} 38 39 40template <StateTag Tag> 41VMState<Tag>::VMState(Isolate* isolate) 42 : isolate_(isolate), previous_tag_(isolate->current_vm_state()) { 43 if (FLAG_log_timer_events && previous_tag_ != EXTERNAL && Tag == EXTERNAL) { 44 LOG(isolate_, TimerEvent(Logger::START, TimerEventExternal::name())); 45 } 46 isolate_->set_current_vm_state(Tag); 47} 48 49 50template <StateTag Tag> 51VMState<Tag>::~VMState() { 52 if (FLAG_log_timer_events && previous_tag_ != EXTERNAL && Tag == EXTERNAL) { 53 LOG(isolate_, TimerEvent(Logger::END, TimerEventExternal::name())); 54 } 55 isolate_->set_current_vm_state(previous_tag_); 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 TRACE_EVENT_BEGIN0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), 67 "V8.ExternalCallback"); 68} 69 70ExternalCallbackScope::~ExternalCallbackScope() { 71 isolate_->set_external_callback_scope(previous_scope_); 72 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), 73 "V8.ExternalCallback"); 74} 75 76Address ExternalCallbackScope::scope_address() { 77#ifdef USE_SIMULATOR 78 return scope_address_; 79#else 80 return reinterpret_cast<Address>(this); 81#endif 82} 83 84 85} // namespace internal 86} // namespace v8 87 88#endif // V8_VM_STATE_INL_H_ 89