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
12namespace v8 {
13namespace 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//
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
39template <StateTag Tag>
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
49template <StateTag Tag>
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
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
68ExternalCallbackScope::~ExternalCallbackScope() {
69  isolate_->set_external_callback_scope(previous_scope_);
70}
71
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