isolate.h revision bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8
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"
143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/base/accounting-allocator.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/builtins.h"
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/cancelable-task.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h"
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/date.h"
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h"
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/frames.h"
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/futex-emulation.h"
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h"
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h"
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hashmap.h"
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h"
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h"
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/optimizing-compile-dispatcher.h"
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h"
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/runtime-profiler.h"
313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/runtime/runtime.h"
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h"
3344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3444f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base {
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RandomNumberGenerator;
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass BasicBlockProfiler;
4344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper;
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallInterfaceDescriptorData;
4544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator;
4644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange;
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeStubDescriptor;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeTracer;
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache;
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CompilationStatistics;
5144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache;
5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters;
5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures;
5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler;
5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData;
5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer;
5744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement;
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalCallbackScope;
5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable;
6044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory;
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
1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define FOR_WITH_HANDLE_SCOPE(isolate, loop_var_type, init, loop_var,      \
1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              limit_check, increment, body)                \
1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  do {                                                                     \
1843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    loop_var_type init;                                                    \
1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    loop_var_type for_with_handle_limit = loop_var;                        \
1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Isolate* for_with_handle_isolate = isolate;                            \
1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    while (limit_check) {                                                  \
1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      for_with_handle_limit += 1024;                                       \
1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      HandleScope loop_scope(for_with_handle_isolate);                     \
1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      for (; limit_check && loop_var < for_with_handle_limit; increment) { \
1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        body                                                               \
1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }                                                                    \
1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }                                                                      \
1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } while (false)
19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier.
1978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId {
1988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
1998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Creates an invalid ThreadId.
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); }
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ThreadId& operator=(const ThreadId& other) {
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    base::NoBarrier_Store(&id_, base::NoBarrier_Load(&other.id_));
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return *this;
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns ThreadId for current thread.
2088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Current() { return ThreadId(GetCurrentThreadId()); }
2098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns invalid ThreadId (guaranteed not to be equal to any thread).
2118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Invalid() { return ThreadId(kInvalidId); }
2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Compares ThreadIds for equality.
2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool Equals(const ThreadId& other) const) {
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return base::NoBarrier_Load(&id_) == base::NoBarrier_Load(&other.id_);
2168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
2178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Checks whether this ThreadId refers to any thread.
2198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool IsValid() const) {
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return base::NoBarrier_Load(&id_) != kInvalidId;
2218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::GetCurrentThreadId).
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int ToInteger() const { return static_cast<int>(base::NoBarrier_Load(&id_)); }
2268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
2288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::TerminateExecution).
2298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId FromInteger(int id) { return ThreadId(id); }
2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kInvalidId = -1;
2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit ThreadId(int id) { base::NoBarrier_Store(&id_, id); }
2358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int AllocateThreadId();
2378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int GetCurrentThreadId();
2398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  base::Atomic32 id_;
2418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Atomic32 highest_thread_id_;
2438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class Isolate;
2458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
2468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ACCESSOR(type, name)                 \
249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline void set_##name(type v) { name##_ = v; }  \
250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline type name() const { return name##_; }
251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED {
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
2558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Does early low-level initialization that does not depend on the
2568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // isolate being present.
2578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadLocalTop();
2588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initialize the thread data.
26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Initialize();
26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the top C++ try catch handler or NULL if none are registered.
26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This method is not guaranteed to return an address that can be
26544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // used for comparison with addresses into the JS stack.  If such an
26644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // address is needed, use try_catch_handler_address.
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FIELD_ACCESSOR(v8::TryCatch*, try_catch_handler)
26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the address of the top C++ try catch handler or NULL if
27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // none are registered.
27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method always returns an address that can be compared to
27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // pointers into the JavaScript stack.  When running on actual
27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // hardware, try_catch_handler_address and TryCatchHandler return
27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the same pointer.  When running on a simulator with a separate JS
27644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // stack, try_catch_handler_address returns a JS stack address that
27744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // corresponds to the place on the JS stack where the C++ handler
27844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // would have been if the stack were not separate.
279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address try_catch_handler_address() {
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Address>(
281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::TryCatch::JSStackComparableAddress(try_catch_handler()));
28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
28344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Free();
28544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Isolate* isolate_;
28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The context where the current execution method is created and for variable
28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // lookups.
28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context_;
2908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadId thread_id_;
291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* pending_exception_;
292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Communication channel between Isolate::FindHandler and the CEntryStub.
294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Context* pending_handler_context_;
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Code* pending_handler_code_;
296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t pending_handler_offset_;
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address pending_handler_fp_;
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address pending_handler_sp_;
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Communication channel between Isolate::Throw and message consumers.
301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool rethrowing_message_;
30244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* pending_message_obj_;
303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Use a separate value for scheduled exceptions to preserve the
30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // invariants that hold about pending_exception.  We may want to
30644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // unify them later.
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* scheduled_exception_;
30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool external_caught_exception_;
30944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* save_context_;
31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
31144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Stack.
31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address c_entry_fp_;  // the frame pointer of the top c entry frame
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address handler_;     // try-blocks are chained through the stack
314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Address c_function_;  // C function that was called at c entry.
31544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Throwing an exception may cause a Promise rejection.  For this purpose
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // we keep track of a stack of nested promises and the corresponding
318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // try-catch handlers.
319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* promise_on_stack_;
320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR
32244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Simulator* simulator_;
32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address js_entry_sp_;  // the stack pointer of the bottom JS entry frame
326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the external callback we're currently in
327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalCallbackScope* external_callback_scope_;
32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StateTag current_vm_state_;
32944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Call back function to report unsafe JS accesses.
33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::FailedAccessCheckCallback failed_access_check_callback_;
33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
3348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void InitializeInternal();
3358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::TryCatch* try_catch_handler_;
33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
33844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V)                                         \
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(bool, simulator_initialized, false)                                        \
344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HashMap*, simulator_i_cache, NULL)                                         \
345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Redirection*, simulator_redirection, NULL)
34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V)
34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)                                       \
35644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CommentStatistic, paged_space_comments_statistics,                         \
357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      CommentStatistic::kMaxComments + 1)                                      \
358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int, code_kind_statistics, Code::NUMBER_OF_KINDS)
35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
36444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V)                                             \
36644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* SerializerDeserializer state. */                                          \
367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int32_t, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \
36844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, bad_char_shift_table, kUC16AlphabetSize)                              \
36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, good_suffix_shift_table, (kBMMaxShift + 1))                           \
37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, suffix_table, (kBMMaxShift + 1))                                      \
3713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(uint32_t, private_random_seed, 2)                                          \
37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
37344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef List<HeapObject*> DebugObjectCache;
37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_LIST(V)                                                   \
37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* Assembler state. */                                                       \
37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(FatalErrorCallback, exception_behavior, NULL)                              \
379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(LogEventCallback, event_logger, NULL)                                      \
380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, NULL)     \
38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* To distinguish the function templates, so that we can find them in the */ \
382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  /* function cache of the native context. */                                  \
38344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, next_serial_number, 0)                                                \
38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalReferenceRedirectorPointer*, external_reference_redirector, NULL)  \
38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* State for Relocatable. */                                                 \
38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Relocatable*, relocatable_top, NULL)                                       \
38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(DebugObjectCache*, string_stream_debug_object_cache, NULL)                 \
38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Object*, string_stream_current_security_token, NULL)                       \
38944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalReferenceTable*, external_reference_table, NULL)                   \
390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(HashMap*, external_reference_map, NULL)                                    \
391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(HashMap*, root_index_map, NULL)                                            \
392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int, pending_microtask_count, 0)                                           \
393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HStatistics*, hstatistics, NULL)                                           \
394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(CompilationStatistics*, turbo_statistics, NULL)                            \
395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(HTracer*, htracer, NULL)                                                   \
396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(CodeTracer*, code_tracer, NULL)                                            \
397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(bool, fp_stubs_generated, false)                                           \
398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu)                            \
399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  V(PromiseRejectCallback, promise_reject_callback, NULL)                      \
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  V(const v8::StartupData*, snapshot_blob, NULL)                               \
401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ISOLATE_INIT_SIMULATOR_LIST(V)
402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define THREAD_LOCAL_TOP_ACCESSOR(type, name)                        \
404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline void set_##name(type v) { thread_local_top_.name##_ = v; }  \
405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline type name() const { return thread_local_top_.name##_; }
406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THREAD_LOCAL_TOP_ADDRESS(type, name) \
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type* name##_address() { return &thread_local_top_.name##_; }
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate {
41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These forward declarations are required to make the friend declarations in
41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // PerIsolateThreadData work on some older versions of gcc.
41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable;
41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem;
41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~Isolate();
41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A thread has a PerIsolateThreadData instance for each isolate that it has
42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // entered. That instance is allocated when the isolate is initially entered
42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and reused on subsequent entries.
42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class PerIsolateThreadData {
42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData(Isolate* isolate, ThreadId thread_id)
42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : isolate_(isolate),
42644f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_id_(thread_id),
42744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          stack_limit_(0),
42844f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_state_(NULL),
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
43044f0eee88ff00398ff7f715fab053374d808c90dSteve Block          simulator_(NULL),
43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block          next_(NULL),
43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block          prev_(NULL) { }
434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ~PerIsolateThreadData();
43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate() const { return isolate_; }
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id() const { return thread_id_; }
437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(uintptr_t, stack_limit)
439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(ThreadState*, thread_state)
440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(Simulator*, simulator)
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    bool Matches(Isolate* isolate, ThreadId thread_id) const {
4468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      return isolate_ == isolate && thread_id_.Equals(thread_id);
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate_;
45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id_;
45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    uintptr_t stack_limit_;
45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadState* thread_state_;
45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Simulator* simulator_;
45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* next_;
46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* prev_;
46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class Isolate;
46344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class ThreadDataTable;
46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class EntryStackItem;
46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData);
46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  enum AddressId {
471589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address,
472589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM)
473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_ENUM
474589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    kIsolateAddressCount
47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void InitializeOncePerProcess();
478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
47944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the PerIsolateThreadData for the current thread (or NULL if one is
48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not currently set).
48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static PerIsolateThreadData* CurrentPerIsolateThreadData() {
48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return reinterpret_cast<PerIsolateThreadData*>(
483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetThreadLocal(per_isolate_thread_data_key_));
48444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
48644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the isolate inside which the current thread is running.
48744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  INLINE(static Isolate* Current()) {
488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1);
48944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate = reinterpret_cast<Isolate*>(
490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetExistingThreadLocal(isolate_key_));
491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate != NULL);
49244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return isolate;
49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
49444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
49569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Usually called by Init(), but can be called early e.g. to allow
49669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // testing components that require logging but not the whole
49769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // isolate.
49869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  //
49969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Safe to call more than once.
50069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeLoggingAndCounters();
50169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
50244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool Init(Deserializer* des);
50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // True if at least one thread Enter'ed this isolate.
50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsInUse() { return entry_stack_ != NULL; }
50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Destroys the non-default isolates.
50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Sets default isolate into "has_been_disposed" state rather then destroying,
50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for legacy API reasons.
51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TearDown();
51144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void GlobalTearDown();
51344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ClearSerializerData();
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Find the PerThread for this particular (isolate, thread) combination
517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // If one does not yet exist, return null.
518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PerIsolateThreadData* FindPerThreadDataForThisThread();
519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the PerThread for given (isolate, thread) combination
521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If one does not yet exist, return null.
522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id);
52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Discard the PerThread for this particular (isolate, thread) combination
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If one does not yet exist, no-op.
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DiscardPerThreadDataForThisThread();
527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store the pointer to the current isolate.
52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Used internally for V8 threads that do not execute JavaScript but still
53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // are part of the domain of an isolate (like the context switcher).
531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey isolate_key() {
53285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return isolate_key_;
53385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store process-wide thread IDs.
536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey thread_id_key() {
53785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return thread_id_key_;
53885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey per_isolate_thread_data_key();
54144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
54244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Mutex for serializing access to break control structures.
543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RecursiveMutex* break_access() { return &break_access_; }
54469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
54544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address get_address_from_id(AddressId id);
54644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to top context (where the current function object was created).
54844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context() { return thread_local_top_.context_; }
549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_context(Context* context);
55044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context** context_address() { return &thread_local_top_.context_; }
55144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(SaveContext*, save_context)
55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to current thread id.
555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(ThreadId, thread_id)
55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
55744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Interface to pending exception.
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Object* pending_exception();
559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_pending_exception(Object* exception_obj);
560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_pending_exception();
561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception)
563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_pending_exception();
565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context)
567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code)
568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset)
569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp)
570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp)
571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception)
573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::TryCatch* try_catch_handler() {
575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return thread_local_top_.try_catch_handler();
57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool* external_caught_exception_address() {
57844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.external_caught_exception_;
57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception)
582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_pending_message();
584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address pending_message_obj_address() {
585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_);
5868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Object* scheduled_exception();
589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_scheduled_exception();
590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_scheduled_exception();
59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsJavaScriptHandlerOnTop(Object* exception);
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsExternalHandlerOnTop(Object* exception);
59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_catchable_by_javascript(Object* exception);
596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JS execution stack (see frames.h).
59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address c_entry_fp(ThreadLocalTop* thread) {
59944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread->c_entry_fp_;
60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
60144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address handler(ThreadLocalTop* thread) { return thread->handler_; }
602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Address c_function() { return thread_local_top_.c_function_; }
60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* c_entry_fp_address() {
60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.c_entry_fp_;
60644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
60744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* handler_address() { return &thread_local_top_.handler_; }
608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Address* c_function_address() {
609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &thread_local_top_.c_function_;
610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
61144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Bottom JS entry.
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address js_entry_sp() {
614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return thread_local_top_.js_entry_sp_;
61544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* js_entry_sp_address() {
61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.js_entry_sp_;
61844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global object of the current context. It could be
6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a builtin object, or a JS global object.
622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Handle<JSGlobalObject> global_object();
62344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global proxy object of the current context.
625bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  inline Handle<JSObject> global_proxy();
62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); }
62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FreeThreadResources() { thread_local_top_.Free(); }
62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method is called by the api after operations that may throw
63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // exceptions.  If an exception was thrown and not handled by an external
63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // handler the exception is scheduled to be rethrown when we return to running
63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JavaScript code.  If an exception is scheduled true is returned.
63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool OptionalRescheduleException(bool is_bottom_call);
63544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Push and pop a promise and the current try-catch handler.
637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PushPromise(Handle<JSObject> promise, Handle<JSFunction> function);
638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void PopPromise();
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> GetPromiseOnStackOnThrow();
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  class ExceptionScope {
6428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   public:
643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Scope currently can only be used for regular exceptions,
644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // not termination exception.
645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inline explicit ExceptionScope(Isolate* isolate);
646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inline ~ExceptionScope();
6478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   private:
6498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Isolate* isolate_;
6508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Handle<Object> pending_exception_;
6518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  };
6528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetCaptureStackTraceForUncaughtExceptions(
65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      bool capture,
65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
65744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void SetAbortOnUncaughtExceptionCallback(
659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Isolate::AbortOnUncaughtExceptionCallback callback);
660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  enum PrintStackMode { kPrintStackConcise, kPrintStackVerbose };
66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintCurrentStackTrace(FILE* out);
663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintStack(StringStream* accumulator,
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  PrintStackMode mode = kPrintStackVerbose);
665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintStack(FILE* out, PrintStackMode mode = kPrintStackVerbose);
66644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> StackTraceString();
667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NO_INLINE(void PushStackTraceAndDie(unsigned int magic, void* ptr1,
668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      void* ptr2, unsigned int magic2));
66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSArray> CaptureCurrentStackTrace(
67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
67144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
6723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> CaptureSimpleStackTrace(Handle<JSReceiver> error_object,
673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Handle<Object> caller);
6743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  MaybeHandle<JSReceiver> CaptureAndSetDetailedStackTrace(
6753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Handle<JSReceiver> error_object);
6763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  MaybeHandle<JSReceiver> CaptureAndSetSimpleStackTrace(
6773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Handle<JSReceiver> error_object, Handle<Object> caller);
678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSArray> GetDetailedStackTrace(Handle<JSObject> error_object);
679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSArray> GetDetailedFromSimpleStackTrace(
680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Handle<JSObject> error_object);
6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns if the given context may access the given global object. If
68344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the result is false, the pending exception is guaranteed to be
68444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // set.
685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool MayAccess(Handle<Context> accessing_context, Handle<JSObject> receiver);
686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
68744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback);
688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ReportFailedAccessCheck(Handle<JSObject> receiver);
68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exception throwing support. The caller should use the result
691bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  // of Throw() as its return vaue.
692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* Throw(Object* exception, MessageLocation* location = NULL);
693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* ThrowIllegalOperation();
694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template <typename T>
696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception,
697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       MessageLocation* location = NULL) {
698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Throw(*exception, location);
699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MaybeHandle<T>();
700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Re-throw an exception.  This involves no error reporting since error
703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // reporting was handled when the exception was thrown originally.
704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* ReThrow(Object* exception);
705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Find the correct handler for the current pending exception. This also
707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // clears and returns the current pending exception.
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* UnwindAndFindHandler();
709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Tries to predict whether an exception will be caught. Note that this can
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // only produce an estimate, because it is undecidable whether a finally
712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // clause will consume or re-throw an exception. We conservatively assume any
713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // finally clause will behave as if the exception were consumed.
714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  enum CatchType { NOT_CAUGHT, CAUGHT_BY_JAVASCRIPT, CAUGHT_BY_EXTERNAL };
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CatchType PredictExceptionCatcher();
716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ScheduleThrow(Object* exception);
718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Re-set pending message, script and positions reported to the TryCatch
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // back to the TLS for re-use when rethrowing.
720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RestorePendingMessageFromTryCatch(v8::TryCatch* handler);
721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Un-schedule an exception that was caught by a TryCatch handler.
722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler);
72344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ReportPendingMessages();
724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return pending location if any or unfilled structure.
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MessageLocation GetMessageLocation();
72644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
72744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Promote a scheduled exception to pending. Asserts has_scheduled_exception.
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* PromoteScheduledException();
72944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
73044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Attempts to compute the current source location, storing the
73144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // result in the target out parameter.
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ComputeLocation(MessageLocation* target);
733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ComputeLocationFromException(MessageLocation* target,
734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Handle<Object> exception);
735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool ComputeLocationFromStackTrace(MessageLocation* target,
736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                     Handle<Object> exception);
737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSMessageObject> CreateMessage(Handle<Object> exception,
739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        MessageLocation* location);
74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Out of resource exception helpers.
742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* StackOverflow();
743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* TerminateExecution();
744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CancelTerminateExecution();
745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void RequestInterrupt(InterruptCallback callback, void* data);
747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void InvokeApiInterruptCallbacks();
74844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Administration
75044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v);
75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v, ThreadLocalTop* t);
75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* Iterate(ObjectVisitor* v, char* t);
75344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateThread(ThreadVisitor* v, char* t);
75444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Returns the current native context.
756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> native_context();
75744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns the native context of the calling JavaScript code.  That
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // is, the native context of the top-most JavaScript frame.
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> GetCallingNativeContext();
76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RegisterTryCatchHandler(v8::TryCatch* that);
76344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UnregisterTryCatchHandler(v8::TryCatch* that);
76444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* ArchiveThread(char* to);
76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* RestoreThread(char* from);
76744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const char* const kStackOverflowMessage;
76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kUC16AlphabetSize = 256;  // See StringSearchBase.
77144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kBMMaxShift = 250;        // See StringSearchBase.
77244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
77344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Accessors.
77444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue)                       \
77544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type name() const {                                            \
776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
77744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return name##_;                                                     \
77844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }                                                                     \
77944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void set_##name(type value) {                                  \
780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    name##_ = value;                                                    \
78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_ACCESSOR)
78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR
78544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length)                       \
78744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type* name() {                                                 \
788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &(name##_)[0];                                               \
79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR)
79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR
79344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \
795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Handle<type> name();                            \
796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_##name(type* value);
797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSOR)
798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSOR
79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
80044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper() { return bootstrapper_; }
80169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Counters* counters() {
80269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
80369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(counters_ != NULL);
80569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return counters_;
80669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
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  KeyedLookupCache* keyed_lookup_cache() {
83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return keyed_lookup_cache_;
83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache() {
83544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return context_slot_cache_;
83644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache() {
83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return descriptor_lookup_cache_;
84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
84144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScopeData* handle_scope_data() { return &handle_scope_data_; }
843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
84444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer() {
845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(handle_scope_implementer_);
84644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return handle_scope_implementer_;
84744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Zone* runtime_zone() { return &runtime_zone_; }
849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone* interface_descriptor_zone() { return &interface_descriptor_zone_; }
85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache() {
8528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return unicode_cache_;
85344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache() {
8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return inner_pointer_to_code_cache_;
8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
85944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles() { return global_handles_; }
86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles() { return eternal_handles_; }
86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ThreadManager* thread_manager() { return thread_manager_; }
86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() {
86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_uncanonicalize_;
86744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() {
87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_canonrange_;
87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState* runtime_state() { return &runtime_state_; }
87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins* builtins() { return &builtins_; }
87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void NotifyExtensionInstalled() {
8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    has_installed_extensions_ = true;
8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_installed_extensions() { return has_installed_extensions_; }
8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize() {
88544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &regexp_macro_assembler_canonicalize_;
88644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
88744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack() { return regexp_stack_; }
88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      interp_canonicalize_mapping() {
892109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &regexp_macro_assembler_canonicalize_;
89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Debug* debug() { return debug_; }
89644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CpuProfiler* cpu_profiler() const { return cpu_profiler_; }
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapProfiler* heap_profiler() const { return heap_profiler_; }
899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo* heap_histograms() { return heap_histograms_; }
90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation* js_spill_information() {
90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &js_spill_information_;
90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory() { return reinterpret_cast<Factory*>(this); }
90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kJSRegexpStaticOffsetsVectorSize = 128;
91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(ExternalCallbackScope*, external_callback_scope)
913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(StateTag, current_vm_state)
915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetData(uint32_t slot, void* data) {
917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(slot < Internals::kNumIsolateDataSlots);
918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    embedder_data_[slot] = data;
91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* GetData(uint32_t slot) {
921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(slot < Internals::kNumIsolateDataSlots);
922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return embedder_data_[slot];
92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool serializer_enabled() const { return serializer_enabled_; }
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool snapshot_available() const {
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return snapshot_blob_ != NULL && snapshot_blob_->raw_size != 0;
928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
92944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDead() { return has_fatal_error_; }
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SignalFatalError() { has_fatal_error_ = true; }
93244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool use_crankshaft() const;
934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool initialized_from_snapshot() { return initialized_from_snapshot_; }
936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double time_millis_since_init() {
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return heap_.MonotonicallyIncreasingTimeInMs() - time_millis_at_init_;
93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DateCache* date_cache() {
942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return date_cache_;
94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_date_cache(DateCache* date_cache) {
946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (date_cache != date_cache_) {
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      delete date_cache_;
94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    date_cache_ = date_cache;
95044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
95144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Map* get_initial_js_array_map(ElementsKind kind);
953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kArrayProtectorValid = 1;
955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kArrayProtectorInvalid = 0;
956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsFastArrayConstructorPrototypeChainIntact();
9583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  inline bool IsArraySpeciesLookupChainIntact();
959bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  inline bool IsHasInstanceLookupChainIntact();
960bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsIsConcatSpreadableLookupChainIntact();
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // On intent to set an element in object, make sure that appropriate
963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // notifications occur if the set is on the elements of the array or
964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // object prototype. Also ensure that changes to prototype chain between
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Array and Object fire notifications.
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetElement(Handle<JSObject> object);
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetLength(Handle<JSObject> object) {
968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetPrototype(Handle<JSObject> object) {
971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnNormalizeElements(Handle<JSObject> object) {
974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
976109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void InvalidateArraySpeciesProtector();
977bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void InvalidateHasInstanceProtector();
978bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void InvalidateIsConcatSpreadableProtector();
979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns true if array is the initial array prototype in any native context.
981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsAnyInitialArrayPrototype(Handle<JSArray> array);
982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptorData* call_descriptor_data(int index);
984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void IterateDeferredHandles(ObjectVisitor* visitor);
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void LinkDeferredHandles(DeferredHandles* deferred_handles);
987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UnlinkDeferredHandles(DeferredHandles* deferred_handles);
988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDeferredHandle(Object** location);
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // DEBUG
992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool concurrent_recompilation_enabled() {
994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Thread is only available with flag enabled.
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(optimizing_compile_dispatcher_ == NULL ||
996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           FLAG_concurrent_recompilation);
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_ != NULL;
9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OptimizingCompileDispatcher* optimizing_compile_dispatcher() {
1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_;
10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int id() const { return static_cast<int>(id_); }
1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStatistics* GetHStatistics();
1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CompilationStatistics* GetTurboStatistics();
1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HTracer* GetHTracer();
1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeTracer* GetCodeTracer();
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DumpAndResetCompilationStats();
1012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionEntryHook function_entry_hook() { return function_entry_hook_; }
1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_function_entry_hook(FunctionEntryHook function_entry_hook) {
1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    function_entry_hook_ = function_entry_hook;
10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* stress_deopt_count_address() { return &stress_deopt_count_; }
1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void* virtual_handler_register_address() {
1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return &virtual_handler_register_;
1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void* virtual_slot_register_address() { return &virtual_slot_register_; }
1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  base::RandomNumberGenerator* random_number_generator();
1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Given an address occupied by a live code object, return that object.
1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* FindCodeObject(Address a);
1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int NextOptimizationId() {
1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int id = next_optimization_id_++;
1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!Smi::IsValid(next_optimization_id_)) {
1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      next_optimization_id_ = 0;
10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return id;
10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void IncrementJsCallsFromApiCounter() { ++js_calls_from_api_counter_; }
1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned int js_calls_from_api_counter() {
1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return js_calls_from_api_counter_;
1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Get (and lazily initialize) the registry for per-isolate symbols.
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> GetSymbolRegistry();
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddCallCompletedCallback(CallCompletedCallback callback);
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RemoveCallCompletedCallback(CallCompletedCallback callback);
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void FireCallCompletedCallback();
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1052109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1053109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1054109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void FireBeforeCallEnteredCallback();
1055109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
10563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void AddMicrotasksCompletedCallback(MicrotasksCompletedCallback callback);
10573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void RemoveMicrotasksCompletedCallback(MicrotasksCompletedCallback callback);
10583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void FireMicrotasksCompletedCallback();
10593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void SetPromiseRejectCallback(PromiseRejectCallback callback);
1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void ReportPromiseReject(Handle<JSObject> promise, Handle<Object> value,
1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           v8::PromiseRejectEvent event);
1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void EnqueueMicrotask(Handle<Object> microtask);
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RunMicrotasks();
1066bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsRunningMicrotasks() const { return is_running_microtasks_; }
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback);
1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CountUsage(v8::Isolate::UseCounterFeature feature);
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* GetOrCreateBasicBlockProfiler();
1072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* basic_block_profiler() { return basic_block_profiler_; }
1073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::string GetTurboCfgFileName();
1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int GetNextUniqueSharedFunctionInfoId() { return next_unique_sfi_id_++; }
1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Support for dynamically disabling tail call elimination.
10813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Address is_tail_call_elimination_enabled_address() {
10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return reinterpret_cast<Address>(&is_tail_call_elimination_enabled_);
10833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
10843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool is_tail_call_elimination_enabled() const {
10853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return is_tail_call_elimination_enabled_;
10863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
10873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SetTailCallEliminationEnabled(bool enabled);
1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AddDetachedContext(Handle<Context> context);
1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CheckDetachedContextsAfterGC();
1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  List<Object*>* partial_snapshot_cache() { return &partial_snapshot_cache_; }
1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void set_array_buffer_allocator(v8::ArrayBuffer::Allocator* allocator) {
1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    array_buffer_allocator_ = allocator;
1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::ArrayBuffer::Allocator* array_buffer_allocator() const {
1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return array_buffer_allocator_;
1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FutexWaitListNode* futex_wait_list_node() { return &futex_wait_list_node_; }
1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CancelableTaskManager* cancelable_task_manager() {
1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return cancelable_task_manager_;
1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Interpreter* interpreter() const { return interpreter_; }
1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  base::AccountingAllocator* allocator() { return &allocator_; }
11103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1111bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsInAnyContext(Object* object, uint32_t index);
1112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
1113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected:
1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit Isolate(bool enable_serializer);
1115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsArrayOrObjectPrototype(Object* object);
111644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
11183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct GlobalState;
11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct InitializeGlobalState;
1120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSObject> SetUpSubregistry(Handle<JSObject> registry, Handle<Map> map,
1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    const char* name);
11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // These fields are accessed through the API, offsets must be kept in sync
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // with v8::internal::Internals (in include/v8.h) constants. This is also
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // verified in Isolate::Init() using runtime checks.
1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* embedder_data_[Internals::kNumIsolateDataSlots];
1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap heap_;
1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The per-process lock should be acquired before the ThreadDataTable is
113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // modified.
113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable {
113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadDataTable();
113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ~ThreadDataTable();
113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id);
113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Insert(PerIsolateThreadData* data);
113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Remove(PerIsolateThreadData* data);
11393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    void RemoveAllThreads(Isolate* isolate);
114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* list_;
114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These items form a stack synchronously with threads Enter'ing and Exit'ing
114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the Isolate. The top of the stack points to a thread which is currently
114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // running the Isolate. When the stack is empty, the Isolate is considered
114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not entered by any thread and can be Disposed.
114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If the same thread enters the Isolate more then once, the entry_count_
115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is incremented rather then a new item pushed to the stack.
115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem {
115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
115344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem(PerIsolateThreadData* previous_thread_data,
115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   Isolate* previous_isolate,
115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   EntryStackItem* previous_item)
115644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : entry_count(1),
115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_thread_data(previous_thread_data),
115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_isolate(previous_isolate),
115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_item(previous_item) { }
116044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
116144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    int entry_count;
116244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* previous_thread_data;
116344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* previous_isolate;
116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem* previous_item;
116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   private:
116744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(EntryStackItem);
116844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
116944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::LazyMutex thread_data_table_mutex_;
117185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey per_isolate_thread_data_key_;
1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey isolate_key_;
1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey thread_id_key_;
117585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static ThreadDataTable* thread_data_table_;
117685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A global counter for all generated Isolates, might overflow.
1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Atomic32 isolate_counter_;
1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG
1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static base::Atomic32 isolate_key_created_;
1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Deinit();
118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void SetIsolateThreadLocals(Isolate* isolate,
118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     PerIsolateThreadData* data);
118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Find the PerThread for this particular (isolate, thread) combination.
119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If one does not yet exist, allocate a new one.
119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread();
119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initializes the current thread to run this Isolate.
119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Enter();
119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exits the current thread. The previosuly entered Isolate is restored
119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for the thread.
120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Exit();
120344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void InitializeThreadLocal();
120544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
120644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactPrologue(bool is_compacting,
120744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
120844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactEpilogue(bool is_compacting,
120944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
121144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FillCache();
121244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Propagate pending exception message to the v8::TryCatch.
1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If there is no external try-catch or message was successfully propagated,
1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // then return true.
1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool PropagatePendingExceptionToExternalTryCatch();
121769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Remove per-frame stored materialized objects when we are unwinding
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the frame.
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void RemoveMaterializedObjectsOnUnwind(StackFrame* frame);
12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void RunMicrotasksInternal();
12233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::Atomic32 id_;
1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EntryStackItem* entry_stack_;
122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_nesting_level_;
122744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringStream* incomplete_message_;
1228589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  Address isolate_addresses_[kIsolateAddressCount + 1];  // NOLINT
122944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper_;
123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler_;
123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache_;
123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Counters* counters_;
1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RecursiveMutex break_access_;
123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Logger* logger_;
123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard stack_guard_;
123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StatsTable* stats_table_;
123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StubCache* stub_cache_;
1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeAgingHelper* code_aging_helper_;
123944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data_;
1240109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool deoptimizer_lazy_throw_;
1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaterializedObjectStore* materialized_object_store_;
124244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop thread_local_top_;
124344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool capture_stack_trace_for_uncaught_exceptions_;
124444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_for_uncaught_exceptions_frame_limit_;
124544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_;
124644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  KeyedLookupCache* keyed_lookup_cache_;
124744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache_;
124844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache_;
1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScopeData handle_scope_data_;
125044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer_;
12518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache_;
12523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  base::AccountingAllocator allocator_;
1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Zone runtime_zone_;
1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Zone interface_descriptor_zone_;
12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache_;
125644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles_;
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles_;
125844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadManager* thread_manager_;
125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState runtime_state_;
126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins builtins_;
12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_installed_extensions_;
126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_;
126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_;
126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>
126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize_;
126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack_;
12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DateCache* date_cache_;
1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptorData* call_descriptor_data_;
1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RandomNumberGenerator* random_number_generator_;
127044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Whether the isolate has been created for snapshotting.
1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool serializer_enabled_;
1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if fatal error has been signaled for this isolate.
1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_fatal_error_;
1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if this isolate was initialized from a snapshot.
1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool initialized_from_snapshot_;
12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // True if ES2015 tail call elimination feature is enabled.
12813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool is_tail_call_elimination_enabled_;
12823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Time stamp at initialization.
12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  double time_millis_at_init_;
12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
128644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
128744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A static array of histogram info for each type.
128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo heap_histograms_[LAST_TYPE + 1];
128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation js_spill_information_;
129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Debug* debug_;
1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CpuProfiler* cpu_profiler_;
1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapProfiler* heap_profiler_;
1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionEntryHook function_entry_hook_;
129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Interpreter* interpreter_;
1298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef std::pair<InterruptCallback, void*> InterruptEntry;
1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::queue<InterruptEntry> api_interrupts_queue_;
1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
130244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue)                         \
130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_;
130444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE)
130544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE
130644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
130744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length)                         \
130844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_[length];
130944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE)
131044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE
131144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
131244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
131344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This class is huge and has a number of fields controlled by
131444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // preprocessor defines. Make sure the offsets of these fields agree
131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // between compilation units.
131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored)                              \
131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const intptr_t name##_debug_offset_;
131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET
132144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
132244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DeferredHandles* deferred_handles_head_;
1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OptimizingCompileDispatcher* optimizing_compile_dispatcher_;
1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Counts deopt points if deopt_every_n_times is enabled.
1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  unsigned int stress_deopt_count_;
1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address virtual_handler_register_;
1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address virtual_slot_register_;
1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int next_optimization_id_;
1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Counts javascript calls from the API. Wraps around on overflow.
1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  unsigned int js_calls_from_api_counter_;
1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int next_unique_sfi_id_;
1339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1341109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // List of callbacks before a Call starts execution.
1342109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  List<BeforeCallEnteredCallback> before_call_entered_callbacks_;
1343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // List of callbacks when a Call completes.
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  List<CallCompletedCallback> call_completed_callbacks_;
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // List of callbacks after microtasks were run.
13483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  List<MicrotasksCompletedCallback> microtasks_completed_callbacks_;
1349bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool is_running_microtasks_;
13503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::Isolate::UseCounterCallback use_counter_callback_;
1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* basic_block_profiler_;
1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  List<Object*> partial_snapshot_cache_;
1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::ArrayBuffer::Allocator* array_buffer_allocator_;
1357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FutexWaitListNode futex_wait_list_node_;
1359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CancelableTaskManager* cancelable_task_manager_;
1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Isolate::AbortOnUncaughtExceptionCallback
1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      abort_on_uncaught_exception_callback_;
1364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class ExecutionAccess;
1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HandleScopeImplementer;
1367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend class OptimizingCompileDispatcher;
1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class SweeperThread;
1369257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class ThreadManager;
1370257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class Simulator;
1371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class StackGuard;
13728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class ThreadId;
137344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Isolate;
137444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Locker;
1375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class v8::Unlocker;
1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend v8::StartupData v8::V8::CreateSnapshotDataBlob(const char*);
13773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  friend v8::StartupData v8::V8::WarmUpSnapshotDataBlob(v8::StartupData,
13783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                        const char*);
137944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(Isolate);
138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
138244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ACCESSOR
1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef THREAD_LOCAL_TOP_ACCESSOR
1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack {
1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PromiseOnStack(Handle<JSFunction> function, Handle<JSObject> promise,
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 PromiseOnStack* prev)
1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      : function_(function), promise_(promise), prev_(prev) {}
1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function() { return function_; }
1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> promise() { return promise_; }
1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* prev() { return prev_; }
1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSFunction> function_;
1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> promise_;
1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* prev_;
1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
140444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the
140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these
140644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details.
140744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED {
140844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit SaveContext(Isolate* isolate);
1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ~SaveContext();
141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context() { return context_; }
141344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev() { return prev_; }
141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns true if this save context is below a given JavaScript frame.
14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsBelowFrame(JavaScriptFrame* frame) {
14173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp());
141844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
141944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
142244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
142344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev_;
14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address c_entry_fp_;
142544f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
142644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
142844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED {
142944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
143044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit AssertNoContextChange(Isolate* isolate);
143244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~AssertNoContextChange() {
1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate_->context() == *context_);
143444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
143544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
143644f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
143844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
143944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
144044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit AssertNoContextChange(Isolate* isolate) { }
144244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
144344f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
144444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
144644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED {
144744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
144844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) {
144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Lock(isolate);
145044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~ExecutionAccess() { Unlock(isolate_); }
145244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void Lock(Isolate* isolate) { isolate->break_access()->Lock(); }
1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void Unlock(Isolate* isolate) { isolate->break_access()->Unlock(); }
145544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
145644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool TryLock(Isolate* isolate) {
1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return isolate->break_access()->TryLock();
145844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
145944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
146044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
146144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
146244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
146344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
146444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for checking for stack-overflows.
146644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED {
146744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
146844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { }
146944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use this to check for stack-overflows in C++ code.
1471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasOverflowed() const {
147244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StackGuard* stack_guard = isolate_->stack_guard();
1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return GetCurrentStackPosition() < stack_guard->real_climit();
147444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Use this to check for interrupt request in C++ code.
1477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InterruptRequested() {
1478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StackGuard* stack_guard = isolate_->stack_guard();
1479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return GetCurrentStackPosition() < stack_guard->climit();
1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use this to check for stack-overflow when entering runtime from JS code.
1483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool JsHasOverflowed(uintptr_t gap = 0) const;
1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
148544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
148644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
148744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
148844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1489bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define STACK_CHECK(isolate, result_value)               \
1490bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  do {                                                   \
1491bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    StackLimitCheck stack_check(isolate);                \
1492bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    if (stack_check.HasOverflowed()) {                   \
1493bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      isolate->Throw(*isolate->factory()->NewRangeError( \
1494bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch          MessageTemplate::kStackOverflow));             \
1495bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      return result_value;                               \
1496bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    }                                                    \
1497bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } while (false)
149844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
149944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost
150044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any
150144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into
150244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account.
150344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED {
150444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PostponeInterruptsScope(Isolate* isolate,
1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          int intercept_mask = StackGuard::ALL_INTERRUPTS)
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : stack_guard_(isolate->stack_guard()),
1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        intercept_mask_(intercept_mask),
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        intercepted_flags_(0) {
1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stack_guard_->PushPostponeInterruptsScope(this);
151144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
151244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
151344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~PostponeInterruptsScope() {
1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stack_guard_->PopPostponeInterruptsScope();
151544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the bottom-most scope that intercepts this interrupt.
1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return whether the interrupt has been intercepted.
1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool Intercept(StackGuard::InterruptFlag flag);
1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
152144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
152244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard_;
1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int intercept_mask_;
1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int intercepted_flags_;
1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PostponeInterruptsScope* prev_;
1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class StackGuard;
152844f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
152944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
153044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CodeTracer final : public Malloced {
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit CodeTracer(int isolate_id)
1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : file_(NULL),
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        scope_depth_(0) {
1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      file_ = stdout;
1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
154044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_redirect_code_traces_to == NULL) {
1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SNPrintF(filename_,
1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               "code-%d-%d.asm",
1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               base::OS::GetCurrentProcessId(),
1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               isolate_id);
1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length());
1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
154944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WriteChars(filename_.start(), "", 0, false);
1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
155244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class Scope {
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); }
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ~Scope() { tracer_->CloseFile();  }
155744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FILE* file() const { return tracer_->file(); }
1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   private:
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CodeTracer* tracer_;
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void OpenFile() {
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (file_ == NULL) {
1570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      file_ = base::OS::FOpen(filename_.start(), "ab");
1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    scope_depth_++;
1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
157544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CloseFile() {
1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (--scope_depth_ == 0) {
1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      fclose(file_);
1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      file_ = NULL;
1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE* file() const { return file_; }
1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool ShouldRedirect() {
1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return FLAG_redirect_code_traces;
1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EmbeddedVector<char, 128> filename_;
1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE* file_;
1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scope_depth_;
1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
159844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
1600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
160144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
160244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_ISOLATE_H_
1603