isolate.h revision 3ef787dbeca8a5fb1086949cda830dccee07bfbd
13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Redistribution and use in source and binary forms, with or without
344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// modification, are permitted provided that the following conditions are
444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// met:
544f0eee88ff00398ff7f715fab053374d808c90dSteve Block//
644f0eee88ff00398ff7f715fab053374d808c90dSteve Block//     * Redistributions of source code must retain the above copyright
744f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       notice, this list of conditions and the following disclaimer.
844f0eee88ff00398ff7f715fab053374d808c90dSteve Block//     * Redistributions in binary form must reproduce the above
944f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       copyright notice, this list of conditions and the following
1044f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       disclaimer in the documentation and/or other materials provided
1144f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       with the distribution.
1244f0eee88ff00398ff7f715fab053374d808c90dSteve Block//     * Neither the name of Google Inc. nor the names of its
1344f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       contributors may be used to endorse or promote products derived
1444f0eee88ff00398ff7f715fab053374d808c90dSteve Block//       from this software without specific prior written permission.
1544f0eee88ff00398ff7f715fab053374d808c90dSteve Block//
1644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_ISOLATE_H_
2944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define V8_ISOLATE_H_
3044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
3144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "../include/v8-debug.h"
3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "allocation.h"
3344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "apiutils.h"
3444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "atomicops.h"
3544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "builtins.h"
3644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "contexts.h"
3744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "execution.h"
3844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "frames.h"
393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "date.h"
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "global-handles.h"
4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "handles.h"
423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "hashmap.h"
4344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "heap.h"
4444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "regexp-stack.h"
4544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "runtime-profiler.h"
4644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "runtime.h"
4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "zone.h"
4844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
4944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
5044f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
5144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper;
5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator;
5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange;
5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache;
5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache;
5744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSwitcher;
5844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters;
5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures;
6044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler;
6144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData;
6244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer;
6344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement;
6444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable;
6544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory;
6644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass FunctionInfoListener;
6744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HandleScopeImplementer;
6844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapProfiler;
6944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass InlineRuntimeFunctionsTable;
7044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass NoAllocationStringAllocator;
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass InnerPointerToCodeCache;
7244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PreallocatedMemoryThread;
7344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpStack;
7444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext;
758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass UnicodeCache;
7644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StringInputBuffer;
7744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StringTracker;
7844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StubCache;
7944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadManager;
8044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadState;
8144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadVisitor;  // Defined in v8threads.h
8244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass VMState;
8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// 'void function pointer', used to roundtrip the
8544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// ExternalReference::ExternalReferenceRedirector since we can not include
8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// assembler.h, where it is defined, here.
8744f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef void* ExternalReferenceRedirectorPointer();
8844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
9144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Debug;
9244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Debugger;
9344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DebuggerAgent;
9444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
9544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \
9744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS)
9844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Redirection;
9944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Simulator;
10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
10144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
10344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Static indirection table for handles to constants.  If a frame
10444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// element represents a constant, the data contains an index into
10544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// this table of handles to the actual constants.
10644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Static indirection table for handles to constants.  If a Result
10744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// represents a constant, the data contains an index into this table
10844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// of handles to the actual constants.
10944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef ZoneList<Handle<Object> > ZoneObjectList;
11044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define RETURN_IF_SCHEDULED_EXCEPTION(isolate)            \
1123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  do {                                                    \
1133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Isolate* __isolate__ = (isolate);                     \
1143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (__isolate__->has_scheduled_exception()) {         \
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return __isolate__->PromoteScheduledException();    \
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                     \
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
11844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define RETURN_IF_EMPTY_HANDLE_VALUE(isolate, call, value) \
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  do {                                                     \
1213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if ((call).is_null()) {                                \
1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ASSERT((isolate)->has_pending_exception());          \
1233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return (value);                                      \
1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                      \
1253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
1263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define CHECK_NOT_EMPTY_HANDLE(isolate, call)     \
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  do {                                            \
1293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    ASSERT(!(isolate)->has_pending_exception());  \
1303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(!(call).is_null());                     \
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    CHECK(!(isolate)->has_pending_exception());   \
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (false)
13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define RETURN_IF_EMPTY_HANDLE(isolate, call)                       \
13544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RETURN_IF_EMPTY_HANDLE_VALUE(isolate, call, Failure::Exception())
13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
137589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define FOR_EACH_ISOLATE_ADDRESS_NAME(C)                \
138589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(Handler, handler)                                   \
139589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(CEntryFP, c_entry_fp)                               \
140589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(Context, context)                                   \
141589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(PendingException, pending_exception)                \
142589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(ExternalCaughtException, external_caught_exception) \
143589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  C(JSEntrySP, js_entry_sp)
14444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
14544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier.
1478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId {
1488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public:
1498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Creates an invalid ThreadId.
1508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadId() : id_(kInvalidId) {}
1518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns ThreadId for current thread.
1538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Current() { return ThreadId(GetCurrentThreadId()); }
1548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Returns invalid ThreadId (guaranteed not to be equal to any thread).
1568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId Invalid() { return ThreadId(kInvalidId); }
1578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Compares ThreadIds for equality.
1598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool Equals(const ThreadId& other) const) {
1608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return id_ == other.id_;
1618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
1628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Checks whether this ThreadId refers to any thread.
1648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  INLINE(bool IsValid() const) {
1658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return id_ != kInvalidId;
1668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
1678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
1698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::GetCurrentThreadId).
1708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int ToInteger() const { return id_; }
1718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts ThreadId to an integer representation
1738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // (required for public API: V8::V8::TerminateExecution).
1748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static ThreadId FromInteger(int id) { return ThreadId(id); }
1758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private:
1778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kInvalidId = -1;
1788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  explicit ThreadId(int id) : id_(id) {}
1808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int AllocateThreadId();
1828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static int GetCurrentThreadId();
1848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  int id_;
1868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static Atomic32 highest_thread_id_;
1888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class Isolate;
1908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch};
1918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
19344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED {
19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
1958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Does early low-level initialization that does not depend on the
1968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // isolate being present.
1978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadLocalTop();
1988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initialize the thread data.
20044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Initialize();
20144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the top C++ try catch handler or NULL if none are registered.
20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method is not guarenteed to return an address that can be
20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // used for comparison with addresses into the JS stack.  If such an
20644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // address is needed, use try_catch_handler_address.
20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::TryCatch* TryCatchHandler();
20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the address of the top C++ try catch handler or NULL if
21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // none are registered.
21144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  //
21244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method always returns an address that can be compared to
21344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // pointers into the JavaScript stack.  When running on actual
21444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // hardware, try_catch_handler_address and TryCatchHandler return
21544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the same pointer.  When running on a simulator with a separate JS
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // stack, try_catch_handler_address returns a JS stack address that
21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // corresponds to the place on the JS stack where the C++ handler
21844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // would have been if the stack were not separate.
21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address try_catch_handler_address() {
22044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return try_catch_handler_address_;
22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
22344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Set the address of the top C++ try catch handler.
22444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void set_try_catch_handler_address(Address address) {
22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    try_catch_handler_address_ = address;
22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
22744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
22844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Free() {
22944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!has_pending_message_);
23044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(!external_caught_exception_);
23144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(try_catch_handler_address_ == NULL);
23244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
23344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Isolate* isolate_;
23544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The context where the current execution method is created and for variable
23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // lookups.
23744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context_;
2388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadId thread_id_;
23944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MaybeObject* pending_exception_;
24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_pending_message_;
24144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* pending_message_obj_;
24244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Script* pending_message_script_;
24344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int pending_message_start_pos_;
24444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int pending_message_end_pos_;
24544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Use a separate value for scheduled exceptions to preserve the
24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // invariants that hold about pending_exception.  We may want to
24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // unify them later.
24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MaybeObject* scheduled_exception_;
24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool external_caught_exception_;
25044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* save_context_;
25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::TryCatch* catcher_;
25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Stack.
25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address c_entry_fp_;  // the frame pointer of the top c entry frame
25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address handler_;   // try-blocks are chained through the stack
25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR
25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS)
25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Simulator* simulator_;
26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // USE_SIMULATOR
26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address js_entry_sp_;  // the stack pointer of the bottom JS entry frame
26444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address external_callback_;  // the external callback we're currently in
26544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StateTag current_vm_state_;
26644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
26744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Generated code scratch locations.
26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int32_t formal_count_;
26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Call back function to report unsafe JS accesses.
27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::FailedAccessCheckCallback failed_access_check_callback_;
27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
2733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Head of the list of live LookupResults.
2743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LookupResult* top_lookup_result_;
2753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
27669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Whether out of memory exceptions should be ignored.
27769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool ignore_out_of_memory_;
27869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
2808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void InitializeInternal();
2818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address try_catch_handler_address_;
28344f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
28444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
28544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
28644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_DEBUGGER_INIT_LIST(V)                                          \
28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(v8::Debug::EventCallback, debug_event_callback, NULL)                      \
29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(DebuggerAgent*, debugger_agent_instance, NULL)
29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
29344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_DEBUGGER_INIT_LIST(V)
29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
29544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
29644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
29744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
29944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)                                       \
30044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CommentStatistic, paged_space_comments_statistics,                         \
30144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      CommentStatistic::kMaxComments + 1)
30244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
30344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
30644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V)                                             \
30944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* SerializerDeserializer state. */                                          \
31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Object*, serialize_partial_snapshot_cache, kPartialSnapshotCacheCapacity)  \
31144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize)     \
31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, bad_char_shift_table, kUC16AlphabetSize)                              \
31344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, good_suffix_shift_table, (kBMMaxShift + 1))                           \
31444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, suffix_table, (kBMMaxShift + 1))                                      \
3153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(uint32_t, private_random_seed, 2)                                          \
31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_DEBUG_ARRAY_LIST(V)
31744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
31844f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef List<HeapObject*, PreallocatedStorage> DebugObjectCache;
31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_LIST(V)                                                   \
32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* SerializerDeserializer state. */                                          \
32244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, serialize_partial_snapshot_cache_length, 0)                           \
32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* Assembler state. */                                                       \
32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* A previously allocated buffer of kMinimalBufferSize bytes, or NULL. */    \
32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(byte*, assembler_spare_buffer, NULL)                                       \
32644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(FatalErrorCallback, exception_behavior, NULL)                              \
327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, NULL)     \
32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(v8::Debug::MessageHandler, message_handler, NULL)                          \
32944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* To distinguish the function templates, so that we can find them in the */ \
33044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* function cache of the global context. */                                  \
33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int, next_serial_number, 0)                                                \
33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalReferenceRedirectorPointer*, external_reference_redirector, NULL)  \
33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(bool, always_allow_natives_syntax, false)                                  \
33444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* Part of the state of liveedit. */                                         \
33544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(FunctionInfoListener*, active_function_info_listener, NULL)                \
33644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* State for Relocatable. */                                                 \
33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Relocatable*, relocatable_top, NULL)                                       \
33844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* State for CodeEntry in profile-generator. */                              \
33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(CodeGenerator*, current_code_generator, NULL)                              \
34044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(bool, jump_target_compiling_deferred_code, false)                          \
34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(DebugObjectCache*, string_stream_debug_object_cache, NULL)                 \
34244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(Object*, string_stream_current_security_token, NULL)                       \
34344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* TODO(isolates): Release this on destruction? */                           \
34444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(int*, irregexp_interpreter_backtrack_stack_cache, NULL)                    \
34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* Serializer state. */                                                      \
34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(ExternalReferenceTable*, external_reference_table, NULL)                   \
34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  /* AstNode state. */                                                         \
3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  V(int, ast_node_id, 0)                                                       \
34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  V(unsigned, ast_node_count, 0)                                               \
3508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  /* SafeStackFrameIterator activations count. */                              \
3518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  V(int, safe_stack_iterator_counter, 0)                                       \
352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  V(uint64_t, enabled_cpu_features, 0)                                         \
3533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(CpuProfiler*, cpu_profiler, NULL)                                          \
3543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  V(HeapProfiler*, heap_profiler, NULL)                                        \
35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_DEBUGGER_INIT_LIST(V)
35644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate {
35844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These forward declarations are required to make the friend declarations in
35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // PerIsolateThreadData work on some older versions of gcc.
36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable;
36144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem;
36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~Isolate();
36444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A thread has a PerIsolateThreadData instance for each isolate that it has
36644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // entered. That instance is allocated when the isolate is initially entered
36744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // and reused on subsequent entries.
36844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class PerIsolateThreadData {
36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData(Isolate* isolate, ThreadId thread_id)
37144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : isolate_(isolate),
37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_id_(thread_id),
37344f0eee88ff00398ff7f715fab053374d808c90dSteve Block          stack_limit_(0),
37444f0eee88ff00398ff7f715fab053374d808c90dSteve Block          thread_state_(NULL),
37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \
37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS)
37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block          simulator_(NULL),
37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
37944f0eee88ff00398ff7f715fab053374d808c90dSteve Block          next_(NULL),
38044f0eee88ff00398ff7f715fab053374d808c90dSteve Block          prev_(NULL) { }
38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate() const { return isolate_; }
38244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id() const { return thread_id_; }
38344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void set_stack_limit(uintptr_t value) { stack_limit_ = value; }
38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    uintptr_t stack_limit() const { return stack_limit_; }
38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadState* thread_state() const { return thread_state_; }
38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void set_thread_state(ThreadState* value) { thread_state_ = value; }
38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \
38944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS)
39044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Simulator* simulator() const { return simulator_; }
39144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void set_simulator(Simulator* simulator) {
39244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      simulator_ = simulator;
39344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
39444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
39544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
39644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    bool Matches(Isolate* isolate, ThreadId thread_id) const {
3978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      return isolate_ == isolate && thread_id_.Equals(thread_id);
39844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
39944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
40044f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
40144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate_;
40244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadId thread_id_;
40344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    uintptr_t stack_limit_;
40444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadState* thread_state_;
40544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
40644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \
40744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS)
40844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Simulator* simulator_;
40944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* next_;
41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* prev_;
41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class Isolate;
41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class ThreadDataTable;
41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    friend class EntryStackItem;
41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData);
41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  enum AddressId {
423589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address,
424589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM)
42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef C
426589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    kIsolateAddressCount
42744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
42844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
42944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the PerIsolateThreadData for the current thread (or NULL if one is
43044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not currently set).
43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static PerIsolateThreadData* CurrentPerIsolateThreadData() {
43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return reinterpret_cast<PerIsolateThreadData*>(
43385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch        Thread::GetThreadLocal(per_isolate_thread_data_key_));
43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the isolate inside which the current thread is running.
43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  INLINE(static Isolate* Current()) {
43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* isolate = reinterpret_cast<Isolate*>(
43985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch        Thread::GetExistingThreadLocal(isolate_key_));
44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(isolate != NULL);
44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return isolate;
44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  INLINE(static Isolate* UncheckedCurrent()) {
44585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key_));
44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
44869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Usually called by Init(), but can be called early e.g. to allow
44969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // testing components that require logging but not the whole
45069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // isolate.
45169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  //
45269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Safe to call more than once.
45369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeLoggingAndCounters();
45469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool Init(Deserializer* des);
45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsInitialized() { return state_ == INITIALIZED; }
45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // True if at least one thread Enter'ed this isolate.
46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsInUse() { return entry_stack_ != NULL; }
46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Destroys the non-default isolates.
46344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Sets default isolate into "has_been_disposed" state rather then destroying,
46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for legacy API reasons.
46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TearDown();
46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  bool IsDefaultIsolate() const { return this == default_isolate_; }
46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Ensures that process-wide resources and the default isolate have been
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // allocated. It is only necessary to call this method in rare cases, for
47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // example if you are using V8 from within the body of a static initializer.
47244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Safe to call multiple times.
47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void EnsureDefaultIsolate();
47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Find the PerThread for this particular (isolate, thread) combination
476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // If one does not yet exist, return null.
477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PerIsolateThreadData* FindPerThreadDataForThisThread();
478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef ENABLE_DEBUGGER_SUPPORT
48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the debugger from the default isolate. Preinitializes the
48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // default isolate if needed.
48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Debugger* GetDefaultIsolateDebugger();
483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
48444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Get the stack guard from the default isolate. Preinitializes the
48644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // default isolate if needed.
48744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static StackGuard* GetDefaultIsolateStackGuard();
48844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
48944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store the pointer to the current isolate.
49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Used internally for V8 threads that do not execute JavaScript but still
49144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // are part of the domain of an isolate (like the context switcher).
49285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Thread::LocalStorageKey isolate_key() {
49385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return isolate_key_;
49485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
49544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
49644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the key used to store process-wide thread IDs.
49785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Thread::LocalStorageKey thread_id_key() {
49885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch    return thread_id_key_;
49985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  }
50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static Thread::LocalStorageKey per_isolate_thread_data_key();
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If a client attempts to create a Locker without specifying an isolate,
50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // we assume that the client is using legacy behavior. Set up the current
50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // thread to be inside the implicit isolate (or fail a check if we have
50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // switched to non-legacy behavior).
50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void EnterDefaultIsolate();
50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Mutex for serializing access to break control structures.
51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Mutex* break_access() { return break_access_; }
51144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
51269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Mutex for serializing access to debugger.
51369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Mutex* debugger_access() { return debugger_access_; }
51469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
51544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address get_address_from_id(AddressId id);
51644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
51744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to top context (where the current function object was created).
51844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context* context() { return thread_local_top_.context_; }
51944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_context(Context* context) {
5203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(context == NULL || context->IsContext());
52144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.context_ = context;
52244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Context** context_address() { return &thread_local_top_.context_; }
52444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
52544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* save_context() {return thread_local_top_.save_context_; }
52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_save_context(SaveContext* save) {
52744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.save_context_ = save;
52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Access to current thread id.
5318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  ThreadId thread_id() { return thread_local_top_.thread_id_; }
5328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void set_thread_id(ThreadId id) { thread_local_top_.thread_id_ = id; }
53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Interface to pending exception.
53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MaybeObject* pending_exception() {
53644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(has_pending_exception());
53744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.pending_exception_;
53844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool external_caught_exception() {
54044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.external_caught_exception_;
54144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
5428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void set_external_caught_exception(bool value) {
5438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    thread_local_top_.external_caught_exception_ = value;
5448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
54544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_pending_exception(MaybeObject* exception) {
54644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.pending_exception_ = exception;
54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
54844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void clear_pending_exception() {
54944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.pending_exception_ = heap_.the_hole_value();
55044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
55144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MaybeObject** pending_exception_address() {
55244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.pending_exception_;
55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_pending_exception() {
55544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return !thread_local_top_.pending_exception_->IsTheHole();
55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
55744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void clear_pending_message() {
55844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.has_pending_message_ = false;
55944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.pending_message_obj_ = heap_.the_hole_value();
56044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.pending_message_script_ = NULL;
56144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
56244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::TryCatch* try_catch_handler() {
56344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.TryCatchHandler();
56444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
56544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address try_catch_handler_address() {
56644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.try_catch_handler_address();
56744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
56844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool* external_caught_exception_address() {
56944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.external_caught_exception_;
57044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
5718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  v8::TryCatch* catcher() {
5728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return thread_local_top_.catcher_;
5738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
5748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void set_catcher(v8::TryCatch* catcher) {
5758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    thread_local_top_.catcher_ = catcher;
5768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
57844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MaybeObject** scheduled_exception_address() {
57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.scheduled_exception_;
58044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
58144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MaybeObject* scheduled_exception() {
58244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(has_scheduled_exception());
58344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.scheduled_exception_;
58444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
58544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool has_scheduled_exception() {
5863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return thread_local_top_.scheduled_exception_ != heap_.the_hole_value();
58744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
58844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void clear_scheduled_exception() {
58944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.scheduled_exception_ = heap_.the_hole_value();
59044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool IsExternallyCaught();
59344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_catchable_by_javascript(MaybeObject* exception) {
59544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return (exception != Failure::OutOfMemoryException()) &&
59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        (exception != heap()->termination_exception());
59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
59944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JS execution stack (see frames.h).
60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address c_entry_fp(ThreadLocalTop* thread) {
60144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread->c_entry_fp_;
60244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address handler(ThreadLocalTop* thread) { return thread->handler_; }
60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* c_entry_fp_address() {
60644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.c_entry_fp_;
60744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
60844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* handler_address() { return &thread_local_top_.handler_; }
60944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
61044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Bottom JS entry (see StackTracer::Trace in log.cc).
61144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Address js_entry_sp(ThreadLocalTop* thread) {
61244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread->js_entry_sp_;
61344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline Address* js_entry_sp_address() {
61544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &thread_local_top_.js_entry_sp_;
61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
61844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Generated code scratch locations.
61944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void* formal_count_address() { return &thread_local_top_.formal_count_; }
62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global object of the current context. It could be
6223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // a builtin object, or a JS global object.
62344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<GlobalObject> global() {
62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Handle<GlobalObject>(context()->global());
62544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global proxy object of the current context.
62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Object* global_proxy() {
62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return context()->global_proxy();
63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSBuiltinsObject> js_builtins_object() {
63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Handle<JSBuiltinsObject>(thread_local_top_.context_->builtins());
63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
63544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
63644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); }
63744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FreeThreadResources() { thread_local_top_.Free(); }
63844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
63944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This method is called by the api after operations that may throw
64044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // exceptions.  If an exception was thrown and not handled by an external
64144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // handler the exception is scheduled to be rethrown when we return to running
64244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // JavaScript code.  If an exception is scheduled true is returned.
64344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool OptionalRescheduleException(bool is_bottom_call);
64444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  class ExceptionScope {
6468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   public:
6478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    explicit ExceptionScope(Isolate* isolate) :
6488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      // Scope currently can only be used for regular exceptions, not
6498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      // failures like OOM or termination exception.
6508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      isolate_(isolate),
6518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      pending_exception_(isolate_->pending_exception()->ToObjectUnchecked()),
6528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      catcher_(isolate_->catcher())
6538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    { }
6548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    ~ExceptionScope() {
6568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      isolate_->set_catcher(catcher_);
6578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      isolate_->set_pending_exception(*pending_exception_);
6588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    }
6598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
6608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch   private:
6618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Isolate* isolate_;
6628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    Handle<Object> pending_exception_;
6638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    v8::TryCatch* catcher_;
6648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  };
6658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
66644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetCaptureStackTraceForUncaughtExceptions(
66744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      bool capture,
66844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
67144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Tells whether the current context has experienced an out of memory
67244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // exception.
67344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool is_out_of_memory();
67469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  bool ignore_out_of_memory() {
67569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return thread_local_top_.ignore_out_of_memory_;
67669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
67769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void set_ignore_out_of_memory(bool value) {
67869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    thread_local_top_.ignore_out_of_memory_ = value;
67969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
68044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
68144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintCurrentStackTrace(FILE* out);
68244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintStackTrace(FILE* out, char* thread_data);
68344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintStack(StringStream* accumulator);
68444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintStack();
68544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<String> StackTraceString();
68644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<JSArray> CaptureCurrentStackTrace(
68744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int frame_limit,
68844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      StackTrace::StackTraceOptions options);
68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void CaptureAndSetCurrentStackTraceFor(Handle<JSObject> error_object);
6913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
69244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns if the top context may access the given global object. If
69344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the result is false, the pending exception is guaranteed to be
69444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // set.
69544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool MayNamedAccess(JSObject* receiver,
69644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                      Object* key,
69744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                      v8::AccessType type);
69844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool MayIndexedAccess(JSObject* receiver,
69944f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        uint32_t index,
70044f0eee88ff00398ff7f715fab053374d808c90dSteve Block                        v8::AccessType type);
70144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
70244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback);
70344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ReportFailedAccessCheck(JSObject* receiver, v8::AccessType type);
70444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
70544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exception throwing support. The caller should use the result
70644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // of Throw() as its return value.
70744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Failure* Throw(Object* exception, MessageLocation* location = NULL);
70844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Re-throw an exception.  This involves no error reporting since
70944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // error reporting was handled when the exception was thrown
71044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // originally.
71144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Failure* ReThrow(MaybeObject* exception, MessageLocation* location = NULL);
71244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ScheduleThrow(Object* exception);
71344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ReportPendingMessages();
71444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Failure* ThrowIllegalOperation();
71544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
71644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Promote a scheduled exception to pending. Asserts has_scheduled_exception.
71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Failure* PromoteScheduledException();
7183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void DoThrow(Object* exception, MessageLocation* location);
71944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Checks if exception should be reported and finds out if it's
72044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // caught externally.
72144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool ShouldReportException(bool* can_be_caught_externally,
72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                             bool catchable_by_javascript);
72344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
72444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Attempts to compute the current source location, storing the
72544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // result in the target out parameter.
72644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void ComputeLocation(MessageLocation* target);
72744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
72844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Override command line flag.
72944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void TraceException(bool flag);
73044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
73144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Out of resource exception helpers.
73244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Failure* StackOverflow();
73344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Failure* TerminateExecution();
73444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
73544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Administration
73644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v);
73744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Iterate(ObjectVisitor* v, ThreadLocalTop* t);
73844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* Iterate(ObjectVisitor* v, char* t);
73944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateThread(ThreadVisitor* v);
74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void IterateThread(ThreadVisitor* v, char* t);
74144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the current global context.
74444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> global_context();
74544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
74644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns the global context of the calling JavaScript code.  That
74744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is, the global context of the top-most JavaScript frame.
74844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> GetCallingGlobalContext();
74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
75044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void RegisterTryCatchHandler(v8::TryCatch* that);
75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void UnregisterTryCatchHandler(v8::TryCatch* that);
75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
75344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* ArchiveThread(char* to);
75444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  char* RestoreThread(char* from);
75544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
75644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const char* const kStackOverflowMessage;
75744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
75844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kUC16AlphabetSize = 256;  // See StringSearchBase.
75944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kBMMaxShift = 250;        // See StringSearchBase.
76044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Accessors.
76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue)                       \
76344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type name() const {                                            \
76444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return name##_;                                                     \
76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }                                                                     \
76744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline void set_##name(type value) {                                  \
76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    name##_ = value;                                                    \
77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
77144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_ACCESSOR)
77244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR
77344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
77444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length)                       \
77544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  inline type* name() {                                                 \
77644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(OFFSET_OF(Isolate, name##_) == name##_debug_offset_);        \
77744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &(name##_)[0];                                               \
77844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
77944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR)
78044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR
78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_CONTEXT_FIELD_ACCESSOR(index, type, name)      \
78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<type> name() {                                       \
78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return Handle<type>(context()->global_context()->name()); \
78544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GLOBAL_CONTEXT_FIELDS(GLOBAL_CONTEXT_FIELD_ACCESSOR)
78744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_CONTEXT_FIELD_ACCESSOR
78844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper() { return bootstrapper_; }
79069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Counters* counters() {
79169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
79269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
79369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ASSERT(counters_ != NULL);
79469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return counters_;
79569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
79644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CodeRange* code_range() { return code_range_; }
79744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler() { return runtime_profiler_; }
79844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache() { return compilation_cache_; }
79969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Logger* logger() {
80069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // Call InitializeLoggingAndCounters() if logging is needed before
80169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    // the isolate is fully initialized.
80269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    ASSERT(logger_ != NULL);
80369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return logger_;
80469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
80544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard() { return &stack_guard_; }
80644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Heap* heap() { return &heap_; }
80769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  StatsTable* stats_table();
80844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StubCache* stub_cache() { return stub_cache_; }
80944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; }
81044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop* thread_local_top() { return &thread_local_top_; }
81144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
81244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  TranscendentalCache* transcendental_cache() const {
81344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return transcendental_cache_;
81444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
81544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
81644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MemoryAllocator* memory_allocator() {
81744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return memory_allocator_;
81844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
81944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
82044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  KeyedLookupCache* keyed_lookup_cache() {
82144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return keyed_lookup_cache_;
82244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
82344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
82444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache() {
82544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return context_slot_cache_;
82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
82744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
82844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache() {
82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return descriptor_lookup_cache_;
83044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::ImplementationUtilities::HandleScopeData* handle_scope_data() {
83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &handle_scope_data_;
83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer() {
83644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(handle_scope_implementer_);
83744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return handle_scope_implementer_;
83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Zone* zone() { return &zone_; }
84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache() {
8428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return unicode_cache_;
84344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
84444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache() {
8463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return inner_pointer_to_code_cache_;
8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
84944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringInputBuffer* write_input_buffer() { return write_input_buffer_; }
85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
85144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles() { return global_handles_; }
85244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
85344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadManager* thread_manager() { return thread_manager_; }
85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
85544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSwitcher* context_switcher() { return context_switcher_; }
85644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_context_switcher(ContextSwitcher* switcher) {
85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    context_switcher_ = switcher;
85944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringTracker* string_tracker() { return string_tracker_; }
86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() {
86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_uncanonicalize_;
86544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
86744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() {
86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &jsregexp_canonrange_;
86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringInputBuffer* objects_string_compare_buffer_a() {
87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &objects_string_compare_buffer_a_;
87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringInputBuffer* objects_string_compare_buffer_b() {
87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &objects_string_compare_buffer_b_;
87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
87944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StaticResource<StringInputBuffer>* objects_string_input_buffer() {
88044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &objects_string_input_buffer_;
88144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
88244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState* runtime_state() { return &runtime_state_; }
88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_fp_stubs_generated(bool value) {
8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    fp_stubs_generated_ = value;
8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool fp_stubs_generated() { return fp_stubs_generated_; }
8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StaticResource<SafeStringInputBuffer>* compiler_safe_string_input_buffer() {
89244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &compiler_safe_string_input_buffer_;
89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins* builtins() { return &builtins_; }
89644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void NotifyExtensionInstalled() {
8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    has_installed_extensions_ = true;
8993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_installed_extensions() { return has_installed_extensions_; }
9023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize() {
90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &regexp_macro_assembler_canonicalize_;
90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack() { return regexp_stack_; }
90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>*
91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      interp_canonicalize_mapping() {
91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &interp_canonicalize_mapping_;
91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
91444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void* PreallocatedStorageNew(size_t size);
91644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PreallocatedStorageDelete(void* p);
91744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PreallocatedStorageInit(size_t size);
91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
92069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Debugger* debugger() {
92169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (!NoBarrier_Load(&debugger_initialized_)) InitializeDebugger();
92269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return debugger_;
92369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
92469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Debug* debug() {
92569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (!NoBarrier_Load(&debugger_initialized_)) InitializeDebugger();
92669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    return debug_;
92769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
92844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
92944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
9303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  inline bool IsDebuggerActive();
931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  inline bool DebuggerHasBreakPoints();
932257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
93344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
93444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo* heap_histograms() { return heap_histograms_; }
93544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation* js_spill_information() {
93744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return &js_spill_information_;
93844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int* code_kind_statistics() { return code_kind_statistics_; }
94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \
94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__)
94544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool simulator_initialized() { return simulator_initialized_; }
94644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_simulator_initialized(bool initialized) {
94744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    simulator_initialized_ = initialized;
94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
94944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
95044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HashMap* simulator_i_cache() { return simulator_i_cache_; }
95144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_simulator_i_cache(HashMap* hash_map) {
95244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    simulator_i_cache_ = hash_map;
95344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
95444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
95544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Redirection* simulator_redirection() {
95644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return simulator_redirection_;
95744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
95844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_simulator_redirection(Redirection* redirection) {
95944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    simulator_redirection_ = redirection;
96044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
96144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
96244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
96344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Factory* factory() { return reinterpret_cast<Factory*>(this); }
96444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
96544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // SerializerDeserializer state.
96644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kPartialSnapshotCacheCapacity = 1400;
96744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
96844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const int kJSRegexpStaticOffsetsVectorSize = 50;
96944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
97044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Address external_callback() {
97144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.external_callback_;
97244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
97344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void set_external_callback(Address callback) {
97444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.external_callback_ = callback;
97544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
97644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
97744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StateTag current_vm_state() {
97844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return thread_local_top_.current_vm_state_;
97944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
98044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
98144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void SetCurrentVMState(StateTag state) {
98244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (RuntimeProfiler::IsEnabled()) {
9833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      // Make sure thread local top is initialized.
9843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      ASSERT(thread_local_top_.isolate_ == this);
9858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      StateTag current_state = thread_local_top_.current_vm_state_;
9868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      if (current_state != JS && state == JS) {
9878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        // Non-JS -> JS transition.
98844f0eee88ff00398ff7f715fab053374d808c90dSteve Block        RuntimeProfiler::IsolateEnteredJS(this);
9898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      } else if (current_state == JS && state != JS) {
99044f0eee88ff00398ff7f715fab053374d808c90dSteve Block        // JS -> non-JS transition.
99144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        ASSERT(RuntimeProfiler::IsSomeIsolateInJS());
99244f0eee88ff00398ff7f715fab053374d808c90dSteve Block        RuntimeProfiler::IsolateExitedJS(this);
9938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      } else {
9948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        // Other types of state transitions are not interesting to the
9958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        // runtime profiler, because they don't affect whether we're
9968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        // in JS or not.
9978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch        ASSERT((current_state == JS) == (state == JS));
99844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
99944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
100044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    thread_local_top_.current_vm_state_ = state;
100144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
100244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1003257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void SetData(void* data) { embedder_data_ = data; }
1004257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void* GetData() { return embedder_data_; }
1005257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LookupResult* top_lookup_result() {
10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return thread_local_top_.top_lookup_result_;
10083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void SetTopLookupResult(LookupResult* top) {
10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    thread_local_top_.top_lookup_result_ = top;
10113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool context_exit_happened() {
10143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return context_exit_happened_;
10153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_context_exit_happened(bool context_exit_happened) {
10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    context_exit_happened_ = context_exit_happened;
10183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  double time_millis_since_init() {
10213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return OS::TimeCurrentMillis() - time_millis_at_init_;
10223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DateCache* date_cache() {
10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return date_cache_;
10263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  void set_date_cache(DateCache* date_cache) {
10293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (date_cache != date_cache_) {
10303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      delete date_cache_;
10313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
10323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    date_cache_ = date_cache;
10333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
10343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
103544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
103644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate();
103744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct GlobalState;
10393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  friend struct InitializeGlobalState;
10403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
104144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The per-process lock should be acquired before the ThreadDataTable is
104244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // modified.
104344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class ThreadDataTable {
104444f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
104544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ThreadDataTable();
104644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ~ThreadDataTable();
104744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
104844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id);
104944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Insert(PerIsolateThreadData* data);
105044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Remove(Isolate* isolate, ThreadId thread_id);
105144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    void Remove(PerIsolateThreadData* data);
10523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    void RemoveAllThreads(Isolate* isolate);
105344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
105444f0eee88ff00398ff7f715fab053374d808c90dSteve Block   private:
105544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* list_;
105644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
105744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
105844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // These items form a stack synchronously with threads Enter'ing and Exit'ing
105944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // the Isolate. The top of the stack points to a thread which is currently
106044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // running the Isolate. When the stack is empty, the Isolate is considered
106144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // not entered by any thread and can be Disposed.
106244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If the same thread enters the Isolate more then once, the entry_count_
106344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // is incremented rather then a new item pushed to the stack.
106444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  class EntryStackItem {
106544f0eee88ff00398ff7f715fab053374d808c90dSteve Block   public:
106644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem(PerIsolateThreadData* previous_thread_data,
106744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   Isolate* previous_isolate,
106844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                   EntryStackItem* previous_item)
106944f0eee88ff00398ff7f715fab053374d808c90dSteve Block        : entry_count(1),
107044f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_thread_data(previous_thread_data),
107144f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_isolate(previous_isolate),
107244f0eee88ff00398ff7f715fab053374d808c90dSteve Block          previous_item(previous_item) { }
107344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
107444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    int entry_count;
107544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    PerIsolateThreadData* previous_thread_data;
107644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Isolate* previous_isolate;
107744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    EntryStackItem* previous_item;
107844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
10793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch   private:
108044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    DISALLOW_COPY_AND_ASSIGN(EntryStackItem);
108144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
108244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
108385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  // This mutex protects highest_thread_id_, thread_data_table_ and
108485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  // default_isolate_.
108585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Mutex* process_wide_mutex_;
108685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
108785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Thread::LocalStorageKey per_isolate_thread_data_key_;
108885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Thread::LocalStorageKey isolate_key_;
108985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Thread::LocalStorageKey thread_id_key_;
109085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static Isolate* default_isolate_;
109185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch  static ThreadDataTable* thread_data_table_;
109285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch
109344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Deinit();
109444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
109544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void SetIsolateThreadLocals(Isolate* isolate,
109644f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                     PerIsolateThreadData* data);
109744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
109844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  enum State {
109944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    UNINITIALIZED,    // Some components may not have been allocated.
110044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    INITIALIZED       // All components are fully initialized.
110144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  };
110244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
110344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  State state_;
110444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  EntryStackItem* entry_stack_;
110544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
110644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Allocate and insert PerIsolateThreadData into the ThreadDataTable
110744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // (regardless of whether such data already exists).
110844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PerIsolateThreadData* AllocatePerIsolateThreadData(ThreadId thread_id);
110944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
111044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Find the PerThread for this particular (isolate, thread) combination.
111144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // If one does not yet exist, allocate a new one.
111244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread();
111344f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // PreInits and returns a default isolate. Needed when a new thread tries
111544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // to create a Locker for the first time (the lock itself is in the isolate).
111644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static Isolate* GetDefaultIsolateForLocking();
111744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
111844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Initializes the current thread to run this Isolate.
111944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
112044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
112144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Enter();
112244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
112344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Exits the current thread. The previosuly entered Isolate is restored
112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // for the thread.
112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Not thread-safe. Multiple threads should not Enter/Exit the same isolate
112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // at the same time, this should be prevented using external locking.
112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void Exit();
112844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PreallocatedMemoryThreadStart();
113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PreallocatedMemoryThreadStop();
113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void InitializeThreadLocal();
113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void PrintStackTrace(FILE* out, ThreadLocalTop* thread);
113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactPrologue(bool is_compacting,
113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void MarkCompactEpilogue(bool is_compacting,
113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block                           ThreadLocalTop* archived_thread_data);
113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  void FillCache();
114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
11418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  void PropagatePendingExceptionToExternalTryCatch();
11428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
114369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  void InitializeDebugger();
114469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
11453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Traverse prototype chain to find out whether the object is derived from
11463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // the Error object.
11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsErrorObject(Handle<Object> obj);
11483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_nesting_level_;
115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringStream* incomplete_message_;
115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // The preallocated memory thread singleton.
115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PreallocatedMemoryThread* preallocated_memory_thread_;
1153589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  Address isolate_addresses_[kIsolateAddressCount + 1];  // NOLINT
115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  NoAllocationStringAllocator* preallocated_message_space_;
115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
115644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Bootstrapper* bootstrapper_;
115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeProfiler* runtime_profiler_;
115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CompilationCache* compilation_cache_;
115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Counters* counters_;
116044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  CodeRange* code_range_;
116144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Mutex* break_access_;
116269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Atomic32 debugger_initialized_;
116369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Mutex* debugger_access_;
116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Heap heap_;
116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Logger* logger_;
116644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard stack_guard_;
116744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StatsTable* stats_table_;
116844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StubCache* stub_cache_;
116944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DeoptimizerData* deoptimizer_data_;
117044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadLocalTop thread_local_top_;
117144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool capture_stack_trace_for_uncaught_exceptions_;
117244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int stack_trace_for_uncaught_exceptions_frame_limit_;
117344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_;
117444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  TranscendentalCache* transcendental_cache_;
117544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  MemoryAllocator* memory_allocator_;
117644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  KeyedLookupCache* keyed_lookup_cache_;
117744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSlotCache* context_slot_cache_;
117844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DescriptorLookupCache* descriptor_lookup_cache_;
117944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  v8::ImplementationUtilities::HandleScopeData handle_scope_data_;
118044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScopeImplementer* handle_scope_implementer_;
11818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  UnicodeCache* unicode_cache_;
118244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Zone zone_;
118344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PreallocatedStorage in_use_list_;
118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  PreallocatedStorage free_list_;
118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool preallocated_storage_preallocated_;
11863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  InnerPointerToCodeCache* inner_pointer_to_code_cache_;
118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringInputBuffer* write_input_buffer_;
118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  GlobalHandles* global_handles_;
118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ContextSwitcher* context_switcher_;
119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ThreadManager* thread_manager_;
119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RuntimeState runtime_state_;
11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool fp_stubs_generated_;
119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StaticResource<SafeStringInputBuffer> compiler_safe_string_input_buffer_;
119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Builtins builtins_;
11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool has_installed_extensions_;
119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringTracker* string_tracker_;
119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_;
119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_;
119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringInputBuffer objects_string_compare_buffer_a_;
120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StringInputBuffer objects_string_compare_buffer_b_;
120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StaticResource<StringInputBuffer> objects_string_input_buffer_;
120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize>
120344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      regexp_macro_assembler_canonicalize_;
120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  RegExpStack* regexp_stack_;
12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DateCache* date_cache_;
12073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
120844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  unibrow::Mapping<unibrow::Ecma262Canonicalize> interp_canonicalize_mapping_;
1209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  void* embedder_data_;
121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The garbage collector should be a little more aggressive when it knows
12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // that a context was recently exited.
12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool context_exit_happened_;
12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
12153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Time stamp at initialization.
12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  double time_millis_at_init_;
12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \
121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__)
122044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool simulator_initialized_;
122144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HashMap* simulator_i_cache_;
122244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Redirection* simulator_redirection_;
122344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
122444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
122544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // A static array of histogram info for each type.
122744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HistogramInfo heap_histograms_[LAST_TYPE + 1];
122844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  JSObject::SpillInformation js_spill_information_;
122944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  int code_kind_statistics_[Code::NUMBER_OF_KINDS];
123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT
123344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Debugger* debugger_;
123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Debug* debug_;
123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue)                         \
123844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_;
123944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE)
124044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE
124144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
124244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length)                         \
124344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  type name##_[length];
124444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE)
124544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE
124644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
124744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
124844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // This class is huge and has a number of fields controlled by
124944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // preprocessor defines. Make sure the offsets of these fields agree
125044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // between compilation units.
125144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored)                              \
125244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static const intptr_t name##_debug_offset_;
125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
125444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET
125644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
125744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
125844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class ExecutionAccess;
125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class IsolateInitializer;
1260257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class ThreadManager;
1261257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class Simulator;
1262257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class StackGuard;
12638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  friend class ThreadId;
126469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  friend class TestMemoryAllocatorScope;
126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Isolate;
126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  friend class v8::Locker;
1267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  friend class v8::Unlocker;
126844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
126944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  DISALLOW_COPY_AND_ASSIGN(Isolate);
127044f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
127144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the
127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these
127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details.
127644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED {
127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  inline explicit SaveContext(Isolate* isolate);
127944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
128044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~SaveContext() {
128144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (context_.is_null()) {
128244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Isolate* isolate = Isolate::Current();
128344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate->set_context(NULL);
128444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate->set_save_context(prev_);
128544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    } else {
128644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      Isolate* isolate = context_->GetIsolate();
128744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate->set_context(*context_);
128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      isolate->set_save_context(prev_);
128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context() { return context_; }
129344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev() { return prev_; }
129444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  // Returns true if this save context is below a given JavaScript frame.
12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool IsBelowFrame(JavaScriptFrame* frame) {
12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp());
129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
129944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
130044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
130144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
130244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if __GNUC_VERSION__ >= 40100 && __GNUC_VERSION__ < 40300
130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> dummy_;
130444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
130544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SaveContext* prev_;
13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Address c_entry_fp_;
130744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
130844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
130944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
131044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED {
131144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG
131244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
131344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  AssertNoContextChange() :
131444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      scope_(Isolate::Current()),
131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      context_(Isolate::Current()->context(), Isolate::Current()) {
131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~AssertNoContextChange() {
131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    ASSERT(Isolate::Current()->context() == *context_);
132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
132144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
132244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
132344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HandleScope scope_;
132444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Handle<Context> context_;
132544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else
132644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
132744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  AssertNoContextChange() { }
132844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif
132944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
133044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
133144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
133244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED {
133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
133444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) {
133544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Lock(isolate);
133644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
133744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~ExecutionAccess() { Unlock(isolate_); }
133844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
133944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void Lock(Isolate* isolate) { isolate->break_access_->Lock(); }
134044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static void Unlock(Isolate* isolate) { isolate->break_access_->Unlock(); }
134144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
134244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  static bool TryLock(Isolate* isolate) {
134344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return isolate->break_access_->TryLock();
134444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
134544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
134644f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
134744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
134844f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
134944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
135044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
135144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for checking for stack-overflows in C++ code.
135244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED {
135344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
135444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { }
135544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
135644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  bool HasOverflowed() const {
135744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StackGuard* stack_guard = isolate_->stack_guard();
135844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // Stack has overflowed in C++ code only if stack pointer exceeds the C++
135944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // stack guard and the limits are not set to interrupt values.
136044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // TODO(214): Stack overflows are ignored if a interrupt is pending. This
136144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    // code should probably always use the initial C++ limit.
136244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    return (reinterpret_cast<uintptr_t>(this) < stack_guard->climit()) &&
136344f0eee88ff00398ff7f715fab053374d808c90dSteve Block           stack_guard->IsStackOverflow();
136444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
136644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  Isolate* isolate_;
136744f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
136844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
136944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
137044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost
137144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any
137244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into
137344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account.
137444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED {
137544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public:
137644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  explicit PostponeInterruptsScope(Isolate* isolate)
137744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      : stack_guard_(isolate->stack_guard()) {
137844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    stack_guard_->thread_local_.postpone_interrupts_nesting_++;
137944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    stack_guard_->DisableInterrupts();
138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
138244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  ~PostponeInterruptsScope() {
138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (--stack_guard_->thread_local_.postpone_interrupts_nesting_ == 0) {
138444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stack_guard_->EnableInterrupts();
138544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
138644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
138744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private:
138844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  StackGuard* stack_guard_;
138944f0eee88ff00398ff7f715fab053374d808c90dSteve Block};
139044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
139144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
139244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Temporary macros for accessing current isolate and its subobjects.
139344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// They provide better readability, especially when used a lot in the code.
139444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define HEAP (v8::internal::Isolate::Current()->heap())
139544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define FACTORY (v8::internal::Isolate::Current()->factory())
139644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE (v8::internal::Isolate::Current())
139744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ZONE (v8::internal::Isolate::Current()->zone())
139844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define LOGGER (v8::internal::Isolate::Current()->logger())
139944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Tells whether the global context is marked with out of memory.
140244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockinline bool Context::has_out_of_memory() {
140344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return global_context()->out_of_memory()->IsTrue();
140444f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
140744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Mark the global context with out of memory.
140844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockinline void Context::mark_out_of_memory() {
140944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  global_context()->set_out_of_memory(HEAP->true_value());
141044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} }  // namespace v8::internal
141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif  // V8_ISOLATE_H_
1416