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
813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include <memory>
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <queue>
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8-debug.h"
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h"
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h"
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/builtins/builtins.h"
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h"
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/date.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/frames.h"
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/futex-emulation.h"
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h"
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h"
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h"
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h"
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h"
253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/runtime/runtime.h"
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h"
2744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2844f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base {
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RandomNumberGenerator;
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
3444f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
3544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass AccessCompilerData;
37c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass AddressToIndexHashMap;
3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass AstStringConstants;
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass BasicBlockProfiler;
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper;
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CancelableTaskManager;
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallInterfaceDescriptorData;
4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass CodeAgingHelper;
4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass CodeEventDispatcher;
4544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator;
4644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange;
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeStubDescriptor;
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeTracer;
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache;
5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass CompilerDispatcher;
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CompilationStatistics;
5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache;
5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters;
5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures;
5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler;
5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData;
57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass DescriptorLookupCache;
5844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer;
5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement;
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalCallbackScope;
6144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable;
6244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory;
6344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HandleScopeImplementer;
64c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass HeapObjectToIndexHashMap;
6544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapProfiler;
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStatistics;
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTracer;
6844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass InlineRuntimeFunctionsTable;
693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass InnerPointerToCodeCache;
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Logger;
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MaterializedObjectStore;
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass OptimizingCompileDispatcher;
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpStack;
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass RuntimeProfiler;
7544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext;
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StatsTable;
7744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StringTracker;
7844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StubCache;
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SweeperThread;
8044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadManager;
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadState;
8244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadVisitor;  // Defined in v8threads.h
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UnicodeCache;
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <StateTag Tag> class VMState;
8544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// 'void function pointer', used to roundtrip the
8744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// ExternalReference::ExternalReferenceRedirector since we can not include
8844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// assembler.h, where it is defined, here.
8944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef void* ExternalReferenceRedirectorPointer();
9044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Debug;
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack;
9444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Redirection;
9544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Simulator;
9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter {
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Interpreter;
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate)    \
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  do {                                                    \
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Isolate* __isolate__ = (isolate);                     \
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (__isolate__->has_scheduled_exception()) {         \
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return __isolate__->PromoteScheduledException();    \
1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                     \
1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
10844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Macros for MaybeHandle.
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, value) \
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  do {                                                      \
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Isolate* __isolate__ = (isolate);                       \
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (__isolate__->has_scheduled_exception()) {           \
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      __isolate__->PromoteScheduledException();             \
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return value;                                         \
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }                                                       \
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } while (false)
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, T) \
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, MaybeHandle<T>())
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define RETURN_RESULT_OR_FAILURE(isolate, call)     \
12413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  do {                                              \
12513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Handle<Object> __result__;                      \
12613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* __isolate__ = (isolate);               \
12713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    if (!(call).ToHandle(&__result__)) {            \
12813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      DCHECK(__isolate__->has_pending_exception()); \
12913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      return __isolate__->heap()->exception();      \
13013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }                                               \
13113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return *__result__;                             \
13213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } while (false)
13313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value)  \
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  do {                                                               \
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!(call).ToHandle(&dst)) {                                    \
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK((isolate)->has_pending_exception());                    \
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return value;                                                  \
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }                                                                \
1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)          \
14313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  do {                                                                  \
14413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* __isolate__ = (isolate);                                   \
14513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    ASSIGN_RETURN_ON_EXCEPTION_VALUE(__isolate__, dst, call,            \
14613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                     __isolate__->heap()->exception()); \
14713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } while (false)
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call, T)  \
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, MaybeHandle<T>())
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define THROW_NEW_ERROR(isolate, call, T)                       \
15313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  do {                                                          \
15413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* __isolate__ = (isolate);                           \
15513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return __isolate__->Throw<T>(__isolate__->factory()->call); \
1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
15813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call)         \
15913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  do {                                                        \
16013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* __isolate__ = (isolate);                         \
16113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return __isolate__->Throw(*__isolate__->factory()->call); \
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } while (false)
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION_VALUE(isolate, call, value)            \
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  do {                                                             \
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if ((call).is_null()) {                                        \
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      DCHECK((isolate)->has_pending_exception());                  \
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return value;                                                \
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }                                                              \
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  } while (false)
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
17213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define RETURN_FAILURE_ON_EXCEPTION(isolate, call)               \
17313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  do {                                                           \
17413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    Isolate* __isolate__ = (isolate);                            \
17513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    RETURN_ON_EXCEPTION_VALUE(__isolate__, call,                 \
17613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                              __isolate__->heap()->exception()); \
17713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  } while (false);
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION(isolate, call, T)  \
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  RETURN_ON_EXCEPTION_VALUE(isolate, call, MaybeHandle<T>())
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
183589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define FOR_EACH_ISOLATE_ADDRESS_NAME(C)                \
184589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(Handler, handler)                                   \
185589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(CEntryFP, c_entry_fp)                               \
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  C(CFunction, c_function)                              \
187589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(Context, context)                                   \
188589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(PendingException, pending_exception)                \
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerContext, pending_handler_context)     \
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerCode, pending_handler_code)           \
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerOffset, pending_handler_offset)       \
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerFP, pending_handler_fp)               \
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  C(PendingHandlerSP, pending_handler_sp)               \
194589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(ExternalCaughtException, external_caught_exception) \
195589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(JSEntrySP, js_entry_sp)
19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define FOR_WITH_HANDLE_SCOPE(isolate, loop_var_type, init, loop_var,      \
1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              limit_check, increment, body)                \
1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  do {                                                                     \
2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    loop_var_type init;                                                    \
2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    loop_var_type for_with_handle_limit = loop_var;                        \
2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Isolate* for_with_handle_isolate = isolate;                            \
2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    while (limit_check) {                                                  \
2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      for_with_handle_limit += 1024;                                       \
2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      HandleScope loop_scope(for_with_handle_isolate);                     \
2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      for (; limit_check && loop_var < for_with_handle_limit; increment) { \
2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        body                                                               \
2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }                                                                    \
2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }                                                                      \
2103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } while (false)
21144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier.
2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId {
2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
2158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Creates an invalid ThreadId.
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); }
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ThreadId& operator=(const ThreadId& other) {
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    base::NoBarrier_Store(&id_, base::NoBarrier_Load(&other.id_));
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return *this;
221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns ThreadId for current thread.
2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Current() { return ThreadId(GetCurrentThreadId()); }
2258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns invalid ThreadId (guaranteed not to be equal to any thread).
2278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Invalid() { return ThreadId(kInvalidId); }
2288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Compares ThreadIds for equality.
2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool Equals(const ThreadId& other) const) {
231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return base::NoBarrier_Load(&id_) == base::NoBarrier_Load(&other.id_);
2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Checks whether this ThreadId refers to any thread.
2358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool IsValid() const) {
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return base::NoBarrier_Load(&id_) != kInvalidId;
2378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
2388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
2408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::GetCurrentThreadId).
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int ToInteger() const { return static_cast<int>(base::NoBarrier_Load(&id_)); }
2428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
2448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::TerminateExecution).
2458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId FromInteger(int id) { return ThreadId(id); }
2468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
2488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kInvalidId = -1;
2498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit ThreadId(int id) { base::NoBarrier_Store(&id_, id); }
2518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int AllocateThreadId();
2538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V8_EXPORT_PRIVATE static int GetCurrentThreadId();
2558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  base::Atomic32 id_;
2578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Atomic32 highest_thread_id_;
2598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class Isolate;
2618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
2628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
2638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ACCESSOR(type, name)                 \
265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline void set_##name(type v) { name##_ = v; }  \
266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline type name() const { return name##_; }
267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED {
27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
2718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Does early low-level initialization that does not depend on the
2728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // isolate being present.
2738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadLocalTop();
2748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initialize the thread data.
27644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Initialize();
27744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
27844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the top C++ try catch handler or NULL if none are registered.
27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // This method is not guaranteed to return an address that can be
28144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // used for comparison with addresses into the JS stack.  If such an
28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // address is needed, use try_catch_handler_address.
283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FIELD_ACCESSOR(v8::TryCatch*, try_catch_handler)
28444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
28544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the address of the top C++ try catch handler or NULL if
28644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // none are registered.
28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method always returns an address that can be compared to
28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // pointers into the JavaScript stack.  When running on actual
29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // hardware, try_catch_handler_address and TryCatchHandler return
29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the same pointer.  When running on a simulator with a separate JS
29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // stack, try_catch_handler_address returns a JS stack address that
29344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // corresponds to the place on the JS stack where the C++ handler
29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // would have been if the stack were not separate.
295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address try_catch_handler_address() {
296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Address>(
297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        v8::TryCatch::JSStackComparableAddress(try_catch_handler()));
29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
29944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void Free();
30144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Isolate* isolate_;
30344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The context where the current execution method is created and for variable
30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // lookups.
30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context_;
3068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadId thread_id_;
307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* pending_exception_;
308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Communication channel between Isolate::FindHandler and the CEntryStub.
310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Context* pending_handler_context_;
311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Code* pending_handler_code_;
312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  intptr_t pending_handler_offset_;
313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address pending_handler_fp_;
314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address pending_handler_sp_;
315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Communication channel between Isolate::Throw and message consumers.
317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool rethrowing_message_;
31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* pending_message_obj_;
319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Use a separate value for scheduled exceptions to preserve the
32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // invariants that hold about pending_exception.  We may want to
32244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // unify them later.
323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* scheduled_exception_;
32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool external_caught_exception_;
32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* save_context_;
32644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Stack.
32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address c_entry_fp_;  // the frame pointer of the top c entry frame
329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Address handler_;     // try-blocks are chained through the stack
330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Address c_function_;  // C function that was called at c entry.
33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Throwing an exception may cause a Promise rejection.  For this purpose
333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // we keep track of a stack of nested promises and the corresponding
334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // try-catch handlers.
335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* promise_on_stack_;
336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR
33844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Simulator* simulator_;
33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
34044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address js_entry_sp_;  // the stack pointer of the bottom JS entry frame
342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // the external callback we're currently in
343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ExternalCallbackScope* external_callback_scope_;
34444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StateTag current_vm_state_;
34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Call back function to report unsafe JS accesses.
34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::FailedAccessCheckCallback failed_access_check_callback_;
34844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
3508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void InitializeInternal();
3518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::TryCatch* try_catch_handler_;
35344f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
35744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
358f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V)                    \
359f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(bool, simulator_initialized, false)                   \
360f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V(base::CustomMatcherHashMap*, simulator_i_cache, NULL) \
361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(Redirection*, simulator_redirection, NULL)
36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V)
36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
36744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)               \
37213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(CommentStatistic, paged_space_comments_statistics, \
37313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CommentStatistic::kMaxComments + 1)                \
37413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(int, code_kind_statistics, AbstractCode::NUMBER_OF_KINDS)
37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
37944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
38044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V)                                             \
38244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* SerializerDeserializer state. */                                          \
383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  V(int32_t, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \
38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, bad_char_shift_table, kUC16AlphabetSize)                              \
38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, good_suffix_shift_table, (kBMMaxShift + 1))                           \
38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, suffix_table, (kBMMaxShift + 1))                                      \
38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef List<HeapObject*> DebugObjectCache;
39044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
39113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ISOLATE_INIT_LIST(V)                                                  \
39213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* Assembler state. */                                                      \
39313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(FatalErrorCallback, exception_behavior, nullptr)                          \
394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(OOMErrorCallback, oom_behavior, nullptr)                                  \
39513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(LogEventCallback, event_logger, nullptr)                                  \
39613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, nullptr) \
39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(AllowWasmCompileCallback, allow_wasm_compile_callback, nullptr)           \
39862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(AllowWasmInstantiateCallback, allow_wasm_instantiate_callback, nullptr)   \
39913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ExternalReferenceRedirectorPointer*, external_reference_redirector,       \
40013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    nullptr)                                                                  \
40113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* State for Relocatable. */                                                \
40213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(Relocatable*, relocatable_top, nullptr)                                   \
40313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(DebugObjectCache*, string_stream_debug_object_cache, nullptr)             \
40413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(Object*, string_stream_current_security_token, nullptr)                   \
40513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(ExternalReferenceTable*, external_reference_table, nullptr)               \
40613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(intptr_t*, api_external_references, nullptr)                              \
407c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(AddressToIndexHashMap*, external_reference_map, nullptr)                  \
408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V(HeapObjectToIndexHashMap*, root_index_map, nullptr)                       \
40913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(int, pending_microtask_count, 0)                                          \
41013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(HStatistics*, hstatistics, nullptr)                                       \
41113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(CompilationStatistics*, turbo_statistics, nullptr)                        \
41213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(HTracer*, htracer, nullptr)                                               \
41313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(CodeTracer*, code_tracer, nullptr)                                        \
41413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu)                           \
41513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(PromiseRejectCallback, promise_reject_callback, nullptr)                  \
41613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(const v8::StartupData*, snapshot_blob, nullptr)                           \
41713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(int, code_and_metadata_size, 0)                                           \
41813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(int, bytecode_and_metadata_size, 0)                                       \
41913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  /* true if being profiled. Causes collection of extra compile info. */      \
42013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  V(bool, is_profiling, false)                                                \
421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  /* true if a trace is being formatted through Error.prepareStackTrace. */   \
422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  V(bool, formatting_stack_trace, false)                                      \
42362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  /* Perform side effect checks on function call and API callbacks. */        \
42462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V(bool, needs_side_effect_check, false)                                     \
425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ISOLATE_INIT_SIMULATOR_LIST(V)
426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define THREAD_LOCAL_TOP_ACCESSOR(type, name)                        \
428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline void set_##name(type v) { thread_local_top_.name##_ = v; }  \
429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  inline type name() const { return thread_local_top_.name##_; }
430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THREAD_LOCAL_TOP_ADDRESS(type, name) \
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  type* name##_address() { return &thread_local_top_.name##_; }
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate {
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These forward declarations are required to make the friend declarations in
43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // PerIsolateThreadData work on some older versions of gcc.
43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable;
43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem;
44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~Isolate();
44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A thread has a PerIsolateThreadData instance for each isolate that it has
44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // entered. That instance is allocated when the isolate is initially entered
44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and reused on subsequent entries.
44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class PerIsolateThreadData {
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData(Isolate* isolate, ThreadId thread_id)
44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : isolate_(isolate),
45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_id_(thread_id),
45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block          stack_limit_(0),
45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_state_(NULL),
453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block          simulator_(NULL),
45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block          next_(NULL),
45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          prev_(NULL) { }
458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ~PerIsolateThreadData();
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate() const { return isolate_; }
46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id() const { return thread_id_; }
461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(uintptr_t, stack_limit)
463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(ThreadState*, thread_state)
464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FIELD_ACCESSOR(Simulator*, simulator)
46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    bool Matches(Isolate* isolate, ThreadId thread_id) const {
4708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      return isolate_ == isolate && thread_id_.Equals(thread_id);
47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
47244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate_;
47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id_;
47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    uintptr_t stack_limit_;
47744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadState* thread_state_;
47844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR
48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Simulator* simulator_;
48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
48344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* next_;
48444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* prev_;
48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
48644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class Isolate;
48744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class ThreadDataTable;
48844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class EntryStackItem;
48944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData);
49144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
49244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
49444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  enum AddressId {
495589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address,
496589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM)
497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_ENUM
498589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    kIsolateAddressCount
49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void InitializeOncePerProcess();
502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the PerIsolateThreadData for the current thread (or NULL if one is
50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not currently set).
50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static PerIsolateThreadData* CurrentPerIsolateThreadData() {
50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return reinterpret_cast<PerIsolateThreadData*>(
507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetThreadLocal(per_isolate_thread_data_key_));
50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the isolate inside which the current thread is running.
51144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  INLINE(static Isolate* Current()) {
512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1);
51344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate = reinterpret_cast<Isolate*>(
514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        base::Thread::GetExistingThreadLocal(isolate_key_));
515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate != NULL);
51644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return isolate;
51744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
51844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
51969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Usually called by Init(), but can be called early e.g. to allow
52069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // testing components that require logging but not the whole
52169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // isolate.
52269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  //
52369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Safe to call more than once.
52469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeLoggingAndCounters();
52569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool Init(Deserializer* des);
52744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // True if at least one thread Enter'ed this isolate.
52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsInUse() { return entry_stack_ != NULL; }
53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Destroys the non-default isolates.
53244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Sets default isolate into "has_been_disposed" state rather then destroying,
53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for legacy API reasons.
53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TearDown();
53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void ReleaseManagedObjects();
53762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void GlobalTearDown();
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ClearSerializerData();
541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Find the PerThread for this particular (isolate, thread) combination
543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // If one does not yet exist, return null.
544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PerIsolateThreadData* FindPerThreadDataForThisThread();
545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the PerThread for given (isolate, thread) combination
547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If one does not yet exist, return null.
548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id);
54944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Discard the PerThread for this particular (isolate, thread) combination
551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // If one does not yet exist, no-op.
552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DiscardPerThreadDataForThisThread();
553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store the pointer to the current isolate.
55544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Used internally for V8 threads that do not execute JavaScript but still
55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // are part of the domain of an isolate (like the context switcher).
557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey isolate_key() {
55885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return isolate_key_;
55985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
56044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
56144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store process-wide thread IDs.
562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey thread_id_key() {
56385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return thread_id_key_;
56485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
56544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey per_isolate_thread_data_key();
56744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
56844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Mutex for serializing access to break control structures.
569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RecursiveMutex* break_access() { return &break_access_; }
57069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
57144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address get_address_from_id(AddressId id);
57244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to top context (where the current function object was created).
57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context() { return thread_local_top_.context_; }
575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_context(Context* context);
57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context** context_address() { return &thread_local_top_.context_; }
57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(SaveContext*, save_context)
57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
58044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to current thread id.
581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(ThreadId, thread_id)
58244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
58344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Interface to pending exception.
584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Object* pending_exception();
585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void set_pending_exception(Object* exception_obj);
586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_pending_exception();
587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception)
589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_pending_exception();
591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context)
593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code)
594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset)
595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp)
596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp)
597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception)
599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::TryCatch* try_catch_handler() {
601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return thread_local_top_.try_catch_handler();
60244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool* external_caught_exception_address() {
60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.external_caught_exception_;
60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception)
608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_pending_message();
610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address pending_message_obj_address() {
611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_);
6128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Object* scheduled_exception();
615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool has_scheduled_exception();
616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void clear_scheduled_exception();
61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsJavaScriptHandlerOnTop(Object* exception);
619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsExternalHandlerOnTop(Object* exception);
62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_catchable_by_javascript(Object* exception);
622f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  inline bool is_catchable_by_wasm(Object* exception);
623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JS execution stack (see frames.h).
62544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address c_entry_fp(ThreadLocalTop* thread) {
62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread->c_entry_fp_;
62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address handler(ThreadLocalTop* thread) { return thread->handler_; }
629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Address c_function() { return thread_local_top_.c_function_; }
63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* c_entry_fp_address() {
63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.c_entry_fp_;
63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* handler_address() { return &thread_local_top_.handler_; }
635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  inline Address* c_function_address() {
636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return &thread_local_top_.c_function_;
637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
63844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Bottom JS entry.
640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Address js_entry_sp() {
641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return thread_local_top_.js_entry_sp_;
64244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
64344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* js_entry_sp_address() {
64444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.js_entry_sp_;
64544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
64644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
64744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global object of the current context. It could be
6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a builtin object, or a JS global object.
649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Handle<JSGlobalObject> global_object();
65044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
65144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global proxy object of the current context.
652bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  inline Handle<JSObject> global_proxy();
65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); }
65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FreeThreadResources() { thread_local_top_.Free(); }
65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
65744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method is called by the api after operations that may throw
65844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // exceptions.  If an exception was thrown and not handled by an external
65944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // handler the exception is scheduled to be rethrown when we return to running
66044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JavaScript code.  If an exception is scheduled true is returned.
66144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool OptionalRescheduleException(bool is_bottom_call);
66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Push and pop a promise and the current try-catch handler.
664f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void PushPromise(Handle<JSObject> promise);
665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void PopPromise();
666f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
667f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Return the relevant Promise that a throw/rejection pertains to, based
668f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // on the contents of the Promise stack
669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Object> GetPromiseOnStackOnThrow();
670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
671f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  // Heuristically guess whether a Promise is handled by user catch handler
672f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool PromiseHasUserDefinedRejectHandler(Handle<Object> promise);
673f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
6748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  class ExceptionScope {
6758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   public:
676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Scope currently can only be used for regular exceptions,
677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // not termination exception.
678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inline explicit ExceptionScope(Isolate* isolate);
679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inline ~ExceptionScope();
6808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   private:
6828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Isolate* isolate_;
6838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Handle<Object> pending_exception_;
6848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  };
6858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
68644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetCaptureStackTraceForUncaughtExceptions(
68744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      bool capture,
68844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void SetAbortOnUncaughtExceptionCallback(
692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      v8::Isolate::AbortOnUncaughtExceptionCallback callback);
693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  enum PrintStackMode { kPrintStackConcise, kPrintStackVerbose };
69544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintCurrentStackTrace(FILE* out);
696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintStack(StringStream* accumulator,
697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                  PrintStackMode mode = kPrintStackVerbose);
698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void PrintStack(FILE* out, PrintStackMode mode = kPrintStackVerbose);
69944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> StackTraceString();
700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  NO_INLINE(void PushStackTraceAndDie(unsigned int magic, void* ptr1,
701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                      void* ptr2, unsigned int magic2));
70244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSArray> CaptureCurrentStackTrace(
70344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
70444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
7053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Object> CaptureSimpleStackTrace(Handle<JSReceiver> error_object,
706f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                         FrameSkipMode mode,
707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                         Handle<Object> caller);
7083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  MaybeHandle<JSReceiver> CaptureAndSetDetailedStackTrace(
7093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Handle<JSReceiver> error_object);
7103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  MaybeHandle<JSReceiver> CaptureAndSetSimpleStackTrace(
711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<JSReceiver> error_object, FrameSkipMode mode,
712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Handle<Object> caller);
713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSArray> GetDetailedStackTrace(Handle<JSObject> error_object);
7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns if the given context may access the given global object. If
71644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the result is false, the pending exception is guaranteed to be
71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // set.
718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool MayAccess(Handle<Context> accessing_context, Handle<JSObject> receiver);
719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
72044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback);
721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void ReportFailedAccessCheck(Handle<JSObject> receiver);
72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
72344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exception throwing support. The caller should use the result
724c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // of Throw() as its return value.
725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* Throw(Object* exception, MessageLocation* location = NULL);
726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* ThrowIllegalOperation();
727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  template <typename T>
729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception,
730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                                       MessageLocation* location = NULL) {
731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    Throw(*exception, location);
732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return MaybeHandle<T>();
733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Re-throw an exception.  This involves no error reporting since error
736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // reporting was handled when the exception was thrown originally.
737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* ReThrow(Object* exception);
738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Find the correct handler for the current pending exception. This also
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // clears and returns the current pending exception.
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Object* UnwindAndFindHandler();
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Tries to predict whether an exception will be caught. Note that this can
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // only produce an estimate, because it is undecidable whether a finally
745f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // clause will consume or re-throw an exception.
746f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  enum CatchType {
747f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    NOT_CAUGHT,
748f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CAUGHT_BY_JAVASCRIPT,
749f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    CAUGHT_BY_EXTERNAL,
750f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CAUGHT_BY_DESUGARING,
751f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CAUGHT_BY_PROMISE,
752f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CAUGHT_BY_ASYNC_AWAIT
753f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  };
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CatchType PredictExceptionCatcher();
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
75644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ScheduleThrow(Object* exception);
757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Re-set pending message, script and positions reported to the TryCatch
758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // back to the TLS for re-use when rethrowing.
759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RestorePendingMessageFromTryCatch(v8::TryCatch* handler);
760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Un-schedule an exception that was caught by a TryCatch handler.
761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler);
76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ReportPendingMessages();
763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return pending location if any or unfilled structure.
764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MessageLocation GetMessageLocation();
76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Promote a scheduled exception to pending. Asserts has_scheduled_exception.
767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* PromoteScheduledException();
76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Attempts to compute the current source location, storing the
77062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // result in the target out parameter. The source location is attached to a
77162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Message object as the location which should be shown to the user. It's
77262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // typically the top-most meaningful location on the stack.
773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ComputeLocation(MessageLocation* target);
774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool ComputeLocationFromException(MessageLocation* target,
775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                    Handle<Object> exception);
776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  bool ComputeLocationFromStackTrace(MessageLocation* target,
777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                     Handle<Object> exception);
778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSMessageObject> CreateMessage(Handle<Object> exception,
780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                        MessageLocation* location);
78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Out of resource exception helpers.
783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* StackOverflow();
784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Object* TerminateExecution();
785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CancelTerminateExecution();
786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void RequestInterrupt(InterruptCallback callback, void* data);
788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void InvokeApiInterruptCallbacks();
78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Administration
79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v);
79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v, ThreadLocalTop* t);
79344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* Iterate(ObjectVisitor* v, char* t);
79444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateThread(ThreadVisitor* v, char* t);
79544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Returns the current native context.
797f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  inline Handle<Context> native_context();
798f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  inline Context* raw_native_context();
79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Returns the native context of the calling JavaScript code.  That
801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // is, the native context of the top-most JavaScript frame.
802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<Context> GetCallingNativeContext();
80344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
80444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RegisterTryCatchHandler(v8::TryCatch* that);
80544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UnregisterTryCatchHandler(v8::TryCatch* that);
80644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
80744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* ArchiveThread(char* to);
80844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* RestoreThread(char* from);
80944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
81044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kUC16AlphabetSize = 256;  // See StringSearchBase.
81144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kBMMaxShift = 250;        // See StringSearchBase.
81244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
81344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Accessors.
81444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue)                       \
81544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type name() const {                                            \
816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
81744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return name##_;                                                     \
81844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }                                                                     \
81944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void set_##name(type value) {                                  \
820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
82144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    name##_ = value;                                                    \
82244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
82344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_ACCESSOR)
82444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR
82544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length)                       \
82744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type* name() {                                                 \
828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &(name##_)[0];                                               \
83044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR)
83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR
83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \
835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline Handle<type> name();                            \
836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool is_##name(type* value);
837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSOR)
838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSOR
83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper() { return bootstrapper_; }
84169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Counters* counters() {
84269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
84369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(counters_ != NULL);
84569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return counters_;
84669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
84744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler() { return runtime_profiler_; }
84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache() { return compilation_cache_; }
84969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Logger* logger() {
85069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
85169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(logger_ != NULL);
85369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return logger_;
85469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
85544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard() { return &stack_guard_; }
85644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Heap* heap() { return &heap_; }
85769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  StatsTable* stats_table();
858f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StubCache* load_stub_cache() { return load_stub_cache_; }
859f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StubCache* store_stub_cache() { return store_stub_cache_; }
860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeAgingHelper* code_aging_helper() { return code_aging_helper_; }
86144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; }
862109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool deoptimizer_lazy_throw() const { return deoptimizer_lazy_throw_; }
863109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void set_deoptimizer_lazy_throw(bool value) {
864109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    deoptimizer_lazy_throw_ = value;
865109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop* thread_local_top() { return &thread_local_top_; }
867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaterializedObjectStore* materialized_object_store() {
868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return materialized_object_store_;
86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache() {
87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return context_slot_cache_;
87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache() {
87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return descriptor_lookup_cache_;
87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScopeData* handle_scope_data() { return &handle_scope_data_; }
880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
88144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer() {
882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(handle_scope_implementer_);
88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return handle_scope_implementer_;
88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
88544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache() {
8878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return unicode_cache_;
88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache() {
8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return inner_pointer_to_code_cache_;
8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles() { return global_handles_; }
89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles() { return eternal_handles_; }
89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ThreadManager* thread_manager() { return thread_manager_; }
89944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() {
90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_uncanonicalize_;
90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() {
90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_canonrange_;
90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState* runtime_state() { return &runtime_state_; }
90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins* builtins() { return &builtins_; }
91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize() {
91444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &regexp_macro_assembler_canonicalize_;
91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
91644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack() { return regexp_stack_; }
91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  size_t total_regexp_code_generated() { return total_regexp_code_generated_; }
92062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void IncreaseTotalRegexpCodeGenerated(int size) {
92162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    total_regexp_code_generated_ += size;
92262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
92362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  List<int>* regexp_indices() { return &regexp_indices_; }
925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
92644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
92744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      interp_canonicalize_mapping() {
928109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return &regexp_macro_assembler_canonicalize_;
92944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
93044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Debug* debug() { return debug_; }
93244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
93313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  bool* is_profiling_address() { return &is_profiling_; }
93413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CodeEventDispatcher* code_event_dispatcher() const {
93513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return code_event_dispatcher_.get();
93613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapProfiler* heap_profiler() const { return heap_profiler_; }
938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo* heap_histograms() { return heap_histograms_; }
94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation* js_spill_information() {
94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &js_spill_information_;
94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
94644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Factory* factory() { return reinterpret_cast<Factory*>(this); }
94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kJSRegexpStaticOffsetsVectorSize = 128;
95044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(ExternalCallbackScope*, external_callback_scope)
952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  THREAD_LOCAL_TOP_ACCESSOR(StateTag, current_vm_state)
954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetData(uint32_t slot, void* data) {
956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(slot < Internals::kNumIsolateDataSlots);
957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    embedder_data_[slot] = data;
95844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* GetData(uint32_t slot) {
960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(slot < Internals::kNumIsolateDataSlots);
961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return embedder_data_[slot];
96244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
96344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool serializer_enabled() const { return serializer_enabled_; }
965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool snapshot_available() const {
966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return snapshot_blob_ != NULL && snapshot_blob_->raw_size != 0;
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
96844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDead() { return has_fatal_error_; }
970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SignalFatalError() { has_fatal_error_ = true; }
97144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
97262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool use_crankshaft();
973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool initialized_from_snapshot() { return initialized_from_snapshot_; }
975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
97662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool NeedsSourcePositionsForProfiling() const;
97762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
97862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool IsCodeCoverageEnabled();
97962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void SetCodeCoverageList(Object* value);
98062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double time_millis_since_init() {
982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return heap_.MonotonicallyIncreasingTimeInMs() - time_millis_at_init_;
98344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
98444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DateCache* date_cache() {
986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return date_cache_;
98744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
98844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_date_cache(DateCache* date_cache) {
990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (date_cache != date_cache_) {
991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      delete date_cache_;
99244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    date_cache_ = date_cache;
99444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
99544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Map* get_initial_js_array_map(ElementsKind kind);
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
998c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static const int kProtectorValid = 1;
999c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static const int kProtectorInvalid = 0;
1000257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsFastArrayConstructorPrototypeChainIntact();
10023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  inline bool IsArraySpeciesLookupChainIntact();
1003bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsIsConcatSpreadableLookupChainIntact();
1004f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool IsIsConcatSpreadableLookupChainIntact(JSReceiver* receiver);
1005f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  inline bool IsStringLengthOverflowIntact();
1006c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  inline bool IsArrayIteratorLookupChainIntact();
1007c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1008c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Avoid deopt loops if fast Array Iterators migrate to slow Array Iterators.
1009c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  inline bool IsFastArrayIterationIntact();
1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
101162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Make sure we do check for neutered array buffers.
101262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  inline bool IsArrayBufferNeuteringIntact();
101362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // On intent to set an element in object, make sure that appropriate
1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // notifications occur if the set is on the elements of the array or
1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // object prototype. Also ensure that changes to prototype chain between
1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Array and Object fire notifications.
1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetElement(Handle<JSObject> object);
1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetLength(Handle<JSObject> object) {
1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnSetPrototype(Handle<JSObject> object) {
1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void UpdateArrayProtectorOnNormalizeElements(Handle<JSObject> object) {
1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UpdateArrayProtectorOnSetElement(object);
1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1028109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void InvalidateArraySpeciesProtector();
1029bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  void InvalidateIsConcatSpreadableProtector();
1030f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void InvalidateStringLengthOverflowProtector();
1031c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void InvalidateArrayIteratorProtector();
103262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void InvalidateArrayBufferNeuteringProtector();
1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Returns true if array is the initial array prototype in any native context.
1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool IsAnyInitialArrayPrototype(Handle<JSArray> array);
1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
103762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  V8_EXPORT_PRIVATE CallInterfaceDescriptorData* call_descriptor_data(
103862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      int index);
1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1040c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  AccessCompilerData* access_compiler_data() { return access_compiler_data_; }
1041c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void IterateDeferredHandles(ObjectVisitor* visitor);
1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void LinkDeferredHandles(DeferredHandles* deferred_handles);
1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void UnlinkDeferredHandles(DeferredHandles* deferred_handles);
1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG
1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool IsDeferredHandle(Object** location);
1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif  // DEBUG
1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool concurrent_recompilation_enabled() {
1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    // Thread is only available with flag enabled.
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    DCHECK(optimizing_compile_dispatcher_ == NULL ||
1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch           FLAG_concurrent_recompilation);
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_ != NULL;
10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OptimizingCompileDispatcher* optimizing_compile_dispatcher() {
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return optimizing_compile_dispatcher_;
10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int id() const { return static_cast<int>(id_); }
1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HStatistics* GetHStatistics();
1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CompilationStatistics* GetTurboStatistics();
1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HTracer* GetHTracer();
1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeTracer* GetCodeTracer();
1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DumpAndResetCompilationStats();
1069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionEntryHook function_entry_hook() { return function_entry_hook_; }
1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void set_function_entry_hook(FunctionEntryHook function_entry_hook) {
1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    function_entry_hook_ = function_entry_hook;
10733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* stress_deopt_count_address() { return &stress_deopt_count_; }
1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1077c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  V8_EXPORT_PRIVATE base::RandomNumberGenerator* random_number_generator();
1078c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1079c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Generates a random number that is non-zero when masked
1080c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // with the provided mask.
1081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int GenerateIdentityHash(uint32_t mask);
1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Given an address occupied by a live code object, return that object.
108462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Code* FindCodeObject(Address a);
1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int NextOptimizationId() {
1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    int id = next_optimization_id_++;
1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!Smi::IsValid(next_optimization_id_)) {
1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      next_optimization_id_ = 0;
10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return id;
10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void AddCallCompletedCallback(CallCompletedCallback callback);
1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RemoveCallCompletedCallback(CallCompletedCallback callback);
1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void FireCallCompletedCallback();
1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1098109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1099109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback);
1100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  inline void FireBeforeCallEnteredCallback();
1101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
11023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void AddMicrotasksCompletedCallback(MicrotasksCompletedCallback callback);
11033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void RemoveMicrotasksCompletedCallback(MicrotasksCompletedCallback callback);
11043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void FireMicrotasksCompletedCallback();
11053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void SetPromiseRejectCallback(PromiseRejectCallback callback);
1107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void ReportPromiseReject(Handle<JSObject> promise, Handle<Object> value,
1108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                           v8::PromiseRejectEvent event);
1109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void PromiseReactionJob(Handle<PromiseReactionJobInfo> info,
1111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          MaybeHandle<Object>* result,
1112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                          MaybeHandle<Object>* maybe_exception);
1113c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void PromiseResolveThenableJob(Handle<PromiseResolveThenableJobInfo> info,
1114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                 MaybeHandle<Object>* result,
1115f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                 MaybeHandle<Object>* maybe_exception);
1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void EnqueueMicrotask(Handle<Object> microtask);
1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void RunMicrotasks();
1118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsRunningMicrotasks() const { return is_running_microtasks_; }
111962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
112062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Symbol> SymbolFor(Heap::RootListIndex dictionary_index,
112162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                           Handle<String> name, bool private_symbol);
1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback);
1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CountUsage(v8::Isolate::UseCounterFeature feature);
1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* GetOrCreateBasicBlockProfiler();
1127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* basic_block_profiler() { return basic_block_profiler_; }
1128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::string GetTurboCfgFileName();
1130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
1132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int GetNextUniqueSharedFunctionInfoId() { return next_unique_sfi_id_++; }
1133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Address promise_hook_or_debug_is_active_address() {
113662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return reinterpret_cast<Address>(&promise_hook_or_debug_is_active_);
113762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
113862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
113962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void DebugStateUpdated();
114062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
114162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void SetPromiseHook(PromiseHook hook);
114262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise,
114362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                      Handle<Object> parent);
114462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
11453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Support for dynamically disabling tail call elimination.
11463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Address is_tail_call_elimination_enabled_address() {
11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return reinterpret_cast<Address>(&is_tail_call_elimination_enabled_);
11483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
11493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool is_tail_call_elimination_enabled() const {
11503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return is_tail_call_elimination_enabled_;
11513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
11523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void SetTailCallEliminationEnabled(bool enabled);
1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void AddDetachedContext(Handle<Context> context);
1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void CheckDetachedContextsAfterGC();
1156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  List<Object*>* partial_snapshot_cache() { return &partial_snapshot_cache_; }
1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void set_array_buffer_allocator(v8::ArrayBuffer::Allocator* allocator) {
1160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    array_buffer_allocator_ = allocator;
1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::ArrayBuffer::Allocator* array_buffer_allocator() const {
1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return array_buffer_allocator_;
1164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FutexWaitListNode* futex_wait_list_node() { return &futex_wait_list_node_; }
1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CancelableTaskManager* cancelable_task_manager() {
1169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return cancelable_task_manager_;
1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
117262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const AstStringConstants* ast_string_constants() const {
117362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return ast_string_constants_;
117462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
117562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Interpreter* interpreter() const { return interpreter_; }
1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1178f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  AccountingAllocator* allocator() { return allocator_; }
11793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
118062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CompilerDispatcher* compiler_dispatcher() const {
118162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return compiler_dispatcher_;
1182c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
1183c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
118462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Clear all optimized code stored in native contexts.
118562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void ClearOSROptimizedCode();
118662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
118762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Ensure that a particular optimized code is evicted.
118862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void EvictOSROptimizedCode(Code* code, const char* reason);
118962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1190bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsInAnyContext(Object* object, uint32_t index);
1191bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch
119213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  void SetRAILMode(RAILMode rail_mode);
119313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
119462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  RAILMode rail_mode() { return rail_mode_.Value(); }
119562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
119662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  double LoadStartTimeMs();
119762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void IsolateInForegroundNotification();
1199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void IsolateInBackgroundNotification();
1201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool IsIsolateInBackground() { return is_isolate_in_background_; }
1203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1204f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  PRINTF_FORMAT(2, 3) void PrintWithTimestamp(const char* format, ...);
1205f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
1206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifdef USE_SIMULATOR
1207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  base::Mutex* simulator_i_cache_mutex() { return &simulator_i_cache_mutex_; }
1208f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif
1209f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
121062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void set_allow_atomics_wait(bool set) { allow_atomics_wait_ = set; }
121162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool allow_atomics_wait() { return allow_atomics_wait_; }
121262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
121362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // List of native heap values allocated by the runtime as part of its
121462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // implementation that must be freed at isolate deinit.
121562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  class ManagedObjectFinalizer final {
121662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch   public:
121762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    typedef void (*Deleter)(void*);
121862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void Dispose() { deleter_(value_); }
121962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
122062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch   private:
122162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    friend class Isolate;
122262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
122362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ManagedObjectFinalizer() {
122462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      DCHECK_EQ(reinterpret_cast<void*>(this),
122562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                reinterpret_cast<void*>(&value_));
122662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
122762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
122862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // value_ must be the first member
122962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    void* value_ = nullptr;
123062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Deleter deleter_ = nullptr;
123162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ManagedObjectFinalizer* prev_ = nullptr;
123262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    ManagedObjectFinalizer* next_ = nullptr;
123362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  };
123462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
123562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Register a native value for destruction at isolate teardown.
123662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ManagedObjectFinalizer* RegisterForReleaseAtTeardown(
123762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      void* value, ManagedObjectFinalizer::Deleter deleter);
123862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
123962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // Unregister a previously registered value from release at
124062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // isolate teardown, deleting the ManagedObjectFinalizer.
124162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // This transfers the responsibility of the previously managed value's
124262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // deletion to the caller. Pass by pointer, because *finalizer_ptr gets
124362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // reset to nullptr.
124462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void UnregisterFromReleaseAtTeardown(ManagedObjectFinalizer** finalizer_ptr);
124562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected:
1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  explicit Isolate(bool enable_serializer);
1248bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool IsArrayOrObjectPrototype(Object* object);
124944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct GlobalState;
12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct InitializeGlobalState;
12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // These fields are accessed through the API, offsets must be kept in sync
1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // with v8::internal::Internals (in include/v8.h) constants. This is also
1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // verified in Isolate::Init() using runtime checks.
1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void* embedder_data_[Internals::kNumIsolateDataSlots];
1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Heap heap_;
1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The per-process lock should be acquired before the ThreadDataTable is
126144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // modified.
126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable {
126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadDataTable();
126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ~ThreadDataTable();
126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
126744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id);
126844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Insert(PerIsolateThreadData* data);
126944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Remove(PerIsolateThreadData* data);
12703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    void RemoveAllThreads(Isolate* isolate);
127144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* list_;
127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These items form a stack synchronously with threads Enter'ing and Exit'ing
127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the Isolate. The top of the stack points to a thread which is currently
127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // running the Isolate. When the stack is empty, the Isolate is considered
127944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not entered by any thread and can be Disposed.
1280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // If the same thread enters the Isolate more than once, the entry_count_
128144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is incremented rather then a new item pushed to the stack.
128244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem {
128344f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
128444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem(PerIsolateThreadData* previous_thread_data,
128544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   Isolate* previous_isolate,
128644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   EntryStackItem* previous_item)
128744f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : entry_count(1),
128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_thread_data(previous_thread_data),
128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_isolate(previous_isolate),
129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_item(previous_item) { }
129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    int entry_count;
129344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* previous_thread_data;
129444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* previous_isolate;
129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem* previous_item;
129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   private:
129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(EntryStackItem);
129944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
130044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::LazyMutex thread_data_table_mutex_;
130285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey per_isolate_thread_data_key_;
1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey isolate_key_;
1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Thread::LocalStorageKey thread_id_key_;
130685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static ThreadDataTable* thread_data_table_;
130785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // A global counter for all generated Isolates, might overflow.
1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static base::Atomic32 isolate_counter_;
1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG
1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  static base::Atomic32 isolate_key_created_;
1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Deinit();
131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void SetIsolateThreadLocals(Isolate* isolate,
131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     PerIsolateThreadData* data);
131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Find the PerThread for this particular (isolate, thread) combination.
132144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If one does not yet exist, allocate a new one.
132244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread();
132344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
132444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initializes the current thread to run this Isolate.
132544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
132644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
132744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Enter();
132844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
132944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exits the current thread. The previosuly entered Isolate is restored
133044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for the thread.
133144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
133244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Exit();
133444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
133544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void InitializeThreadLocal();
133644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
133744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactPrologue(bool is_compacting,
133844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
133944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactEpilogue(bool is_compacting,
134044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
134144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
134244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FillCache();
134344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Propagate pending exception message to the v8::TryCatch.
1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // If there is no external try-catch or message was successfully propagated,
1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // then return true.
1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool PropagatePendingExceptionToExternalTryCatch();
134869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Remove per-frame stored materialized objects when we are unwinding
1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the frame.
1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void RemoveMaterializedObjectsOnUnwind(StackFrame* frame);
13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
13533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void RunMicrotasksInternal();
13543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
135513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  const char* RAILModeName(RAILMode rail_mode) const {
135613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    switch (rail_mode) {
135713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      case PERFORMANCE_RESPONSE:
135813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return "RESPONSE";
135913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      case PERFORMANCE_ANIMATION:
136013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return "ANIMATION";
136113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      case PERFORMANCE_IDLE:
136213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return "IDLE";
136313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      case PERFORMANCE_LOAD:
136413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch        return "LOAD";
136513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    }
136613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    return "";
136713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  }
136813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
1369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // TODO(alph): Remove along with the deprecated GetCpuProfiler().
1370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  friend v8::CpuProfiler* v8::Isolate::GetCpuProfiler();
1371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CpuProfiler* cpu_profiler() const { return cpu_profiler_; }
1372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::Atomic32 id_;
1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EntryStackItem* entry_stack_;
137544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_nesting_level_;
137644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringStream* incomplete_message_;
1377589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  Address isolate_addresses_[kIsolateAddressCount + 1];  // NOLINT
137844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper_;
137944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler_;
138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache_;
138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Counters* counters_;
1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RecursiveMutex break_access_;
138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Logger* logger_;
138444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard stack_guard_;
138544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StatsTable* stats_table_;
1386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StubCache* load_stub_cache_;
1387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StubCache* store_stub_cache_;
1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CodeAgingHelper* code_aging_helper_;
138944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data_;
1390109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  bool deoptimizer_lazy_throw_;
1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MaterializedObjectStore* materialized_object_store_;
139244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop thread_local_top_;
139344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool capture_stack_trace_for_uncaught_exceptions_;
139444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_for_uncaught_exceptions_frame_limit_;
139544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_;
139644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache_;
139744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache_;
1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HandleScopeData handle_scope_data_;
139944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer_;
14008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache_;
1401f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  AccountingAllocator* allocator_;
14023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache_;
140344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles_;
1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EternalHandles* eternal_handles_;
140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadManager* thread_manager_;
140644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState runtime_state_;
140744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins builtins_;
140844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_;
140944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_;
141044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>
141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize_;
141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack_;
1413c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  List<int> regexp_indices_;
14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DateCache* date_cache_;
1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CallInterfaceDescriptorData* call_descriptor_data_;
1416c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  AccessCompilerData* access_compiler_data_;
1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  base::RandomNumberGenerator* random_number_generator_;
1418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  base::AtomicValue<RAILMode> rail_mode_;
141962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool promise_hook_or_debug_is_active_;
142062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PromiseHook promise_hook_;
142162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  base::Mutex rail_mutex_;
142262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  double load_start_time_ms_;
142344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Whether the isolate has been created for snapshotting.
1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool serializer_enabled_;
1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if fatal error has been signaled for this isolate.
1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool has_fatal_error_;
1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // True if this isolate was initialized from a snapshot.
1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool initialized_from_snapshot_;
14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // True if ES2015 tail call elimination feature is enabled.
14343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool is_tail_call_elimination_enabled_;
14353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1436f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // True if the isolate is in background. This flag is used
1437f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  // to prioritize between memory usage and latency.
1438f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool is_isolate_in_background_;
1439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Time stamp at initialization.
14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  double time_millis_at_init_;
14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
144344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
144444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A static array of histogram info for each type.
144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo heap_histograms_[LAST_TYPE + 1];
144644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation js_spill_information_;
144744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
144844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Debug* debug_;
1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CpuProfiler* cpu_profiler_;
1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  HeapProfiler* heap_profiler_;
145213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  std::unique_ptr<CodeEventDispatcher> code_event_dispatcher_;
1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FunctionEntryHook function_entry_hook_;
145444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
145562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const AstStringConstants* ast_string_constants_;
145662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  interpreter::Interpreter* interpreter_;
1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
145962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CompilerDispatcher* compiler_dispatcher_;
1460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  typedef std::pair<InterruptCallback, void*> InterruptEntry;
1462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  std::queue<InterruptEntry> api_interrupts_queue_;
1463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
146444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue)                         \
146544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_;
146644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE)
146744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE
146844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
146944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length)                         \
147044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_[length];
147144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE)
147244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE
147344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
147444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
147544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This class is huge and has a number of fields controlled by
147644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // preprocessor defines. Make sure the offsets of these fields agree
147744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // between compilation units.
147844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored)                              \
147944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const intptr_t name##_debug_offset_;
148044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
148144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
148244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET
148344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
148444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DeferredHandles* deferred_handles_head_;
1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  OptimizingCompileDispatcher* optimizing_compile_dispatcher_;
1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Counts deopt points if deopt_every_n_times is enabled.
1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  unsigned int stress_deopt_count_;
1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int next_optimization_id_;
1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS
1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int next_unique_sfi_id_;
1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1497109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // List of callbacks before a Call starts execution.
1498109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  List<BeforeCallEnteredCallback> before_call_entered_callbacks_;
1499109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // List of callbacks when a Call completes.
1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  List<CallCompletedCallback> call_completed_callbacks_;
1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // List of callbacks after microtasks were run.
15043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  List<MicrotasksCompletedCallback> microtasks_completed_callbacks_;
1505bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool is_running_microtasks_;
15063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  v8::Isolate::UseCounterCallback use_counter_callback_;
1508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  BasicBlockProfiler* basic_block_profiler_;
1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  List<Object*> partial_snapshot_cache_;
1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::ArrayBuffer::Allocator* array_buffer_allocator_;
1513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  FutexWaitListNode futex_wait_list_node_;
1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CancelableTaskManager* cancelable_task_manager_;
1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  v8::Isolate::AbortOnUncaughtExceptionCallback
1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      abort_on_uncaught_exception_callback_;
1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1521f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifdef USE_SIMULATOR
1522f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  base::Mutex simulator_i_cache_mutex_;
1523f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif
1524f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
152562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool allow_atomics_wait_;
152662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
152762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ManagedObjectFinalizer managed_object_finalizers_list_;
152862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
152962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  size_t total_regexp_code_generated_;
153062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
153144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class ExecutionAccess;
1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class HandleScopeImplementer;
153362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  friend class HeapTester;
1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend class OptimizingCompileDispatcher;
1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class SweeperThread;
1536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class ThreadManager;
1537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class Simulator;
1538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class StackGuard;
15398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class ThreadId;
154044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Isolate;
154144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Locker;
1542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class v8::Unlocker;
154313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  friend class v8::SnapshotCreator;
1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  friend v8::StartupData v8::V8::CreateSnapshotDataBlob(const char*);
15453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  friend v8::StartupData v8::V8::WarmUpSnapshotDataBlob(v8::StartupData,
15463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                                        const char*);
154744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(Isolate);
154944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
155044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
155144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ACCESSOR
1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef THREAD_LOCAL_TOP_ACCESSOR
1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack {
1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1558f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  PromiseOnStack(Handle<JSObject> promise, PromiseOnStack* prev)
1559f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      : promise_(promise), prev_(prev) {}
1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> promise() { return promise_; }
1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* prev() { return prev_; }
1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Handle<JSObject> promise_;
1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PromiseOnStack* prev_;
1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
156944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the
157044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these
157144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details.
157244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED {
157344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1574f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  explicit SaveContext(Isolate* isolate);
1575f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ~SaveContext();
157644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
157744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context() { return context_; }
157844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev() { return prev_; }
157944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
158044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns true if this save context is below a given JavaScript frame.
1581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  bool IsBelowFrame(StandardFrame* frame) {
15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp());
158344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
158444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
158544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1586f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Isolate* const isolate_;
158744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
1588f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  SaveContext* const prev_;
15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address c_entry_fp_;
159044f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
159144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
159244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
159344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED {
159444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
159544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  explicit AssertNoContextChange(Isolate* isolate);
159744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~AssertNoContextChange() {
1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    DCHECK(isolate_->context() == *context_);
159944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
160044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
160144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Isolate* isolate_;
160344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
160444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
160544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit AssertNoContextChange(Isolate* isolate) { }
160744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
160844f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
160944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
161044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
161144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED {
161244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
161344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) {
161444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Lock(isolate);
161544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
161644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~ExecutionAccess() { Unlock(isolate_); }
161744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void Lock(Isolate* isolate) { isolate->break_access()->Lock(); }
1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static void Unlock(Isolate* isolate) { isolate->break_access()->Unlock(); }
162044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
162144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool TryLock(Isolate* isolate) {
1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return isolate->break_access()->TryLock();
162344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
162444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
162544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
162644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
162744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
162844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
162944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for checking for stack-overflows.
163144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED {
163244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
163344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { }
163444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use this to check for stack-overflows in C++ code.
1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool HasOverflowed() const {
163744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StackGuard* stack_guard = isolate_->stack_guard();
1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return GetCurrentStackPosition() < stack_guard->real_climit();
163944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Use this to check for interrupt request in C++ code.
1642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool InterruptRequested() {
1643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    StackGuard* stack_guard = isolate_->stack_guard();
1644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return GetCurrentStackPosition() < stack_guard->climit();
1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Use this to check for stack-overflow when entering runtime from JS code.
1648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool JsHasOverflowed(uintptr_t gap = 0) const;
1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
165044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
165144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
165244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
165344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
165462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define STACK_CHECK(isolate, result_value) \
165562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  do {                                     \
165662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    StackLimitCheck stack_check(isolate);  \
165762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (stack_check.HasOverflowed()) {     \
165862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      isolate->StackOverflow();            \
165962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return result_value;                 \
166062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }                                      \
1661bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  } while (false)
166244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
166344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost
166444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any
166544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into
166644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account.
166744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED {
166844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PostponeInterruptsScope(Isolate* isolate,
1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                          int intercept_mask = StackGuard::ALL_INTERRUPTS)
1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : stack_guard_(isolate->stack_guard()),
1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        intercept_mask_(intercept_mask),
1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        intercepted_flags_(0) {
1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stack_guard_->PushPostponeInterruptsScope(this);
167544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
167644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
167744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~PostponeInterruptsScope() {
1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    stack_guard_->PopPostponeInterruptsScope();
167944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Find the bottom-most scope that intercepts this interrupt.
1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // Return whether the interrupt has been intercepted.
1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  bool Intercept(StackGuard::InterruptFlag flag);
1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
168644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard_;
1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int intercept_mask_;
1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int intercepted_flags_;
1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  PostponeInterruptsScope* prev_;
1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend class StackGuard;
169244f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
169344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
169444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CodeTracer final : public Malloced {
1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  explicit CodeTracer(int isolate_id)
1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      : file_(NULL),
1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        scope_depth_(0) {
1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      file_ = stdout;
1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
170444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (FLAG_redirect_code_traces_to == NULL) {
1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      SNPrintF(filename_,
1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               "code-%d-%d.asm",
1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               base::OS::GetCurrentProcessId(),
1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch               isolate_id);
1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    } else {
1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length());
1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
171344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    WriteChars(filename_.start(), "", 0, false);
1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
171644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  class Scope {
1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   public:
1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); }
1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    ~Scope() { tracer_->CloseFile();  }
172144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    FILE* file() const { return tracer_->file(); }
1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch   private:
1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    CodeTracer* tracer_;
1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  };
1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void OpenFile() {
1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (file_ == NULL) {
1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      file_ = base::OS::FOpen(filename_.start(), "ab");
1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    scope_depth_++;
1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
173944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  void CloseFile() {
1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (!ShouldRedirect()) {
1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return;
1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if (--scope_depth_ == 0) {
1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      fclose(file_);
1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      file_ = NULL;
1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    }
1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE* file() const { return file_; }
1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static bool ShouldRedirect() {
1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return FLAG_redirect_code_traces;
1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EmbeddedVector<char, 128> filename_;
1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  FILE* file_;
1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int scope_depth_;
1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
176244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
176544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
176644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_ISOLATE_H_
1767