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