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_H_ 6 #define V8_VM_STATE_H_ 7 8 #include "src/allocation.h" 9 #include "src/counters.h" 10 #include "src/isolate.h" 11 12 namespace v8 { 13 namespace internal { 14 15 // Logging and profiling. A StateTag represents a possible state of 16 // the VM. The logger maintains a stack of these. Creating a VMState 17 // object enters a state by pushing on the stack, and destroying a 18 // VMState object leaves a state by popping the current state from the 19 // stack. 20 template <StateTag Tag> 21 class VMState BASE_EMBEDDED { 22 public: 23 explicit inline VMState(Isolate* isolate); 24 inline ~VMState(); 25 26 private: 27 Isolate* isolate_; 28 StateTag previous_tag_; 29 }; 30 31 32 class ExternalCallbackScope BASE_EMBEDDED { 33 public: 34 inline ExternalCallbackScope(Isolate* isolate, Address callback); 35 inline ~ExternalCallbackScope(); callback()36 Address callback() { return callback_; } callback_entrypoint_address()37 Address* callback_entrypoint_address() { 38 if (callback_ == nullptr) return nullptr; 39 #if USES_FUNCTION_DESCRIPTORS 40 return FUNCTION_ENTRYPOINT_ADDRESS(callback_); 41 #else 42 return &callback_; 43 #endif 44 } previous()45 ExternalCallbackScope* previous() { return previous_scope_; } 46 inline Address scope_address(); 47 48 private: 49 Isolate* isolate_; 50 Address callback_; 51 ExternalCallbackScope* previous_scope_; 52 #ifdef USE_SIMULATOR 53 Address scope_address_; 54 #endif 55 }; 56 57 } // namespace internal 58 } // namespace v8 59 60 61 #endif // V8_VM_STATE_H_ 62