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 12 namespace v8 { 13 namespace 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 // StateToString(StateTag state)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 39 template <StateTag Tag> VMState(Isolate * isolate)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 49 template <StateTag Tag> ~VMState()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 ExternalCallbackScope(Isolate * isolate,Address callback)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 ~ExternalCallbackScope()68ExternalCallbackScope::~ExternalCallbackScope() { 69 isolate_->set_external_callback_scope(previous_scope_); 70 } 71 scope_address()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