isolate.h revision 44f0eee88ff00398ff7f715fab053374d808c90d
144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Copyright 2010 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" 3944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "global-handles.h" 4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "handles.h" 4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "heap.h" 4244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "regexp-stack.h" 4344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "runtime-profiler.h" 4444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "runtime.h" 4544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "zone.h" 4644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4744f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 { 4844f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal { 4944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 5044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AstSentinels; 5144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper; 5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator; 5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange; 5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache; 5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache; 5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSwitcher; 5744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters; 5844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures; 5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler; 6044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData; 6144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer; 6244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement; 6344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable; 6444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory; 6544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass FunctionInfoListener; 6644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HandleScopeImplementer; 6744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapProfiler; 6844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass InlineRuntimeFunctionsTable; 6944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass NoAllocationStringAllocator; 7044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PcToCodeCache; 7144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PreallocatedMemoryThread; 7244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ProducerHeapProfile; 7344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpStack; 7444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext; 7544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ScannerConstants; 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 11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define RETURN_IF_SCHEDULED_EXCEPTION(isolate) \ 11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (isolate->has_scheduled_exception()) \ 11344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate->PromoteScheduledException() 11444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 11544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define RETURN_IF_EMPTY_HANDLE_VALUE(isolate, call, value) \ 11644f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (call.is_null()) { \ 11744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(isolate->has_pending_exception()); \ 11844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return value; \ 11944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 12044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 12144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define RETURN_IF_EMPTY_HANDLE(isolate, call) \ 12244f0eee88ff00398ff7f715fab053374d808c90dSteve Block RETURN_IF_EMPTY_HANDLE_VALUE(isolate, call, Failure::Exception()) 12344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 12444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_ADDRESS_LIST(C) \ 12544f0eee88ff00398ff7f715fab053374d808c90dSteve Block C(handler_address) \ 12644f0eee88ff00398ff7f715fab053374d808c90dSteve Block C(c_entry_fp_address) \ 12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block C(context_address) \ 12844f0eee88ff00398ff7f715fab053374d808c90dSteve Block C(pending_exception_address) \ 12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block C(external_caught_exception_address) 13044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_ADDRESS_LIST_PROF(C) \ 13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block C(js_entry_sp_address) 13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 13544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_ADDRESS_LIST_PROF(C) 13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 13744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED { 14044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initialize the thread data. 14244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Initialize(); 14344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 14444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the top C++ try catch handler or NULL if none are registered. 14544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 14644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method is not guarenteed to return an address that can be 14744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // used for comparison with addresses into the JS stack. If such an 14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // address is needed, use try_catch_handler_address. 14944f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::TryCatch* TryCatchHandler(); 15044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the address of the top C++ try catch handler or NULL if 15244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // none are registered. 15344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 15444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method always returns an address that can be compared to 15544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // pointers into the JavaScript stack. When running on actual 15644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // hardware, try_catch_handler_address and TryCatchHandler return 15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the same pointer. When running on a simulator with a separate JS 15844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // stack, try_catch_handler_address returns a JS stack address that 15944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // corresponds to the place on the JS stack where the C++ handler 16044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // would have been if the stack were not separate. 16144f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address try_catch_handler_address() { 16244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return try_catch_handler_address_; 16344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 16444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 16544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Set the address of the top C++ try catch handler. 16644f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_try_catch_handler_address(Address address) { 16744f0eee88ff00398ff7f715fab053374d808c90dSteve Block try_catch_handler_address_ = address; 16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 16944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 17044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Free() { 17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!has_pending_message_); 17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!external_caught_exception_); 17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(try_catch_handler_address_ == NULL); 17444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 17644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The context where the current execution method is created and for variable 17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // lookups. 17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context_; 17944f0eee88ff00398ff7f715fab053374d808c90dSteve Block int thread_id_; 18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block MaybeObject* pending_exception_; 18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_pending_message_; 18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block const char* pending_message_; 18344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* pending_message_obj_; 18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Script* pending_message_script_; 18544f0eee88ff00398ff7f715fab053374d808c90dSteve Block int pending_message_start_pos_; 18644f0eee88ff00398ff7f715fab053374d808c90dSteve Block int pending_message_end_pos_; 18744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Use a separate value for scheduled exceptions to preserve the 18844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // invariants that hold about pending_exception. We may want to 18944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // unify them later. 19044f0eee88ff00398ff7f715fab053374d808c90dSteve Block MaybeObject* scheduled_exception_; 19144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool external_caught_exception_; 19244f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* save_context_; 19344f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::TryCatch* catcher_; 19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Stack. 19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address c_entry_fp_; // the frame pointer of the top c entry frame 19744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address handler_; // try-blocks are chained through the stack 19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR 20044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) 20144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // USE_SIMULATOR 20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 20644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address js_entry_sp_; // the stack pointer of the bottom js entry frame 20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address external_callback_; // the external callback we're currently in 20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_VMSTATE_TRACKING 21144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StateTag current_vm_state_; 21244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 21344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 21444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Generated code scratch locations. 21544f0eee88ff00398ff7f715fab053374d808c90dSteve Block int32_t formal_count_; 21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Call back function to report unsafe JS accesses. 21844f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::FailedAccessCheckCallback failed_access_check_callback_; 21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 22044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address try_catch_handler_address_; 22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 22344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 22444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS) 22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_PLATFORM_INIT_LIST(V) \ 22744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* VirtualFrame::SpilledScope state */ \ 22844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(bool, is_virtual_frame_in_spilled_scope, false) \ 22944f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* CodeGenerator::EmitNamedStore state */ \ 23044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, inlined_write_barrier_size, -1) 23144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 23244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && !defined(__mips__) 23344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HashMap; 23444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 23544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 23744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 23844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_PLATFORM_INIT_LIST(V) 23944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 24144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 24344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_DEBUGGER_INIT_LIST(V) \ 24544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(v8::Debug::EventCallback, debug_event_callback, NULL) \ 24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(DebuggerAgent*, debugger_agent_instance, NULL) 24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_DEBUGGER_INIT_LIST(V) 25044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) \ 25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(CommentStatistic, paged_space_comments_statistics, \ 25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block CommentStatistic::kMaxComments + 1) 25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 26544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_LOGGING_INIT_LIST(V) \ 26744f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(CpuProfiler*, cpu_profiler, NULL) \ 26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(HeapProfiler*, heap_profiler, NULL) 26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_LOGGING_INIT_LIST(V) 27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 27644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V) \ 27744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* SerializerDeserializer state. */ \ 27844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Object*, serialize_partial_snapshot_cache, kPartialSnapshotCacheCapacity) \ 27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \ 28044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, bad_char_shift_table, kUC16AlphabetSize) \ 28144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, good_suffix_shift_table, (kBMMaxShift + 1)) \ 28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, suffix_table, (kBMMaxShift + 1)) \ 28344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 28444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 28544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef List<HeapObject*, PreallocatedStorage> DebugObjectCache; 28644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_LIST(V) \ 28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* AssertNoZoneAllocation state. */ \ 28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(bool, zone_allow_allocation, true) \ 29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* SerializerDeserializer state. */ \ 29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, serialize_partial_snapshot_cache_length, 0) \ 29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* Assembler state. */ \ 29344f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* A previously allocated buffer of kMinimalBufferSize bytes, or NULL. */ \ 29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(byte*, assembler_spare_buffer, NULL) \ 29544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(FatalErrorCallback, exception_behavior, NULL) \ 29644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(v8::Debug::MessageHandler, message_handler, NULL) \ 29744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* To distinguish the function templates, so that we can find them in the */ \ 29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* function cache of the global context. */ \ 29944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, next_serial_number, 0) \ 30044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalReferenceRedirectorPointer*, external_reference_redirector, NULL) \ 30144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(bool, always_allow_natives_syntax, false) \ 30244f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* Part of the state of liveedit. */ \ 30344f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(FunctionInfoListener*, active_function_info_listener, NULL) \ 30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* State for Relocatable. */ \ 30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Relocatable*, relocatable_top, NULL) \ 30644f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* State for CodeEntry in profile-generator. */ \ 30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(CodeGenerator*, current_code_generator, NULL) \ 30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(bool, jump_target_compiling_deferred_code, false) \ 30944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(DebugObjectCache*, string_stream_debug_object_cache, NULL) \ 31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Object*, string_stream_current_security_token, NULL) \ 31144f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* TODO(isolates): Release this on destruction? */ \ 31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int*, irregexp_interpreter_backtrack_stack_cache, NULL) \ 31344f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* Serializer state. */ \ 31444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalReferenceTable*, external_reference_table, NULL) \ 31544f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* AstNode state. */ \ 31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(unsigned, ast_node_id, 0) \ 31744f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(unsigned, ast_node_count, 0) \ 31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_PLATFORM_INIT_LIST(V) \ 31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_LOGGING_INIT_LIST(V) \ 32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_DEBUGGER_INIT_LIST(V) 32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 32244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate { 32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These forward declarations are required to make the friend declarations in 32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // PerIsolateThreadData work on some older versions of gcc. 32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable; 32644f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem; 32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~Isolate(); 32944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33044f0eee88ff00398ff7f715fab053374d808c90dSteve Block typedef int ThreadId; 33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A thread has a PerIsolateThreadData instance for each isolate that it has 33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // entered. That instance is allocated when the isolate is initially entered 33444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // and reused on subsequent entries. 33544f0eee88ff00398ff7f715fab053374d808c90dSteve Block class PerIsolateThreadData { 33644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData(Isolate* isolate, ThreadId thread_id) 33844f0eee88ff00398ff7f715fab053374d808c90dSteve Block : isolate_(isolate), 33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_id_(thread_id), 34044f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_limit_(0), 34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_state_(NULL), 34244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \ 34344f0eee88ff00398ff7f715fab053374d808c90dSteve Block !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS) 34444f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_(NULL), 34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block next_(NULL), 34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block prev_(NULL) { } 34844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate() const { return isolate_; } 34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id() const { return thread_id_; } 35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_stack_limit(uintptr_t value) { stack_limit_ = value; } 35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t stack_limit() const { return stack_limit_; } 35244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadState* thread_state() const { return thread_state_; } 35344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_thread_state(ThreadState* value) { thread_state_ = value; } 35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \ 35644f0eee88ff00398ff7f715fab053374d808c90dSteve Block !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS) 35744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator() const { return simulator_; } 35844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_simulator(Simulator* simulator) { 35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_ = simulator; 36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 36144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Matches(Isolate* isolate, ThreadId thread_id) const { 36444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate_ == isolate && thread_id_ == thread_id; 36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 36644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 36844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id_; 37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t stack_limit_; 37144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadState* thread_state_; 37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if !defined(__arm__) && defined(V8_TARGET_ARCH_ARM) || \ 37444f0eee88ff00398ff7f715fab053374d808c90dSteve Block !defined(__mips__) && defined(V8_TARGET_ARCH_MIPS) 37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* next_; 37944f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* prev_; 38044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class Isolate; 38244f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ThreadDataTable; 38344f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class EntryStackItem; 38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData); 38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 38944f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum AddressId { 39044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define C(name) k_##name, 39144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_ADDRESS_LIST(C) 39244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_ADDRESS_LIST_PROF(C) 39344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef C 39444f0eee88ff00398ff7f715fab053374d808c90dSteve Block k_isolate_address_count 39544f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 39644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 39744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the PerIsolateThreadData for the current thread (or NULL if one is 39844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not currently set). 39944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static PerIsolateThreadData* CurrentPerIsolateThreadData() { 40044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return reinterpret_cast<PerIsolateThreadData*>( 40144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Thread::GetThreadLocal(per_isolate_thread_data_key_)); 40244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 40344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 40444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the isolate inside which the current thread is running. 40544f0eee88ff00398ff7f715fab053374d808c90dSteve Block INLINE(static Isolate* Current()) { 40644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = reinterpret_cast<Isolate*>( 40744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Thread::GetExistingThreadLocal(isolate_key_)); 40844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(isolate != NULL); 40944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate; 41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 41144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block INLINE(static Isolate* UncheckedCurrent()) { 41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return reinterpret_cast<Isolate*>(Thread::GetThreadLocal(isolate_key_)); 41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Init(Deserializer* des); 41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsInitialized() { return state_ == INITIALIZED; } 41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // True if at least one thread Enter'ed this isolate. 42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsInUse() { return entry_stack_ != NULL; } 42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Destroys the non-default isolates. 42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Sets default isolate into "has_been_disposed" state rather then destroying, 42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for legacy API reasons. 42644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void TearDown(); 42744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 42844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsDefaultIsolate() const { return this == default_isolate_; } 42944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Ensures that process-wide resources and the default isolate have been 43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // allocated. It is only necessary to call this method in rare casses, for 43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // example if you are using V8 from within the body of a static initializer. 43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Safe to call multiple times. 43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void EnsureDefaultIsolate(); 43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the debugger from the default isolate. Preinitializes the 43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // default isolate if needed. 43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Debugger* GetDefaultIsolateDebugger(); 43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the stack guard from the default isolate. Preinitializes the 44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // default isolate if needed. 44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static StackGuard* GetDefaultIsolateStackGuard(); 44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store the pointer to the current isolate. 44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Used internally for V8 threads that do not execute JavaScript but still 44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // are part of the domain of an isolate (like the context switcher). 44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Thread::LocalStorageKey isolate_key() { 44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate_key_; 44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store process-wide thread IDs. 45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Thread::LocalStorageKey thread_id_key() { 45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_id_key_; 45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Atomically allocates a new thread ID. 45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static ThreadId AllocateThreadId(); 45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If a client attempts to create a Locker without specifying an isolate, 46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // we assume that the client is using legacy behavior. Set up the current 46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // thread to be inside the implicit isolate (or fail a check if we have 46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // switched to non-legacy behavior). 46344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void EnterDefaultIsolate(); 46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Debug. 46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Mutex for serializing access to break control structures. 46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Mutex* break_access() { return break_access_; } 46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address get_address_from_id(AddressId id); 47044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to top context (where the current function object was created). 47244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context() { return thread_local_top_.context_; } 47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_context(Context* context) { 47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.context_ = context; 47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context** context_address() { return &thread_local_top_.context_; } 47744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47844f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* save_context() {return thread_local_top_.save_context_; } 47944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_save_context(SaveContext* save) { 48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.save_context_ = save; 48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 48344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to current thread id. 48444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int thread_id() { return thread_local_top_.thread_id_; } 48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_thread_id(int id) { thread_local_top_.thread_id_ = id; } 48644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 48744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Interface to pending exception. 48844f0eee88ff00398ff7f715fab053374d808c90dSteve Block MaybeObject* pending_exception() { 48944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(has_pending_exception()); 49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.pending_exception_; 49144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 49244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool external_caught_exception() { 49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.external_caught_exception_; 49444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 49544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_pending_exception(MaybeObject* exception) { 49644f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.pending_exception_ = exception; 49744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 49844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void clear_pending_exception() { 49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.pending_exception_ = heap_.the_hole_value(); 50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 50144f0eee88ff00398ff7f715fab053374d808c90dSteve Block MaybeObject** pending_exception_address() { 50244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.pending_exception_; 50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_pending_exception() { 50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return !thread_local_top_.pending_exception_->IsTheHole(); 50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void clear_pending_message() { 50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.has_pending_message_ = false; 50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.pending_message_ = NULL; 51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.pending_message_obj_ = heap_.the_hole_value(); 51144f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.pending_message_script_ = NULL; 51244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 51344f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::TryCatch* try_catch_handler() { 51444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.TryCatchHandler(); 51544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 51644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address try_catch_handler_address() { 51744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.try_catch_handler_address(); 51844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 51944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool* external_caught_exception_address() { 52044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.external_caught_exception_; 52144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 52244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block MaybeObject** scheduled_exception_address() { 52444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.scheduled_exception_; 52544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block MaybeObject* scheduled_exception() { 52744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(has_scheduled_exception()); 52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.scheduled_exception_; 52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_scheduled_exception() { 53144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return !thread_local_top_.scheduled_exception_->IsTheHole(); 53244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void clear_scheduled_exception() { 53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.scheduled_exception_ = heap_.the_hole_value(); 53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 53644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsExternallyCaught(); 53844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_catchable_by_javascript(MaybeObject* exception) { 54044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return (exception != Failure::OutOfMemoryException()) && 54144f0eee88ff00398ff7f715fab053374d808c90dSteve Block (exception != heap()->termination_exception()); 54244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 54344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 54444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JS execution stack (see frames.h). 54544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address c_entry_fp(ThreadLocalTop* thread) { 54644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread->c_entry_fp_; 54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 54844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address handler(ThreadLocalTop* thread) { return thread->handler_; } 54944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 55044f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* c_entry_fp_address() { 55144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.c_entry_fp_; 55244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* handler_address() { return &thread_local_top_.handler_; } 55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 55544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Bottom JS entry (see StackTracer::Trace in log.cc). 55744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address js_entry_sp(ThreadLocalTop* thread) { 55844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread->js_entry_sp_; 55944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 56044f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* js_entry_sp_address() { 56144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.js_entry_sp_; 56244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 56344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 56444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 56544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Generated code scratch locations. 56644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void* formal_count_address() { return &thread_local_top_.formal_count_; } 56744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 56844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global object of the current context. It could be 56944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // a builtin object, or a js global object. 57044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<GlobalObject> global() { 57144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Handle<GlobalObject>(context()->global()); 57244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global proxy object of the current context. 57544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* global_proxy() { 57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return context()->global_proxy(); 57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 57844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<JSBuiltinsObject> js_builtins_object() { 58044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Handle<JSBuiltinsObject>(thread_local_top_.context_->builtins()); 58144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 58244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 58344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } 58444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FreeThreadResources() { thread_local_top_.Free(); } 58544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 58644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method is called by the api after operations that may throw 58744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // exceptions. If an exception was thrown and not handled by an external 58844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // handler the exception is scheduled to be rethrown when we return to running 58944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JavaScript code. If an exception is scheduled true is returned. 59044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool OptionalRescheduleException(bool is_bottom_call); 59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetCaptureStackTraceForUncaughtExceptions( 59344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture, 59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 59544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Tells whether the current context has experienced an out of memory 59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // exception. 59944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_out_of_memory(); 60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 60144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintCurrentStackTrace(FILE* out); 60244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintStackTrace(FILE* out, char* thread_data); 60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintStack(StringStream* accumulator); 60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintStack(); 60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> StackTraceString(); 60644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<JSArray> CaptureCurrentStackTrace( 60744f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 60844f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 60944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 61044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns if the top context may access the given global object. If 61144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the result is false, the pending exception is guaranteed to be 61244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // set. 61344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool MayNamedAccess(JSObject* receiver, 61444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* key, 61544f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::AccessType type); 61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool MayIndexedAccess(JSObject* receiver, 61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint32_t index, 61844f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::AccessType type); 61944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback); 62144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ReportFailedAccessCheck(JSObject* receiver, v8::AccessType type); 62244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exception throwing support. The caller should use the result 62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // of Throw() as its return value. 62544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Failure* Throw(Object* exception, MessageLocation* location = NULL); 62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Re-throw an exception. This involves no error reporting since 62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // error reporting was handled when the exception was thrown 62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // originally. 62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Failure* ReThrow(MaybeObject* exception, MessageLocation* location = NULL); 63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ScheduleThrow(Object* exception); 63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ReportPendingMessages(); 63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Failure* ThrowIllegalOperation(); 63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Promote a scheduled exception to pending. Asserts has_scheduled_exception. 63544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Failure* PromoteScheduledException(); 63644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DoThrow(MaybeObject* exception, 63744f0eee88ff00398ff7f715fab053374d808c90dSteve Block MessageLocation* location, 63844f0eee88ff00398ff7f715fab053374d808c90dSteve Block const char* message); 63944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Checks if exception should be reported and finds out if it's 64044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // caught externally. 64144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool ShouldReportException(bool* can_be_caught_externally, 64244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool catchable_by_javascript); 64344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 64444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Attempts to compute the current source location, storing the 64544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // result in the target out parameter. 64644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ComputeLocation(MessageLocation* target); 64744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 64844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Override command line flag. 64944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void TraceException(bool flag); 65044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 65144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Out of resource exception helpers. 65244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Failure* StackOverflow(); 65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Failure* TerminateExecution(); 65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Administration 65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v); 65744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v, ThreadLocalTop* t); 65844f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* Iterate(ObjectVisitor* v, char* t); 65944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IterateThread(ThreadVisitor* v); 66044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IterateThread(ThreadVisitor* v, char* t); 66144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 66344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the current global context. 66444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> global_context(); 66544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 66644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global context of the calling JavaScript code. That 66744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // is, the global context of the top-most JavaScript frame. 66844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> GetCallingGlobalContext(); 66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void RegisterTryCatchHandler(v8::TryCatch* that); 67144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UnregisterTryCatchHandler(v8::TryCatch* that); 67244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 67344f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* ArchiveThread(char* to); 67444f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* RestoreThread(char* from); 67544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 67644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const kStackOverflowMessage; 67744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 67844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kUC16AlphabetSize = 256; // See StringSearchBase. 67944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kBMMaxShift = 250; // See StringSearchBase. 68044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 68144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Accessors. 68244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue) \ 68344f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type name() const { \ 68444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 68544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return name##_; \ 68644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } \ 68744f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_##name(type value) { \ 68844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block name##_ = value; \ 69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 69144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_ACCESSOR) 69244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR 69344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 69444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length) \ 69544f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type* name() { \ 69644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 69744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &(name##_)[0]; \ 69844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 69944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR) 70044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR 70144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 70244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_CONTEXT_FIELD_ACCESSOR(index, type, name) \ 70344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<type> name() { \ 70444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Handle<type>(context()->global_context()->name()); \ 70544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 70644f0eee88ff00398ff7f715fab053374d808c90dSteve Block GLOBAL_CONTEXT_FIELDS(GLOBAL_CONTEXT_FIELD_ACCESSOR) 70744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_CONTEXT_FIELD_ACCESSOR 70844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 70944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper() { return bootstrapper_; } 71044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Counters* counters() { return counters_; } 71144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // TODO(isolates): Having CPU features per isolate is probably too 71244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // flexible. We only really need to have the set of currently 71344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // enabled features for asserts in DEBUG builds. 71444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CpuFeatures* cpu_features() { return cpu_features_; } 71544f0eee88ff00398ff7f715fab053374d808c90dSteve Block CodeRange* code_range() { return code_range_; } 71644f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler() { return runtime_profiler_; } 71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache() { return compilation_cache_; } 71844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger* logger() { return logger_; } 71944f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard() { return &stack_guard_; } 72044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap* heap() { return &heap_; } 72144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StatsTable* stats_table() { return stats_table_; } 72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block StubCache* stub_cache() { return stub_cache_; } 72344f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; } 72444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* thread_local_top() { return &thread_local_top_; } 72544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 72644f0eee88ff00398ff7f715fab053374d808c90dSteve Block TranscendentalCache* transcendental_cache() const { 72744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return transcendental_cache_; 72844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 72944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 73044f0eee88ff00398ff7f715fab053374d808c90dSteve Block MemoryAllocator* memory_allocator() { 73144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return memory_allocator_; 73244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 73344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 73444f0eee88ff00398ff7f715fab053374d808c90dSteve Block KeyedLookupCache* keyed_lookup_cache() { 73544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return keyed_lookup_cache_; 73644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 73744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 73844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache() { 73944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return context_slot_cache_; 74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 74144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 74244f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache() { 74344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return descriptor_lookup_cache_; 74444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 74544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 74644f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::ImplementationUtilities::HandleScopeData* handle_scope_data() { 74744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &handle_scope_data_; 74844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer() { 75044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(handle_scope_implementer_); 75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return handle_scope_implementer_; 75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 75344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Zone* zone() { return &zone_; } 75444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 75544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ScannerConstants* scanner_constants() { 75644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return scanner_constants_; 75744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 75844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 75944f0eee88ff00398ff7f715fab053374d808c90dSteve Block PcToCodeCache* pc_to_code_cache() { return pc_to_code_cache_; } 76044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer* write_input_buffer() { return write_input_buffer_; } 76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76344f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles() { return global_handles_; } 76444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadManager* thread_manager() { return thread_manager_; } 76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSwitcher* context_switcher() { return context_switcher_; } 76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_context_switcher(ContextSwitcher* switcher) { 77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block context_switcher_ = switcher; 77144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 77244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 77344f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringTracker* string_tracker() { return string_tracker_; } 77444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 77544f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() { 77644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_uncanonicalize_; 77744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 77844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 77944f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() { 78044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_canonrange_; 78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer* objects_string_compare_buffer_a() { 78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &objects_string_compare_buffer_a_; 78544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer* objects_string_compare_buffer_b() { 78844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &objects_string_compare_buffer_b_; 78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StaticResource<StringInputBuffer>* objects_string_input_buffer() { 79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &objects_string_input_buffer_; 79344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 79444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 79544f0eee88ff00398ff7f715fab053374d808c90dSteve Block AstSentinels* ast_sentinels() { return ast_sentinels_; } 79644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 79744f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState* runtime_state() { return &runtime_state_; } 79844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer* liveedit_compare_substrings_buf1() { 80044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &liveedit_compare_substrings_buf1_; 80144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 80244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 80344f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer* liveedit_compare_substrings_buf2() { 80444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &liveedit_compare_substrings_buf2_; 80544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 80644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 80744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StaticResource<SafeStringInputBuffer>* compiler_safe_string_input_buffer() { 80844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &compiler_safe_string_input_buffer_; 80944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 81044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 81144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins* builtins() { return &builtins_; } 81244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 81344f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 81444f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize() { 81544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ®exp_macro_assembler_canonicalize_; 81644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 81744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 81844f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack() { return regexp_stack_; } 81944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 82044f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 82144f0eee88ff00398ff7f715fab053374d808c90dSteve Block interp_canonicalize_mapping() { 82244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &interp_canonicalize_mapping_; 82344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 82444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 82544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneObjectList* frame_element_constant_list() { 82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &frame_element_constant_list_; 82744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 82844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneObjectList* result_constant_list() { 83044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &result_constant_list_; 83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void* PreallocatedStorageNew(size_t size); 83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PreallocatedStorageDelete(void* p); 83544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PreallocatedStorageInit(size_t size); 83644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debugger* debugger() { return debugger_; } 83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debug* debug() { return debug_; } 84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 84144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 84244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 84344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ProducerHeapProfile* producer_heap_profile() { 84444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return producer_heap_profile_; 84544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 84644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 84744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 84944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo* heap_histograms() { return heap_histograms_; } 85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 85144f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation* js_spill_information() { 85244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &js_spill_information_; 85344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 85544f0eee88ff00398ff7f715fab053374d808c90dSteve Block int* code_kind_statistics() { return code_kind_statistics_; } 85644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \ 85944f0eee88ff00398ff7f715fab053374d808c90dSteve Block defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__) 86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool simulator_initialized() { return simulator_initialized_; } 86144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_simulator_initialized(bool initialized) { 86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_initialized_ = initialized; 86344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 86544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HashMap* simulator_i_cache() { return simulator_i_cache_; } 86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_simulator_i_cache(HashMap* hash_map) { 86744f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_i_cache_ = hash_map; 86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Redirection* simulator_redirection() { 87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return simulator_redirection_; 87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_simulator_redirection(Redirection* redirection) { 87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_redirection_ = redirection; 87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Factory* factory() { return reinterpret_cast<Factory*>(this); } 87944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 88044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // SerializerDeserializer state. 88144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kPartialSnapshotCacheCapacity = 1400; 88244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kJSRegexpStaticOffsetsVectorSize = 50; 88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 88544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 88644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address external_callback() { 88744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.external_callback_; 88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_external_callback(Address callback) { 89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.external_callback_ = callback; 89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 89244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_VMSTATE_TRACKING 89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StateTag current_vm_state() { 89644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread_local_top_.current_vm_state_; 89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 89844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 89944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetCurrentVMState(StateTag state) { 90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (RuntimeProfiler::IsEnabled()) { 90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (state == JS) { 90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JS or non-JS -> JS transition. 90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler::IsolateEnteredJS(this); 90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else if (thread_local_top_.current_vm_state_ == JS) { 90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JS -> non-JS transition. 90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(RuntimeProfiler::IsSomeIsolateInJS()); 90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler::IsolateExitedJS(this); 90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.current_vm_state_ = state; 91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ResetEagerOptimizingData(); 91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91644f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 91744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate(); 91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The per-process lock should be acquired before the ThreadDataTable is 92044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // modified. 92144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable { 92244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadDataTable(); 92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ThreadDataTable(); 92544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 92644f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id); 92744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Insert(PerIsolateThreadData* data); 92844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Remove(Isolate* isolate, ThreadId thread_id); 92944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Remove(PerIsolateThreadData* data); 93044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 93144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 93244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* list_; 93344f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 93444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 93544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These items form a stack synchronously with threads Enter'ing and Exit'ing 93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the Isolate. The top of the stack points to a thread which is currently 93744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // running the Isolate. When the stack is empty, the Isolate is considered 93844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not entered by any thread and can be Disposed. 93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If the same thread enters the Isolate more then once, the entry_count_ 94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // is incremented rather then a new item pushed to the stack. 94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem { 94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem(PerIsolateThreadData* previous_thread_data, 94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate, 94544f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item) 94644f0eee88ff00398ff7f715fab053374d808c90dSteve Block : entry_count(1), 94744f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_thread_data(previous_thread_data), 94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_isolate(previous_isolate), 94944f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_item(previous_item) { } 95044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 95144f0eee88ff00398ff7f715fab053374d808c90dSteve Block int entry_count; 95244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* previous_thread_data; 95344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate; 95444f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item; 95544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 95644f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(EntryStackItem); 95744f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 95844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 95944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This mutex protects highest_thread_id_, thread_data_table_ and 96044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // default_isolate_. 96144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Mutex* process_wide_mutex_; 96244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 96344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Thread::LocalStorageKey per_isolate_thread_data_key_; 96444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Thread::LocalStorageKey isolate_key_; 96544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Thread::LocalStorageKey thread_id_key_; 96644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Isolate* default_isolate_; 96744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static ThreadDataTable* thread_data_table_; 96844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static ThreadId highest_thread_id_; 96944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 97044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool PreInit(); 97144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 97244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Deinit(); 97344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 97444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void SetIsolateThreadLocals(Isolate* isolate, 97544f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* data); 97644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 97744f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum State { 97844f0eee88ff00398ff7f715fab053374d808c90dSteve Block UNINITIALIZED, // Some components may not have been allocated. 97944f0eee88ff00398ff7f715fab053374d808c90dSteve Block PREINITIALIZED, // Components have been allocated but not initialized. 98044f0eee88ff00398ff7f715fab053374d808c90dSteve Block INITIALIZED // All components are fully initialized. 98144f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 98244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 98344f0eee88ff00398ff7f715fab053374d808c90dSteve Block State state_; 98444f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* entry_stack_; 98544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 98644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Allocate and insert PerIsolateThreadData into the ThreadDataTable 98744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // (regardless of whether such data already exists). 98844f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* AllocatePerIsolateThreadData(ThreadId thread_id); 98944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 99044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Find the PerThread for this particular (isolate, thread) combination. 99144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If one does not yet exist, allocate a new one. 99244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread(); 99344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 99444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // PreInits and returns a default isolate. Needed when a new thread tries 99544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // to create a Locker for the first time (the lock itself is in the isolate). 99644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Isolate* GetDefaultIsolateForLocking(); 99744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 99844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initializes the current thread to run this Isolate. 99944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 100044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 100144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Enter(); 100244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 100344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exits the current thread. The previosuly entered Isolate is restored 100444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for the thread. 100544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 100644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 100744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Exit(); 100844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 100944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PreallocatedMemoryThreadStart(); 101044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PreallocatedMemoryThreadStop(); 101144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void InitializeThreadLocal(); 101244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 101344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintStackTrace(FILE* out, ThreadLocalTop* thread); 101444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactPrologue(bool is_compacting, 101544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 101644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactEpilogue(bool is_compacting, 101744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 101844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 101944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FillCache(); 102044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 102144f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_nesting_level_; 102244f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* incomplete_message_; 102344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The preallocated memory thread singleton. 102444f0eee88ff00398ff7f715fab053374d808c90dSteve Block PreallocatedMemoryThread* preallocated_memory_thread_; 102544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address isolate_addresses_[k_isolate_address_count + 1]; // NOLINT 102644f0eee88ff00398ff7f715fab053374d808c90dSteve Block NoAllocationStringAllocator* preallocated_message_space_; 102744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 102844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper_; 102944f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler_; 103044f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache_; 103144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Counters* counters_; 103244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CpuFeatures* cpu_features_; 103344f0eee88ff00398ff7f715fab053374d808c90dSteve Block CodeRange* code_range_; 103444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Mutex* break_access_; 103544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap heap_; 103644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger* logger_; 103744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard stack_guard_; 103844f0eee88ff00398ff7f715fab053374d808c90dSteve Block StatsTable* stats_table_; 103944f0eee88ff00398ff7f715fab053374d808c90dSteve Block StubCache* stub_cache_; 104044f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data_; 104144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop thread_local_top_; 104244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture_stack_trace_for_uncaught_exceptions_; 104344f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_for_uncaught_exceptions_frame_limit_; 104444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_; 104544f0eee88ff00398ff7f715fab053374d808c90dSteve Block TranscendentalCache* transcendental_cache_; 104644f0eee88ff00398ff7f715fab053374d808c90dSteve Block MemoryAllocator* memory_allocator_; 104744f0eee88ff00398ff7f715fab053374d808c90dSteve Block KeyedLookupCache* keyed_lookup_cache_; 104844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache_; 104944f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache_; 105044f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::ImplementationUtilities::HandleScopeData handle_scope_data_; 105144f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer_; 105244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ScannerConstants* scanner_constants_; 105344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Zone zone_; 105444f0eee88ff00398ff7f715fab053374d808c90dSteve Block PreallocatedStorage in_use_list_; 105544f0eee88ff00398ff7f715fab053374d808c90dSteve Block PreallocatedStorage free_list_; 105644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool preallocated_storage_preallocated_; 105744f0eee88ff00398ff7f715fab053374d808c90dSteve Block PcToCodeCache* pc_to_code_cache_; 105844f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer* write_input_buffer_; 105944f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles_; 106044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSwitcher* context_switcher_; 106144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadManager* thread_manager_; 106244f0eee88ff00398ff7f715fab053374d808c90dSteve Block AstSentinels* ast_sentinels_; 106344f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState runtime_state_; 106444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer liveedit_compare_substrings_buf1_; 106544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer liveedit_compare_substrings_buf2_; 106644f0eee88ff00398ff7f715fab053374d808c90dSteve Block StaticResource<SafeStringInputBuffer> compiler_safe_string_input_buffer_; 106744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins builtins_; 106844f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringTracker* string_tracker_; 106944f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_; 107044f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_; 107144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer objects_string_compare_buffer_a_; 107244f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringInputBuffer objects_string_compare_buffer_b_; 107344f0eee88ff00398ff7f715fab053374d808c90dSteve Block StaticResource<StringInputBuffer> objects_string_input_buffer_; 107444f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize> 107544f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize_; 107644f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack_; 107744f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize> interp_canonicalize_mapping_; 107844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneObjectList frame_element_constant_list_; 107944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneObjectList result_constant_list_; 108044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 108144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \ 108244f0eee88ff00398ff7f715fab053374d808c90dSteve Block defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__) 108344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool simulator_initialized_; 108444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HashMap* simulator_i_cache_; 108544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Redirection* simulator_redirection_; 108644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 108744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 108844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 108944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A static array of histogram info for each type. 109044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo heap_histograms_[LAST_TYPE + 1]; 109144f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation js_spill_information_; 109244f0eee88ff00398ff7f715fab053374d808c90dSteve Block int code_kind_statistics_[Code::NUMBER_OF_KINDS]; 109344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 109444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 109544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 109644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debugger* debugger_; 109744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debug* debug_; 109844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 109944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 110044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef ENABLE_LOGGING_AND_PROFILING 110144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ProducerHeapProfile* producer_heap_profile_; 110244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 110344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 110444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue) \ 110544f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_; 110644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE) 110744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE 110844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 110944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length) \ 111044f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_[length]; 111144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE) 111244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE 111344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 111444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 111544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This class is huge and has a number of fields controlled by 111644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // preprocessor defines. Make sure the offsets of these fields agree 111744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // between compilation units. 111844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 111944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const intptr_t name##_debug_offset_; 112044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 112144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 112244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET 112344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ExecutionAccess; 112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class IsolateInitializer; 112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Isolate; 112844f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Locker; 112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(Isolate); 113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the 113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these 113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details. 113744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED { 113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit SaveContext(Isolate* isolate) : prev_(isolate->save_context()) { 114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (isolate->context() != NULL) { 114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block context_ = Handle<Context>(isolate->context()); 114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if __GNUC_VERSION__ >= 40100 && __GNUC_VERSION__ < 40300 114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block dummy_ = Handle<Context>(isolate->context()); 114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->set_save_context(this); 114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If there is no JS frame under the current C frame, use the value 0. 114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block JavaScriptFrameIterator it; 115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block js_sp_ = it.done() ? 0 : it.frame()->sp(); 115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 115344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~SaveContext() { 115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (context_.is_null()) { 115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = Isolate::Current(); 115644f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->set_context(NULL); 115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->set_save_context(prev_); 115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = context_->GetIsolate(); 116044f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->set_context(*context_); 116144f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->set_save_context(prev_); 116244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 116344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context() { return context_; } 116644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev() { return prev_; } 116744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 116844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns true if this save context is below a given JavaScript frame. 116944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool below(JavaScriptFrame* frame) { 117044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return (js_sp_ == 0) || (frame->sp() < js_sp_); 117144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 117244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 117344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 117444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 117544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if __GNUC_VERSION__ >= 40100 && __GNUC_VERSION__ < 40300 117644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> dummy_; 117744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 117844f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev_; 117944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address js_sp_; // The top JS frame's sp when saving context. 118044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 118144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED { 118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block AssertNoContextChange() : 118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block scope_(Isolate::Current()), 118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block context_(Isolate::Current()->context(), Isolate::Current()) { 118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~AssertNoContextChange() { 119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(Isolate::Current()->context() == *context_); 119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScope scope_; 119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block AssertNoContextChange() { } 120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 120344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED { 120644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 120744f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) { 120844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Lock(isolate); 120944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ExecutionAccess() { Unlock(isolate_); } 121144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 121244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void Lock(Isolate* isolate) { isolate->break_access_->Lock(); } 121344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void Unlock(Isolate* isolate) { isolate->break_access_->Unlock(); } 121444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 121544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static bool TryLock(Isolate* isolate) { 121644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate->break_access_->TryLock(); 121744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 122044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 122144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 122244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 122344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 122444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for checking for stack-overflows in C++ code. 122544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED { 122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 122744f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { } 122844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 122944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasOverflowed() const { 123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard = isolate_->stack_guard(); 123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Stack has overflowed in C++ code only if stack pointer exceeds the C++ 123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // stack guard and the limits are not set to interrupt values. 123344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // TODO(214): Stack overflows are ignored if a interrupt is pending. This 123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // code should probably always use the initial C++ limit. 123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return (reinterpret_cast<uintptr_t>(this) < stack_guard->climit()) && 123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_guard->IsStackOverflow(); 123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 123844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 123944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 124044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 124144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 124244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 124344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost 124444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any 124544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into 124644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account. 124744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED { 124844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 124944f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit PostponeInterruptsScope(Isolate* isolate) 125044f0eee88ff00398ff7f715fab053374d808c90dSteve Block : stack_guard_(isolate->stack_guard()) { 125144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_guard_->thread_local_.postpone_interrupts_nesting_++; 125244f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_guard_->DisableInterrupts(); 125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 125444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~PostponeInterruptsScope() { 125644f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (--stack_guard_->thread_local_.postpone_interrupts_nesting_ == 0) { 125744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_guard_->EnableInterrupts(); 125844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 126144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard_; 126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Temporary macros for accessing current isolate and its subobjects. 126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// They provide better readability, especially when used a lot in the code. 126744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define HEAP (v8::internal::Isolate::Current()->heap()) 126844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define FACTORY (v8::internal::Isolate::Current()->factory()) 126944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE (v8::internal::Isolate::Current()) 127044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ZONE (v8::internal::Isolate::Current()->zone()) 127144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define LOGGER (v8::internal::Isolate::Current()->logger()) 127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Tells whether the global context is marked with out of memory. 127544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockinline bool Context::has_out_of_memory() { 127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return global_context()->out_of_memory()->IsTrue(); 127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 127944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 128044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Mark the global context with out of memory. 128144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockinline void Context::mark_out_of_memory() { 128244f0eee88ff00398ff7f715fab053374d808c90dSteve Block global_context()->set_out_of_memory(HEAP->true_value()); 128344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 128444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 128544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 128644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Temporary macro to be used to flag definitions that are indeed static 128744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// and not per-isolate. (It would be great to be able to grep for [static]!) 128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define RLYSTC static 128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Temporary macro to be used to flag classes that should be static. 129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define STATIC_CLASS class 129344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Temporary macro to be used to flag classes that are completely converted 129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// to be isolate-friendly. Their mix of static/nonstatic methods/fields is 129744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// correct. 129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATED_CLASS class 129944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 130044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} } // namespace v8::internal 130144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 130244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// TODO(isolates): Get rid of these -inl.h includes and place them only where 130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// they're needed. 130444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "allocation-inl.h" 130544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "zone-inl.h" 130644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "frames-inl.h" 130744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 130844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // V8_ISOLATE_H_ 1309