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 13 namespace v8 { 14 namespace 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 // StateToString(StateTag state)21 inline 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 40 template <StateTag Tag> VMState(Isolate * isolate)41 VMState<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 50 template <StateTag Tag> ~VMState()51 VMState<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 ExternalCallbackScope(Isolate * isolate,Address callback)58 ExternalCallbackScope::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 ~ExternalCallbackScope()70 ExternalCallbackScope::~ExternalCallbackScope() { 71 isolate_->set_external_callback_scope(previous_scope_); 72 TRACE_EVENT_END0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), 73 "V8.ExternalCallback"); 74 } 75 scope_address()76 Address 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