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 ®exp_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