isolate.h revision 109988c7ccb6f3fd1a58574fa3dfb88beaef6632
13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_ISOLATE_H_
644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define V8_ISOLATE_H_
744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <queue>
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <set>
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8-debug.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assert-scope.h"
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/builtins.h"
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/cancelable-task.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/date.h"
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h"
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/frames.h"
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/futex-emulation.h"
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h"
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h"
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hashmap.h"
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h"
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h"
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/optimizing-compile-dispatcher.h"
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h"
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/runtime/runtime.h"
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/runtime-profiler.h"
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h"
3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base {
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RandomNumberGenerator;
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass BasicBlockProfiler;
4244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper;
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallInterfaceDescriptorData;
4444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator;
4544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange;
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeStubDescriptor;
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeTracer;
4844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache;
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CompilationStatistics;
5044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache;
5144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters;
5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures;
5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler;
5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData;
5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer;
5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement;
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalCallbackScope;
5844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable;
5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory;
6044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass FunctionInfoListener;
6144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HandleScopeImplementer;
6244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapProfiler;
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStatistics;
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTracer;
6544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass InlineRuntimeFunctionsTable;
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass InnerPointerToCodeCache;
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Logger;
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MaterializedObjectStore;
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeAgingHelper;
7044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpStack;
7144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext;
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StatsTable;
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StringTracker;
7444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StubCache;
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SweeperThread;
7644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadManager;
7744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadState;
7844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadVisitor;  // Defined in v8threads.h
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UnicodeCache;
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <StateTag Tag> class VMState;
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// 'void function pointer', used to roundtrip the
8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// ExternalReference::ExternalReferenceRedirector since we can not include
8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// assembler.h, where it is defined, here.
8544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef void* ExternalReferenceRedirectorPointer();
8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Debug;
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack;
9044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Redirection;
9144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Simulator;
9244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter {
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Interpreter;
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Static indirection table for handles to constants.  If a frame
9844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// element represents a constant, the data contains an index into
9944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// this table of handles to the actual constants.
10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Static indirection table for handles to constants.  If a Result
10144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// represents a constant, the data contains an index into this table
10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// of handles to the actual constants.
10344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef ZoneList<Handle<Object> > ZoneObjectList;
10444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate)    \
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  do {                                                    \
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Isolate* __isolate__ = (isolate);                     \
1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (__isolate__->has_scheduled_exception()) {         \
1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return __isolate__->PromoteScheduledException();    \
1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                     \
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Macros for MaybeHandle.
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, value) \
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  do {                                                      \
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Isolate* __isolate__ = (isolate);                       \
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (__isolate__->has_scheduled_exception()) {           \
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      __isolate__->PromoteScheduledException();             \
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return value;                                         \
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }                                                       \
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } while (false)
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, T) \
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, MaybeHandle<T>())
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value)  \
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  do {                                                               \
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!(call).ToHandle(&dst)) {                                    \
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK((isolate)->has_pending_exception());                    \
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return value;                                                  \
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }                                                                \
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)  \
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSIGN_RETURN_ON_EXCEPTION_VALUE(                             \
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      isolate, dst, call, isolate->heap()->exception())
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call, T)  \
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, MaybeHandle<T>())
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THROW_NEW_ERROR(isolate, call, T)               \
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {                                                  \
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return isolate->Throw<T>(isolate->factory()->call); \
1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
14644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call) \
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  do {                                                \
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return isolate->Throw(*isolate->factory()->call); \
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } while (false)
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION_VALUE(isolate, call, value)            \
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  do {                                                             \
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if ((call).is_null()) {                                        \
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK((isolate)->has_pending_exception());                  \
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return value;                                                \
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }                                                              \
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } while (false)
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_FAILURE_ON_EXCEPTION(isolate, call)  \
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RETURN_ON_EXCEPTION_VALUE(isolate, call, isolate->heap()->exception())
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION(isolate, call, T)  \
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RETURN_ON_EXCEPTION_VALUE(isolate, call, MaybeHandle<T>())
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
167589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define FOR_EACH_ISOLATE_ADDRESS_NAME(C)                \
168589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(Handler, handler)                                   \
169589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(CEntryFP, c_entry_fp)                               \
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  C(CFunction, c_function)                              \
171589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(Context, context)                                   \
172589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(PendingException, pending_exception)                \
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerContext, pending_handler_context)     \
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerCode, pending_handler_code)           \
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerOffset, pending_handler_offset)       \
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerFP, pending_handler_fp)               \
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerSP, pending_handler_sp)               \
178589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(ExternalCaughtException, external_caught_exception) \
179589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(JSEntrySP, js_entry_sp)
18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier.
1838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId {
1848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
1858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Creates an invalid ThreadId.
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); }
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ThreadId& operator=(const ThreadId& other) {
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    base::NoBarrier_Store(&id_, base::NoBarrier_Load(&other.id_));
190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return *this;
191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns ThreadId for current thread.
1948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Current() { return ThreadId(GetCurrentThreadId()); }
1958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns invalid ThreadId (guaranteed not to be equal to any thread).
1978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Invalid() { return ThreadId(kInvalidId); }
1988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Compares ThreadIds for equality.
2008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool Equals(const ThreadId& other) const) {
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return base::NoBarrier_Load(&id_) == base::NoBarrier_Load(&other.id_);
2028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
2038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Checks whether this ThreadId refers to any thread.
2058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool IsValid() const) {
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return base::NoBarrier_Load(&id_) != kInvalidId;
2078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
2088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
2108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::GetCurrentThreadId).
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int ToInteger() const { return static_cast<int>(base::NoBarrier_Load(&id_)); }
2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::TerminateExecution).
2158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId FromInteger(int id) { return ThreadId(id); }
2168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
2188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kInvalidId = -1;
2198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit ThreadId(int id) { base::NoBarrier_Store(&id_, id); }
2218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int AllocateThreadId();
2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int GetCurrentThreadId();
2258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  base::Atomic32 id_;
2278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Atomic32 highest_thread_id_;
2298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class Isolate;
2318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ACCESSOR(type, name)                 \
235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline void set_##name(type v) { name##_ = v; }  \
236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline type name() const { return name##_; }
237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
23944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED {
24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
2418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Does early low-level initialization that does not depend on the
2428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // isolate being present.
2438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadLocalTop();
2448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
24544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initialize the thread data.
24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Initialize();
24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the top C++ try catch handler or NULL if none are registered.
24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This method is not guaranteed to return an address that can be
25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // used for comparison with addresses into the JS stack.  If such an
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // address is needed, use try_catch_handler_address.
253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FIELD_ACCESSOR(v8::TryCatch*, try_catch_handler)
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the address of the top C++ try catch handler or NULL if
25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // none are registered.
25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method always returns an address that can be compared to
25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // pointers into the JavaScript stack.  When running on actual
26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // hardware, try_catch_handler_address and TryCatchHandler return
26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the same pointer.  When running on a simulator with a separate JS
26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // stack, try_catch_handler_address returns a JS stack address that
26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // corresponds to the place on the JS stack where the C++ handler
26444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // would have been if the stack were not separate.
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address try_catch_handler_address() {
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Address>(
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::TryCatch::JSStackComparableAddress(try_catch_handler()));
26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Free();
27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Isolate* isolate_;
27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The context where the current execution method is created and for variable
27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // lookups.
27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context_;
2768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadId thread_id_;
277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* pending_exception_;
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Communication channel between Isolate::FindHandler and the CEntryStub.
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Context* pending_handler_context_;
281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Code* pending_handler_code_;
282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t pending_handler_offset_;
283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address pending_handler_fp_;
284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address pending_handler_sp_;
285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Communication channel between Isolate::Throw and message consumers.
287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool rethrowing_message_;
28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* pending_message_obj_;
289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Use a separate value for scheduled exceptions to preserve the
29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // invariants that hold about pending_exception.  We may want to
29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // unify them later.
293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* scheduled_exception_;
29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool external_caught_exception_;
29544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* save_context_;
29644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
29744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Stack.
29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address c_entry_fp_;  // the frame pointer of the top c entry frame
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address handler_;     // try-blocks are chained through the stack
300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Address c_function_;  // C function that was called at c entry.
30144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Throwing an exception may cause a Promise rejection.  For this purpose
303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // we keep track of a stack of nested promises and the corresponding
304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // try-catch handlers.
305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* promise_on_stack_;
306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR
30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Simulator* simulator_;
30944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address js_entry_sp_;  // the stack pointer of the bottom JS entry frame
312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the external callback we're currently in
313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalCallbackScope* external_callback_scope_;
31444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StateTag current_vm_state_;
31544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Call back function to report unsafe JS accesses.
31744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::FailedAccessCheckCallback failed_access_check_callback_;
31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
3208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void InitializeInternal();
3218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::TryCatch* try_catch_handler_;
32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V)                                         \
329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(bool, simulator_initialized, false)                                        \
330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HashMap*, simulator_i_cache, NULL)                                         \
331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Redirection*, simulator_redirection, NULL)
33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V)
33544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
34044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)                                       \
34244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CommentStatistic, paged_space_comments_statistics,                         \
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CommentStatistic::kMaxComments + 1)                                      \
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int, code_kind_statistics, Code::NUMBER_OF_KINDS)
34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
34844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V)                                             \
35244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* SerializerDeserializer state. */                                          \
353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int32_t, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \
35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, bad_char_shift_table, kUC16AlphabetSize)                              \
35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, good_suffix_shift_table, (kBMMaxShift + 1))                           \
35644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, suffix_table, (kBMMaxShift + 1))                                      \
3573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(uint32_t, private_random_seed, 2)                                          \
35844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef List<HeapObject*> DebugObjectCache;
36144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_LIST(V)                                                   \
36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* Assembler state. */                                                       \
36444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(FatalErrorCallback, exception_behavior, NULL)                              \
365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LogEventCallback, event_logger, NULL)                                      \
366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, NULL)     \
36744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* To distinguish the function templates, so that we can find them in the */ \
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  /* function cache of the native context. */                                  \
36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, next_serial_number, 0)                                                \
37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalReferenceRedirectorPointer*, external_reference_redirector, NULL)  \
37144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* Part of the state of liveedit. */                                         \
37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(FunctionInfoListener*, active_function_info_listener, NULL)                \
37344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* State for Relocatable. */                                                 \
37444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Relocatable*, relocatable_top, NULL)                                       \
37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(DebugObjectCache*, string_stream_debug_object_cache, NULL)                 \
37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Object*, string_stream_current_security_token, NULL)                       \
37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalReferenceTable*, external_reference_table, NULL)                   \
378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(HashMap*, external_reference_map, NULL)                                    \
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(HashMap*, root_index_map, NULL)                                            \
380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int, pending_microtask_count, 0)                                           \
381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(bool, autorun_microtasks, true)                                            \
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HStatistics*, hstatistics, NULL)                                           \
383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CompilationStatistics*, turbo_statistics, NULL)                            \
384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HTracer*, htracer, NULL)                                                   \
385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CodeTracer*, code_tracer, NULL)                                            \
386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(bool, fp_stubs_generated, false)                                           \
387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu)                            \
388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(PromiseRejectCallback, promise_reject_callback, NULL)                      \
389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(const v8::StartupData*, snapshot_blob, NULL)                               \
390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ISOLATE_INIT_SIMULATOR_LIST(V)
391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define THREAD_LOCAL_TOP_ACCESSOR(type, name)                        \
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline void set_##name(type v) { thread_local_top_.name##_ = v; }  \
394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline type name() const { return thread_local_top_.name##_; }
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THREAD_LOCAL_TOP_ADDRESS(type, name) \
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type* name##_address() { return &thread_local_top_.name##_; }
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
39944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
40044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate {
40144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These forward declarations are required to make the friend declarations in
40244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // PerIsolateThreadData work on some older versions of gcc.
40344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable;
40444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem;
40544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
40644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~Isolate();
40744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
40844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A thread has a PerIsolateThreadData instance for each isolate that it has
40944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // entered. That instance is allocated when the isolate is initially entered
41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and reused on subsequent entries.
41144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class PerIsolateThreadData {
41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData(Isolate* isolate, ThreadId thread_id)
41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : isolate_(isolate),
41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_id_(thread_id),
41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block          stack_limit_(0),
41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_state_(NULL),
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block          simulator_(NULL),
42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block          next_(NULL),
42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block          prev_(NULL) { }
423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ~PerIsolateThreadData();
42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate() const { return isolate_; }
42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id() const { return thread_id_; }
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(uintptr_t, stack_limit)
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(ThreadState*, thread_state)
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(Simulator*, simulator)
43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    bool Matches(Isolate* isolate, ThreadId thread_id) const {
4358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      return isolate_ == isolate && thread_id_.Equals(thread_id);
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate_;
44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id_;
44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    uintptr_t stack_limit_;
44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadState* thread_state_;
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Simulator* simulator_;
44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* next_;
44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* prev_;
45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class Isolate;
45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class ThreadDataTable;
45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class EntryStackItem;
45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData);
45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  enum AddressId {
460589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address,
461589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM)
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_ENUM
463589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    kIsolateAddressCount
46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void InitializeOncePerProcess();
467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the PerIsolateThreadData for the current thread (or NULL if one is
46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not currently set).
47044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static PerIsolateThreadData* CurrentPerIsolateThreadData() {
47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return reinterpret_cast<PerIsolateThreadData*>(
472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetThreadLocal(per_isolate_thread_data_key_));
47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the isolate inside which the current thread is running.
47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  INLINE(static Isolate* Current()) {
477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1);
47844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate = reinterpret_cast<Isolate*>(
479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetExistingThreadLocal(isolate_key_));
480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate != NULL);
48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return isolate;
48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
48344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Like Current, but skips the check that |isolate_key_| was initialized.
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Callers have to ensure that themselves.
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // DO NOT USE. The only remaining callsite will be deleted soon.
487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  INLINE(static Isolate* UnsafeCurrent()) {
488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Isolate*>(
489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetThreadLocal(isolate_key_));
49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
49144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
49269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Usually called by Init(), but can be called early e.g. to allow
49369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // testing components that require logging but not the whole
49469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // isolate.
49569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  //
49669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Safe to call more than once.
49769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeLoggingAndCounters();
49869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool Init(Deserializer* des);
50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // True if at least one thread Enter'ed this isolate.
50244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsInUse() { return entry_stack_ != NULL; }
50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Destroys the non-default isolates.
50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Sets default isolate into "has_been_disposed" state rather then destroying,
50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for legacy API reasons.
50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TearDown();
50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void GlobalTearDown();
51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ClearSerializerData();
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Find the PerThread for this particular (isolate, thread) combination
514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // If one does not yet exist, return null.
515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PerIsolateThreadData* FindPerThreadDataForThisThread();
516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the PerThread for given (isolate, thread) combination
518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If one does not yet exist, return null.
519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id);
52044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Discard the PerThread for this particular (isolate, thread) combination
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If one does not yet exist, no-op.
523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DiscardPerThreadDataForThisThread();
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
52544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store the pointer to the current isolate.
52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Used internally for V8 threads that do not execute JavaScript but still
52744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // are part of the domain of an isolate (like the context switcher).
528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey isolate_key() {
52985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return isolate_key_;
53085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
53144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store process-wide thread IDs.
533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey thread_id_key() {
53485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return thread_id_key_;
53585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
53644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey per_isolate_thread_data_key();
53844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Mutex for serializing access to break control structures.
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RecursiveMutex* break_access() { return &break_access_; }
54169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
54244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address get_address_from_id(AddressId id);
54344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
54444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to top context (where the current function object was created).
54544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context() { return thread_local_top_.context_; }
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_context(Context* context);
54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context** context_address() { return &thread_local_top_.context_; }
54844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(SaveContext*, save_context)
55044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
55144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to current thread id.
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(ThreadId, thread_id)
55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Interface to pending exception.
555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Object* pending_exception();
556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_pending_exception(Object* exception_obj);
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_pending_exception();
558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception)
560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_pending_exception();
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context)
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code)
565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset)
566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp)
567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp)
568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception)
570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::TryCatch* try_catch_handler() {
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return thread_local_top_.try_catch_handler();
57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool* external_caught_exception_address() {
57544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.external_caught_exception_;
57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception)
579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_pending_message();
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address pending_message_obj_address() {
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_);
5838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Object* scheduled_exception();
586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_scheduled_exception();
587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_scheduled_exception();
58844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsJavaScriptHandlerOnTop(Object* exception);
590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsExternalHandlerOnTop(Object* exception);
59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_catchable_by_javascript(Object* exception);
593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JS execution stack (see frames.h).
59544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address c_entry_fp(ThreadLocalTop* thread) {
59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread->c_entry_fp_;
59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address handler(ThreadLocalTop* thread) { return thread->handler_; }
599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Address c_function() { return thread_local_top_.c_function_; }
60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
60144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* c_entry_fp_address() {
60244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.c_entry_fp_;
60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* handler_address() { return &thread_local_top_.handler_; }
605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Address* c_function_address() {
606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &thread_local_top_.c_function_;
607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
60844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Bottom JS entry.
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address js_entry_sp() {
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return thread_local_top_.js_entry_sp_;
61244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* js_entry_sp_address() {
61444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.js_entry_sp_;
61544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global object of the current context. It could be
6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a builtin object, or a JS global object.
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Handle<JSGlobalObject> global_object();
62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global proxy object of the current context.
622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  JSObject* global_proxy() {
62344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return context()->global_proxy();
62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
62544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); }
62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FreeThreadResources() { thread_local_top_.Free(); }
62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method is called by the api after operations that may throw
63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // exceptions.  If an exception was thrown and not handled by an external
63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // handler the exception is scheduled to be rethrown when we return to running
63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JavaScript code.  If an exception is scheduled true is returned.
63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool OptionalRescheduleException(bool is_bottom_call);
63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Push and pop a promise and the current try-catch handler.
636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PushPromise(Handle<JSObject> promise, Handle<JSFunction> function);
637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void PopPromise();
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> GetPromiseOnStackOnThrow();
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  class ExceptionScope {
6418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   public:
642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Scope currently can only be used for regular exceptions,
643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // not termination exception.
644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inline explicit ExceptionScope(Isolate* isolate);
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inline ~ExceptionScope();
6468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   private:
6488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Isolate* isolate_;
6498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Handle<Object> pending_exception_;
6508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  };
6518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
65244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetCaptureStackTraceForUncaughtExceptions(
65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      bool capture,
65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void SetAbortOnUncaughtExceptionCallback(
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Isolate::AbortOnUncaughtExceptionCallback callback);
659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  enum PrintStackMode { kPrintStackConcise, kPrintStackVerbose };
66144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintCurrentStackTrace(FILE* out);
662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintStack(StringStream* accumulator,
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  PrintStackMode mode = kPrintStackVerbose);
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintStack(FILE* out, PrintStackMode mode = kPrintStackVerbose);
66544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> StackTraceString();
666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NO_INLINE(void PushStackTraceAndDie(unsigned int magic, void* ptr1,
667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      void* ptr2, unsigned int magic2));
66844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSArray> CaptureCurrentStackTrace(
66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> CaptureSimpleStackTrace(Handle<JSObject> error_object,
672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Handle<Object> caller);
673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MaybeHandle<JSObject> CaptureAndSetDetailedStackTrace(
674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> error_object);
675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MaybeHandle<JSObject> CaptureAndSetSimpleStackTrace(
676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> error_object, Handle<Object> caller);
677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSArray> GetDetailedStackTrace(Handle<JSObject> error_object);
678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSArray> GetDetailedFromSimpleStackTrace(
679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Handle<JSObject> error_object);
6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns if the given context may access the given global object. If
68244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the result is false, the pending exception is guaranteed to be
68344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // set.
684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool MayAccess(Handle<Context> accessing_context, Handle<JSObject> receiver);
685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback);
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ReportFailedAccessCheck(Handle<JSObject> receiver);
68844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exception throwing support. The caller should use the result
69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // of Throw() as its return value.
691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* Throw(Object* exception, MessageLocation* location = NULL);
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* ThrowIllegalOperation();
693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template <typename T>
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception,
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       MessageLocation* location = NULL) {
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Throw(*exception, location);
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MaybeHandle<T>();
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Re-throw an exception.  This involves no error reporting since error
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // reporting was handled when the exception was thrown originally.
703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* ReThrow(Object* exception);
704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Find the correct handler for the current pending exception. This also
706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // clears and returns the current pending exception.
707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* UnwindAndFindHandler();
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Tries to predict whether an exception will be caught. Note that this can
710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // only produce an estimate, because it is undecidable whether a finally
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // clause will consume or re-throw an exception. We conservatively assume any
712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // finally clause will behave as if the exception were consumed.
713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  enum CatchType { NOT_CAUGHT, CAUGHT_BY_JAVASCRIPT, CAUGHT_BY_EXTERNAL };
714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CatchType PredictExceptionCatcher();
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ScheduleThrow(Object* exception);
717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Re-set pending message, script and positions reported to the TryCatch
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // back to the TLS for re-use when rethrowing.
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RestorePendingMessageFromTryCatch(v8::TryCatch* handler);
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Un-schedule an exception that was caught by a TryCatch handler.
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler);
72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ReportPendingMessages();
723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return pending location if any or unfilled structure.
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MessageLocation GetMessageLocation();
72544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
72644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Promote a scheduled exception to pending. Asserts has_scheduled_exception.
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* PromoteScheduledException();
72844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
72944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Attempts to compute the current source location, storing the
73044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // result in the target out parameter.
731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ComputeLocation(MessageLocation* target);
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ComputeLocationFromException(MessageLocation* target,
733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Handle<Object> exception);
734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool ComputeLocationFromStackTrace(MessageLocation* target,
735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                     Handle<Object> exception);
736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSMessageObject> CreateMessage(Handle<Object> exception,
738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        MessageLocation* location);
73944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Out of resource exception helpers.
741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* StackOverflow();
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* TerminateExecution();
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CancelTerminateExecution();
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void RequestInterrupt(InterruptCallback callback, void* data);
746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void InvokeApiInterruptCallbacks();
74744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Administration
74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v);
75044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v, ThreadLocalTop* t);
75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* Iterate(ObjectVisitor* v, char* t);
75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateThread(ThreadVisitor* v, char* t);
75344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Returns the current native context.
755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context();
75644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns the native context of the calling JavaScript code.  That
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // is, the native context of the top-most JavaScript frame.
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> GetCallingNativeContext();
76044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RegisterTryCatchHandler(v8::TryCatch* that);
76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UnregisterTryCatchHandler(v8::TryCatch* that);
76344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* ArchiveThread(char* to);
76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* RestoreThread(char* from);
76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const char* const kStackOverflowMessage;
76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kUC16AlphabetSize = 256;  // See StringSearchBase.
77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kBMMaxShift = 250;        // See StringSearchBase.
77144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
77244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Accessors.
77344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue)                       \
77444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type name() const {                                            \
775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
77644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return name##_;                                                     \
77744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }                                                                     \
77844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void set_##name(type value) {                                  \
779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
78044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    name##_ = value;                                                    \
78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_ACCESSOR)
78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR
78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length)                       \
78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type* name() {                                                 \
787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
78844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &(name##_)[0];                                               \
78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR)
79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR
79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Handle<type> name();                            \
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_##name(type* value);
796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSOR)
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSOR
79844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper() { return bootstrapper_; }
80069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Counters* counters() {
80169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
80269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(counters_ != NULL);
80469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return counters_;
80569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
80644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CodeRange* code_range() { return code_range_; }
80744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler() { return runtime_profiler_; }
80844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache() { return compilation_cache_; }
80969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Logger* logger() {
81069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
81169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(logger_ != NULL);
81369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return logger_;
81469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
81544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard() { return &stack_guard_; }
81644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Heap* heap() { return &heap_; }
81769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  StatsTable* stats_table();
81844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StubCache* stub_cache() { return stub_cache_; }
819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeAgingHelper* code_aging_helper() { return code_aging_helper_; }
82044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; }
821109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool deoptimizer_lazy_throw() const { return deoptimizer_lazy_throw_; }
822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void set_deoptimizer_lazy_throw(bool value) {
823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    deoptimizer_lazy_throw_ = value;
824109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
82544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop* thread_local_top() { return &thread_local_top_; }
826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaterializedObjectStore* materialized_object_store() {
827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return materialized_object_store_;
82844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
83044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MemoryAllocator* memory_allocator() {
83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return memory_allocator_;
83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  KeyedLookupCache* keyed_lookup_cache() {
83544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return keyed_lookup_cache_;
83644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache() {
83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return context_slot_cache_;
84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
84144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
84244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache() {
84344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return descriptor_lookup_cache_;
84444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
84544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScopeData* handle_scope_data() { return &handle_scope_data_; }
847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer() {
849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(handle_scope_implementer_);
85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return handle_scope_implementer_;
85144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Zone* runtime_zone() { return &runtime_zone_; }
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* interface_descriptor_zone() { return &interface_descriptor_zone_; }
85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache() {
8568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return unicode_cache_;
85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache() {
8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return inner_pointer_to_code_cache_;
8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles() { return global_handles_; }
86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles() { return eternal_handles_; }
86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ThreadManager* thread_manager() { return thread_manager_; }
86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() {
87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_uncanonicalize_;
87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() {
87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_canonrange_;
87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState* runtime_state() { return &runtime_state_; }
87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins* builtins() { return &builtins_; }
88044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void NotifyExtensionInstalled() {
8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    has_installed_extensions_ = true;
8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_installed_extensions() { return has_installed_extensions_; }
8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
88744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize() {
88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &regexp_macro_assembler_canonicalize_;
89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
89244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack() { return regexp_stack_; }
89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      interp_canonicalize_mapping() {
896109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &regexp_macro_assembler_canonicalize_;
89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
89844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Debug* debug() { return debug_; }
90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CpuProfiler* cpu_profiler() const { return cpu_profiler_; }
902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapProfiler* heap_profiler() const { return heap_profiler_; }
903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo* heap_histograms() { return heap_histograms_; }
90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation* js_spill_information() {
90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &js_spill_information_;
90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory() { return reinterpret_cast<Factory*>(this); }
91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kJSRegexpStaticOffsetsVectorSize = 128;
91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(ExternalCallbackScope*, external_callback_scope)
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(StateTag, current_vm_state)
919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetData(uint32_t slot, void* data) {
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(slot < Internals::kNumIsolateDataSlots);
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    embedder_data_[slot] = data;
92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* GetData(uint32_t slot) {
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(slot < Internals::kNumIsolateDataSlots);
926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return embedder_data_[slot];
92744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
92844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool serializer_enabled() const { return serializer_enabled_; }
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool snapshot_available() const {
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return snapshot_blob_ != NULL && snapshot_blob_->raw_size != 0;
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
93344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDead() { return has_fatal_error_; }
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SignalFatalError() { has_fatal_error_ = true; }
93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool use_crankshaft() const;
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool initialized_from_snapshot() { return initialized_from_snapshot_; }
940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double time_millis_since_init() {
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return heap_.MonotonicallyIncreasingTimeInMs() - time_millis_at_init_;
94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DateCache* date_cache() {
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return date_cache_;
94744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_date_cache(DateCache* date_cache) {
950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (date_cache != date_cache_) {
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      delete date_cache_;
95244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    date_cache_ = date_cache;
95444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
95544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Map* get_initial_js_array_map(ElementsKind kind,
957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                Strength strength = Strength::WEAK);
958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kArrayProtectorValid = 1;
960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kArrayProtectorInvalid = 0;
961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsFastArrayConstructorPrototypeChainIntact();
963109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool IsArraySpeciesLookupChainIntact();
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // On intent to set an element in object, make sure that appropriate
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // notifications occur if the set is on the elements of the array or
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // object prototype. Also ensure that changes to prototype chain between
968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Array and Object fire notifications.
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetElement(Handle<JSObject> object);
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetLength(Handle<JSObject> object) {
971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetPrototype(Handle<JSObject> object) {
974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnNormalizeElements(Handle<JSObject> object) {
977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
979109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void InvalidateArraySpeciesProtector();
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns true if array is the initial array prototype in any native context.
982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsAnyInitialArrayPrototype(Handle<JSArray> array);
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptorData* call_descriptor_data(int index);
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void IterateDeferredHandles(ObjectVisitor* visitor);
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void LinkDeferredHandles(DeferredHandles* deferred_handles);
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UnlinkDeferredHandles(DeferredHandles* deferred_handles);
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDeferredHandle(Object** location);
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // DEBUG
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool concurrent_recompilation_enabled() {
995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Thread is only available with flag enabled.
996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(optimizing_compile_dispatcher_ == NULL ||
997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           FLAG_concurrent_recompilation);
998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_ != NULL;
9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool concurrent_osr_enabled() const {
1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Thread is only available with flag enabled.
1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(optimizing_compile_dispatcher_ == NULL ||
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           FLAG_concurrent_recompilation);
1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_ != NULL && FLAG_concurrent_osr;
10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OptimizingCompileDispatcher* optimizing_compile_dispatcher() {
1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_;
10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int id() const { return static_cast<int>(id_); }
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStatistics* GetHStatistics();
1015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CompilationStatistics* GetTurboStatistics();
1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HTracer* GetHTracer();
1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeTracer* GetCodeTracer();
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DumpAndResetCompilationStats();
1020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionEntryHook function_entry_hook() { return function_entry_hook_; }
1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_function_entry_hook(FunctionEntryHook function_entry_hook) {
1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    function_entry_hook_ = function_entry_hook;
10243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* stress_deopt_count_address() { return &stress_deopt_count_; }
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void* virtual_handler_register_address() {
1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &virtual_handler_register_;
1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void* virtual_slot_register_address() { return &virtual_slot_register_; }
1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  base::RandomNumberGenerator* random_number_generator();
1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Given an address occupied by a live code object, return that object.
1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* FindCodeObject(Address a);
1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int NextOptimizationId() {
1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int id = next_optimization_id_++;
1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!Smi::IsValid(next_optimization_id_)) {
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      next_optimization_id_ = 0;
10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return id;
10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void IncrementJsCallsFromApiCounter() { ++js_calls_from_api_counter_; }
1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned int js_calls_from_api_counter() {
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return js_calls_from_api_counter_;
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Get (and lazily initialize) the registry for per-isolate symbols.
1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> GetSymbolRegistry();
1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddCallCompletedCallback(CallCompletedCallback callback);
1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RemoveCallCompletedCallback(CallCompletedCallback callback);
1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void FireCallCompletedCallback();
1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1060109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1061109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1062109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void FireBeforeCallEnteredCallback();
1063109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void SetPromiseRejectCallback(PromiseRejectCallback callback);
1065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void ReportPromiseReject(Handle<JSObject> promise, Handle<Object> value,
1066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           v8::PromiseRejectEvent event);
1067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void EnqueueMicrotask(Handle<Object> microtask);
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RunMicrotasks();
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback);
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CountUsage(v8::Isolate::UseCounterFeature feature);
1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* GetOrCreateBasicBlockProfiler();
1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* basic_block_profiler() { return basic_block_profiler_; }
1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::string GetTurboCfgFileName();
1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
1080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int GetNextUniqueSharedFunctionInfoId() { return next_unique_sfi_id_++; }
1081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AddDetachedContext(Handle<Context> context);
1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CheckDetachedContextsAfterGC();
1086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  List<Object*>* partial_snapshot_cache() { return &partial_snapshot_cache_; }
1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void set_array_buffer_allocator(v8::ArrayBuffer::Allocator* allocator) {
1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    array_buffer_allocator_ = allocator;
1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::ArrayBuffer::Allocator* array_buffer_allocator() const {
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return array_buffer_allocator_;
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FutexWaitListNode* futex_wait_list_node() { return &futex_wait_list_node_; }
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CancelableTaskManager* cancelable_task_manager() {
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return cancelable_task_manager_;
1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Interpreter* interpreter() const { return interpreter_; }
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected:
1105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit Isolate(bool enable_serializer);
110644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct GlobalState;
11093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct InitializeGlobalState;
1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> SetUpSubregistry(Handle<JSObject> registry, Handle<Map> map,
1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    const char* name);
11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // These fields are accessed through the API, offsets must be kept in sync
1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // with v8::internal::Internals (in include/v8.h) constants. This is also
1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // verified in Isolate::Init() using runtime checks.
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* embedder_data_[Internals::kNumIsolateDataSlots];
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap heap_;
1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The per-process lock should be acquired before the ThreadDataTable is
112044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // modified.
112144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable {
112244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
112344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadDataTable();
112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ~ThreadDataTable();
112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id);
112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Insert(PerIsolateThreadData* data);
112844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Remove(PerIsolateThreadData* data);
11293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    void RemoveAllThreads(Isolate* isolate);
113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* list_;
113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These items form a stack synchronously with threads Enter'ing and Exit'ing
113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the Isolate. The top of the stack points to a thread which is currently
113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // running the Isolate. When the stack is empty, the Isolate is considered
113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not entered by any thread and can be Disposed.
113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If the same thread enters the Isolate more then once, the entry_count_
114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is incremented rather then a new item pushed to the stack.
114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem {
114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem(PerIsolateThreadData* previous_thread_data,
114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   Isolate* previous_isolate,
114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   EntryStackItem* previous_item)
114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : entry_count(1),
114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_thread_data(previous_thread_data),
114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_isolate(previous_isolate),
114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_item(previous_item) { }
115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    int entry_count;
115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* previous_thread_data;
115344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* previous_isolate;
115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem* previous_item;
115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   private:
115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(EntryStackItem);
115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::LazyMutex thread_data_table_mutex_;
116185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey per_isolate_thread_data_key_;
1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey isolate_key_;
1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey thread_id_key_;
116585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static ThreadDataTable* thread_data_table_;
116685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A global counter for all generated Isolates, might overflow.
1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Atomic32 isolate_counter_;
1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG
1171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static base::Atomic32 isolate_key_created_;
1172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
117444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Deinit();
117544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
117644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void SetIsolateThreadLocals(Isolate* isolate,
117744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     PerIsolateThreadData* data);
117844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
117944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Find the PerThread for this particular (isolate, thread) combination.
118044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If one does not yet exist, allocate a new one.
118144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread();
118244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
118344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initializes the current thread to run this Isolate.
118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Enter();
118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exits the current thread. The previosuly entered Isolate is restored
118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for the thread.
119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Exit();
119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void InitializeThreadLocal();
119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactPrologue(bool is_compacting,
119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactEpilogue(bool is_compacting,
119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FillCache();
120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Propagate pending exception message to the v8::TryCatch.
1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If there is no external try-catch or message was successfully propagated,
1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // then return true.
1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool PropagatePendingExceptionToExternalTryCatch();
120769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Remove per-frame stored materialized objects when we are unwinding
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the frame.
1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void RemoveMaterializedObjectsOnUnwind(StackFrame* frame);
12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::Atomic32 id_;
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EntryStackItem* entry_stack_;
121444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_nesting_level_;
121544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringStream* incomplete_message_;
1216589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  Address isolate_addresses_[kIsolateAddressCount + 1];  // NOLINT
121744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper_;
121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler_;
121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache_;
122044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Counters* counters_;
122144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CodeRange* code_range_;
1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RecursiveMutex break_access_;
122344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Logger* logger_;
122444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard stack_guard_;
122544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StatsTable* stats_table_;
122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StubCache* stub_cache_;
1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeAgingHelper* code_aging_helper_;
122844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data_;
1229109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool deoptimizer_lazy_throw_;
1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaterializedObjectStore* materialized_object_store_;
123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop thread_local_top_;
123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool capture_stack_trace_for_uncaught_exceptions_;
123344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_for_uncaught_exceptions_frame_limit_;
123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_;
123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MemoryAllocator* memory_allocator_;
123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  KeyedLookupCache* keyed_lookup_cache_;
123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache_;
123844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache_;
1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScopeData handle_scope_data_;
124044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer_;
12418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache_;
1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Zone runtime_zone_;
1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone interface_descriptor_zone_;
12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache_;
124544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles_;
1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles_;
124744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadManager* thread_manager_;
124844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState runtime_state_;
124944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins builtins_;
12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_installed_extensions_;
125144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_;
125244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_;
125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>
125444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize_;
125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack_;
12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DateCache* date_cache_;
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptorData* call_descriptor_data_;
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RandomNumberGenerator* random_number_generator_;
125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Whether the isolate has been created for snapshotting.
1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool serializer_enabled_;
1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if fatal error has been signaled for this isolate.
1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_fatal_error_;
1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if this isolate was initialized from a snapshot.
1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool initialized_from_snapshot_;
12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Time stamp at initialization.
12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  double time_millis_at_init_;
12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A static array of histogram info for each type.
127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo heap_histograms_[LAST_TYPE + 1];
127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation js_spill_information_;
127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Debug* debug_;
1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CpuProfiler* cpu_profiler_;
1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapProfiler* heap_profiler_;
1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionEntryHook function_entry_hook_;
128244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Interpreter* interpreter_;
1284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef std::pair<InterruptCallback, void*> InterruptEntry;
1286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::queue<InterruptEntry> api_interrupts_queue_;
1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue)                         \
128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_;
129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE)
129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE
129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
129344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length)                         \
129444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_[length];
129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE)
129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE
129744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
129944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This class is huge and has a number of fields controlled by
130044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // preprocessor defines. Make sure the offsets of these fields agree
130144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // between compilation units.
130244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored)                              \
130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const intptr_t name##_debug_offset_;
130444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
130544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
130644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET
130744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
130844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DeferredHandles* deferred_handles_head_;
1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OptimizingCompileDispatcher* optimizing_compile_dispatcher_;
1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Counts deopt points if deopt_every_n_times is enabled.
1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  unsigned int stress_deopt_count_;
1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address virtual_handler_register_;
1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address virtual_slot_register_;
1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int next_optimization_id_;
1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Counts javascript calls from the API. Wraps around on overflow.
1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned int js_calls_from_api_counter_;
1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
1324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int next_unique_sfi_id_;
1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1327109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // List of callbacks before a Call starts execution.
1328109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  List<BeforeCallEnteredCallback> before_call_entered_callbacks_;
1329109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // List of callbacks when a Call completes.
1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  List<CallCompletedCallback> call_completed_callbacks_;
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::Isolate::UseCounterCallback use_counter_callback_;
1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* basic_block_profiler_;
1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  List<Object*> partial_snapshot_cache_;
1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::ArrayBuffer::Allocator* array_buffer_allocator_;
1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FutexWaitListNode futex_wait_list_node_;
1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CancelableTaskManager* cancelable_task_manager_;
1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Isolate::AbortOnUncaughtExceptionCallback
1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      abort_on_uncaught_exception_callback_;
1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
134744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class ExecutionAccess;
1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HandleScopeImplementer;
1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend class OptimizingCompileDispatcher;
1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class SweeperThread;
1351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class ThreadManager;
1352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class Simulator;
1353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class StackGuard;
13548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class ThreadId;
135569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  friend class TestMemoryAllocatorScope;
1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class TestCodeRangeScope;
135744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Isolate;
135844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Locker;
1359257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class v8::Unlocker;
1360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend v8::StartupData v8::V8::CreateSnapshotDataBlob(const char*);
136144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
136244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(Isolate);
136344f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
136444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ACCESSOR
1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef THREAD_LOCAL_TOP_ACCESSOR
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack {
1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PromiseOnStack(Handle<JSFunction> function, Handle<JSObject> promise,
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 PromiseOnStack* prev)
1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : function_(function), promise_(promise), prev_(prev) {}
1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function() { return function_; }
1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> promise() { return promise_; }
1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* prev() { return prev_; }
1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function_;
1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> promise_;
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* prev_;
1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
138644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the
138744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these
138844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details.
138944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED {
139044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit SaveContext(Isolate* isolate);
1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ~SaveContext();
139344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
139444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context() { return context_; }
139544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev() { return prev_; }
139644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
139744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns true if this save context is below a given JavaScript frame.
13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsBelowFrame(JavaScriptFrame* frame) {
13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp());
140044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
140144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
140444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev_;
14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address c_entry_fp_;
140744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
140844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED {
141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit AssertNoContextChange(Isolate* isolate);
141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~AssertNoContextChange() {
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate_->context() == *context_);
141644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
141744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
142144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
142244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit AssertNoContextChange(Isolate* isolate) { }
142444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
142544f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
142644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED {
142944f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
143044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) {
143144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Lock(isolate);
143244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
143344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~ExecutionAccess() { Unlock(isolate_); }
143444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void Lock(Isolate* isolate) { isolate->break_access()->Lock(); }
1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void Unlock(Isolate* isolate) { isolate->break_access()->Unlock(); }
143744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
143844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool TryLock(Isolate* isolate) {
1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return isolate->break_access()->TryLock();
144044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
144144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
144244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
144344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
144444f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
144644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for checking for stack-overflows.
144844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED {
144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
145044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { }
145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use this to check for stack-overflows in C++ code.
1453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasOverflowed() const {
145444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StackGuard* stack_guard = isolate_->stack_guard();
1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return GetCurrentStackPosition() < stack_guard->real_climit();
145644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Use this to check for interrupt request in C++ code.
1459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InterruptRequested() {
1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StackGuard* stack_guard = isolate_->stack_guard();
1461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return GetCurrentStackPosition() < stack_guard->climit();
1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use this to check for stack-overflow when entering runtime from JS code.
1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool JsHasOverflowed(uintptr_t gap = 0) const;
1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
146744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
146844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
146944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
147044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
147144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
147244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost
147344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any
147444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into
147544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account.
147644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED {
147744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PostponeInterruptsScope(Isolate* isolate,
1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          int intercept_mask = StackGuard::ALL_INTERRUPTS)
1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : stack_guard_(isolate->stack_guard()),
1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        intercept_mask_(intercept_mask),
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        intercepted_flags_(0) {
1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stack_guard_->PushPostponeInterruptsScope(this);
148444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
148544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
148644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~PostponeInterruptsScope() {
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stack_guard_->PopPostponeInterruptsScope();
148844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the bottom-most scope that intercepts this interrupt.
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return whether the interrupt has been intercepted.
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool Intercept(StackGuard::InterruptFlag flag);
1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149444f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
149544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard_;
1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int intercept_mask_;
1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int intercepted_flags_;
1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PostponeInterruptsScope* prev_;
1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class StackGuard;
150144f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
150244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
150344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CodeTracer final : public Malloced {
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit CodeTracer(int isolate_id)
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : file_(NULL),
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        scope_depth_(0) {
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      file_ = stdout;
1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
151344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_redirect_code_traces_to == NULL) {
1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SNPrintF(filename_,
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               "code-%d-%d.asm",
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               base::OS::GetCurrentProcessId(),
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               isolate_id);
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length());
1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
152244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WriteChars(filename_.start(), "", 0, false);
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
152544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class Scope {
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); }
1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ~Scope() { tracer_->CloseFile();  }
153044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FILE* file() const { return tracer_->file(); }
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   private:
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CodeTracer* tracer_;
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void OpenFile() {
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (file_ == NULL) {
1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      file_ = base::OS::FOpen(filename_.start(), "ab");
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    scope_depth_++;
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CloseFile() {
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (--scope_depth_ == 0) {
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      fclose(file_);
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      file_ = NULL;
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE* file() const { return file_; }
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool ShouldRedirect() {
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return FLAG_redirect_code_traces;
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EmbeddedVector<char, 128> filename_;
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE* file_;
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scope_depth_;
1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
157144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
1573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
157444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
157544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_ISOLATE_H_
1576