Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / v8 / src / vm-state-inl.h
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 "vm-state.h"
9 #include "log.h"
10 #include "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 //
20 inline 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>
40 VMState<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_,
44         TimerEvent(Logger::START, Logger::TimerEventScope::v8_external));
45   }
46   isolate_->set_current_vm_state(Tag);
47 }
48
49
50 template <StateTag Tag>
51 VMState<Tag>::~VMState() {
52   if (FLAG_log_timer_events && previous_tag_ != EXTERNAL && Tag == EXTERNAL) {
53     LOG(isolate_,
54         TimerEvent(Logger::END, Logger::TimerEventScope::v8_external));
55   }
56   isolate_->set_current_vm_state(previous_tag_);
57 }
58
59
60 ExternalCallbackScope::ExternalCallbackScope(Isolate* isolate, Address callback)
61     : isolate_(isolate),
62       callback_(callback),
63       previous_scope_(isolate->external_callback_scope()) {
64 #ifdef USE_SIMULATOR
65   scope_address_ = Simulator::current(isolate)->get_sp();
66 #endif
67   isolate_->set_external_callback_scope(this);
68 }
69
70 ExternalCallbackScope::~ExternalCallbackScope() {
71   isolate_->set_external_callback_scope(previous_scope_);
72 }
73
74 Address ExternalCallbackScope::scope_address() {
75 #ifdef USE_SIMULATOR
76   return scope_address_;
77 #else
78   return reinterpret_cast<Address>(this);
79 #endif
80 }
81
82
83 } }  // namespace v8::internal
84
85 #endif  // V8_VM_STATE_INL_H_