isolate.h revision 109988c7ccb6f3fd1a58574fa3dfb88beaef6632
13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_ISOLATE_H_ 644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define V8_ISOLATE_H_ 744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <queue> 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include <set> 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8-debug.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/assert-scope.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/builtins.h" 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/cancelable-task.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/date.h" 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/frames.h" 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/futex-emulation.h" 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h" 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h" 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hashmap.h" 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h" 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h" 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/optimizing-compile-dispatcher.h" 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h" 29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/runtime/runtime.h" 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/runtime-profiler.h" 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h" 3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 { 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base { 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RandomNumberGenerator; 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal { 4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass BasicBlockProfiler; 4244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper; 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallInterfaceDescriptorData; 4444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator; 4544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange; 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeStubDescriptor; 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeTracer; 4844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache; 49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CompilationStatistics; 5044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache; 5144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters; 5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures; 5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler; 5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData; 5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer; 5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement; 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalCallbackScope; 5844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable; 5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory; 6044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass FunctionInfoListener; 6144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HandleScopeImplementer; 6244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapProfiler; 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStatistics; 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTracer; 6544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass InlineRuntimeFunctionsTable; 663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass InnerPointerToCodeCache; 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Logger; 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MaterializedObjectStore; 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeAgingHelper; 7044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpStack; 7144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext; 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StatsTable; 7344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StringTracker; 7444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StubCache; 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SweeperThread; 7644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadManager; 7744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadState; 7844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadVisitor; // Defined in v8threads.h 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UnicodeCache; 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <StateTag Tag> class VMState; 8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// 'void function pointer', used to roundtrip the 8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// ExternalReference::ExternalReferenceRedirector since we can not include 8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// assembler.h, where it is defined, here. 8544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef void* ExternalReferenceRedirectorPointer(); 8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Debug; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack; 9044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Redirection; 9144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Simulator; 9244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter { 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Interpreter; 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Static indirection table for handles to constants. If a frame 9844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// element represents a constant, the data contains an index into 9944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// this table of handles to the actual constants. 10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Static indirection table for handles to constants. If a Result 10144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// represents a constant, the data contains an index into this table 10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// of handles to the actual constants. 10344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef ZoneList<Handle<Object> > ZoneObjectList; 10444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate) \ 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch do { \ 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* __isolate__ = (isolate); \ 1083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (__isolate__->has_scheduled_exception()) { \ 1093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return __isolate__->PromoteScheduledException(); \ 1103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 1113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } while (false) 11244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Macros for MaybeHandle. 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, value) \ 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { \ 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* __isolate__ = (isolate); \ 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (__isolate__->has_scheduled_exception()) { \ 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __isolate__->PromoteScheduledException(); \ 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; \ 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, T) \ 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, MaybeHandle<T>()) 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value) \ 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { \ 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!(call).ToHandle(&dst)) { \ 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((isolate)->has_pending_exception()); \ 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; \ 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } while (false) 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call) \ 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION_VALUE( \ 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate, dst, call, isolate->heap()->exception()) 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call, T) \ 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, MaybeHandle<T>()) 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THROW_NEW_ERROR(isolate, call, T) \ 143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return isolate->Throw<T>(isolate->factory()->call); \ 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } while (false) 14644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call) \ 148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return isolate->Throw(*isolate->factory()->call); \ 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION_VALUE(isolate, call, value) \ 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { \ 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((call).is_null()) { \ 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((isolate)->has_pending_exception()); \ 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; \ 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_FAILURE_ON_EXCEPTION(isolate, call) \ 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RETURN_ON_EXCEPTION_VALUE(isolate, call, isolate->heap()->exception()) 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION(isolate, call, T) \ 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RETURN_ON_EXCEPTION_VALUE(isolate, call, MaybeHandle<T>()) 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 16644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 167589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define FOR_EACH_ISOLATE_ADDRESS_NAME(C) \ 168589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(Handler, handler) \ 169589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(CEntryFP, c_entry_fp) \ 170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier C(CFunction, c_function) \ 171589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(Context, context) \ 172589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(PendingException, pending_exception) \ 173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerContext, pending_handler_context) \ 174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerCode, pending_handler_code) \ 175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerOffset, pending_handler_offset) \ 176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerFP, pending_handler_fp) \ 177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerSP, pending_handler_sp) \ 178589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(ExternalCaughtException, external_caught_exception) \ 179589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(JSEntrySP, js_entry_sp) 18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier. 1838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId { 1848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 1858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Creates an invalid ThreadId. 186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); } 187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ThreadId& operator=(const ThreadId& other) { 189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::NoBarrier_Store(&id_, base::NoBarrier_Load(&other.id_)); 190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return *this; 191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Returns ThreadId for current thread. 1948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId Current() { return ThreadId(GetCurrentThreadId()); } 1958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Returns invalid ThreadId (guaranteed not to be equal to any thread). 1978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId Invalid() { return ThreadId(kInvalidId); } 1988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 1998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Compares ThreadIds for equality. 2008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch INLINE(bool Equals(const ThreadId& other) const) { 201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::NoBarrier_Load(&id_) == base::NoBarrier_Load(&other.id_); 2028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Checks whether this ThreadId refers to any thread. 2058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch INLINE(bool IsValid() const) { 206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::NoBarrier_Load(&id_) != kInvalidId; 2078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts ThreadId to an integer representation 2108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // (required for public API: V8::V8::GetCurrentThreadId). 211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int ToInteger() const { return static_cast<int>(base::NoBarrier_Load(&id_)); } 2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts ThreadId to an integer representation 2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // (required for public API: V8::V8::TerminateExecution). 2158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId FromInteger(int id) { return ThreadId(id); } 2168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 2188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static const int kInvalidId = -1; 2198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit ThreadId(int id) { base::NoBarrier_Store(&id_, id); } 2218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static int AllocateThreadId(); 2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static int GetCurrentThreadId(); 2258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::Atomic32 id_; 2278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Atomic32 highest_thread_id_; 2298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch friend class Isolate; 2318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ACCESSOR(type, name) \ 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_##name(type v) { name##_ = v; } \ 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type name() const { return name##_; } 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 23944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED { 24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 2418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Does early low-level initialization that does not depend on the 2428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // isolate being present. 2438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadLocalTop(); 2448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 24544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initialize the thread data. 24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Initialize(); 24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the top C++ try catch handler or NULL if none are registered. 24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This method is not guaranteed to return an address that can be 25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // used for comparison with addresses into the JS stack. If such an 25244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // address is needed, use try_catch_handler_address. 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(v8::TryCatch*, try_catch_handler) 25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the address of the top C++ try catch handler or NULL if 25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // none are registered. 25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method always returns an address that can be compared to 25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // pointers into the JavaScript stack. When running on actual 26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // hardware, try_catch_handler_address and TryCatchHandler return 26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the same pointer. When running on a simulator with a separate JS 26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // stack, try_catch_handler_address returns a JS stack address that 26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // corresponds to the place on the JS stack where the C++ handler 26444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // would have been if the stack were not separate. 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address try_catch_handler_address() { 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>( 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch::JSStackComparableAddress(try_catch_handler())); 26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Free(); 27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Isolate* isolate_; 27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The context where the current execution method is created and for variable 27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // lookups. 27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context_; 2768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId thread_id_; 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* pending_exception_; 278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Communication channel between Isolate::FindHandler and the CEntryStub. 280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* pending_handler_context_; 281014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Code* pending_handler_code_; 282014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch intptr_t pending_handler_offset_; 283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pending_handler_fp_; 284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pending_handler_sp_; 285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Communication channel between Isolate::Throw and message consumers. 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool rethrowing_message_; 28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* pending_message_obj_; 289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Use a separate value for scheduled exceptions to preserve the 29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // invariants that hold about pending_exception. We may want to 29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // unify them later. 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* scheduled_exception_; 29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool external_caught_exception_; 29544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* save_context_; 29644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 29744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Stack. 29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address c_entry_fp_; // the frame pointer of the top c entry frame 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address handler_; // try-blocks are chained through the stack 300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Address c_function_; // C function that was called at c entry. 30144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Throwing an exception may cause a Promise rejection. For this purpose 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // we keep track of a stack of nested promises and the corresponding 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // try-catch handlers. 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* promise_on_stack_; 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR 30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 30944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address js_entry_sp_; // the stack pointer of the bottom JS entry frame 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the external callback we're currently in 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalCallbackScope* external_callback_scope_; 31444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StateTag current_vm_state_; 31544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Call back function to report unsafe JS accesses. 31744f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::FailedAccessCheckCallback failed_access_check_callback_; 31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 3208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch void InitializeInternal(); 3218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch* try_catch_handler_; 32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V) \ 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(bool, simulator_initialized, false) \ 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HashMap*, simulator_i_cache, NULL) \ 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Redirection*, simulator_redirection, NULL) 33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V) 33544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 34044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) \ 34244f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(CommentStatistic, paged_space_comments_statistics, \ 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommentStatistic::kMaxComments + 1) \ 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int, code_kind_statistics, Code::NUMBER_OF_KINDS) 34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 34844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V) \ 35244f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* SerializerDeserializer state. */ \ 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int32_t, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \ 35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, bad_char_shift_table, kUC16AlphabetSize) \ 35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, good_suffix_shift_table, (kBMMaxShift + 1)) \ 35644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, suffix_table, (kBMMaxShift + 1)) \ 3573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(uint32_t, private_random_seed, 2) \ 35844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef List<HeapObject*> DebugObjectCache; 36144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_LIST(V) \ 36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* Assembler state. */ \ 36444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(FatalErrorCallback, exception_behavior, NULL) \ 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LogEventCallback, event_logger, NULL) \ 366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, NULL) \ 36744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* To distinguish the function templates, so that we can find them in the */ \ 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* function cache of the native context. */ \ 36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, next_serial_number, 0) \ 37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalReferenceRedirectorPointer*, external_reference_redirector, NULL) \ 37144f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* Part of the state of liveedit. */ \ 37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(FunctionInfoListener*, active_function_info_listener, NULL) \ 37344f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* State for Relocatable. */ \ 37444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Relocatable*, relocatable_top, NULL) \ 37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(DebugObjectCache*, string_stream_debug_object_cache, NULL) \ 37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Object*, string_stream_current_security_token, NULL) \ 37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalReferenceTable*, external_reference_table, NULL) \ 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HashMap*, external_reference_map, NULL) \ 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HashMap*, root_index_map, NULL) \ 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int, pending_microtask_count, 0) \ 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(bool, autorun_microtasks, true) \ 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HStatistics*, hstatistics, NULL) \ 383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CompilationStatistics*, turbo_statistics, NULL) \ 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HTracer*, htracer, NULL) \ 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CodeTracer*, code_tracer, NULL) \ 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(bool, fp_stubs_generated, false) \ 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu) \ 388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(PromiseRejectCallback, promise_reject_callback, NULL) \ 389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(const v8::StartupData*, snapshot_blob, NULL) \ 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ISOLATE_INIT_SIMULATOR_LIST(V) 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define THREAD_LOCAL_TOP_ACCESSOR(type, name) \ 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_##name(type v) { thread_local_top_.name##_ = v; } \ 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type name() const { return thread_local_top_.name##_; } 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THREAD_LOCAL_TOP_ADDRESS(type, name) \ 397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch type* name##_address() { return &thread_local_top_.name##_; } 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 39944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 40044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate { 40144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These forward declarations are required to make the friend declarations in 40244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // PerIsolateThreadData work on some older versions of gcc. 40344f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable; 40444f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem; 40544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 40644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~Isolate(); 40744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 40844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A thread has a PerIsolateThreadData instance for each isolate that it has 40944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // entered. That instance is allocated when the isolate is initially entered 41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // and reused on subsequent entries. 41144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class PerIsolateThreadData { 41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData(Isolate* isolate, ThreadId thread_id) 41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block : isolate_(isolate), 41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_id_(thread_id), 41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_limit_(0), 41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_state_(NULL), 418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_(NULL), 42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block next_(NULL), 42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block prev_(NULL) { } 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~PerIsolateThreadData(); 42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate() const { return isolate_; } 42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id() const { return thread_id_; } 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(uintptr_t, stack_limit) 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(ThreadState*, thread_state) 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(Simulator*, simulator) 43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Matches(Isolate* isolate, ThreadId thread_id) const { 4358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return isolate_ == isolate && thread_id_.Equals(thread_id); 43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id_; 44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t stack_limit_; 44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadState* thread_state_; 44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* next_; 44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* prev_; 45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class Isolate; 45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ThreadDataTable; 45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class EntryStackItem; 45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData); 45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum AddressId { 460589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address, 461589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM) 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_ENUM 463589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kIsolateAddressCount 46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitializeOncePerProcess(); 467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the PerIsolateThreadData for the current thread (or NULL if one is 46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not currently set). 47044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static PerIsolateThreadData* CurrentPerIsolateThreadData() { 47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return reinterpret_cast<PerIsolateThreadData*>( 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetThreadLocal(per_isolate_thread_data_key_)); 47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the isolate inside which the current thread is running. 47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block INLINE(static Isolate* Current()) { 477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1); 47844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = reinterpret_cast<Isolate*>( 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetExistingThreadLocal(isolate_key_)); 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate != NULL); 48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate; 48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 48344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Like Current, but skips the check that |isolate_key_| was initialized. 485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Callers have to ensure that themselves. 486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // DO NOT USE. The only remaining callsite will be deleted soon. 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INLINE(static Isolate* UnsafeCurrent()) { 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Isolate*>( 489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetThreadLocal(isolate_key_)); 49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 49144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 49269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Usually called by Init(), but can be called early e.g. to allow 49369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // testing components that require logging but not the whole 49469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // isolate. 49569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // 49669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Safe to call more than once. 49769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void InitializeLoggingAndCounters(); 49869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Init(Deserializer* des); 50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 50144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // True if at least one thread Enter'ed this isolate. 50244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsInUse() { return entry_stack_ != NULL; } 50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Destroys the non-default isolates. 50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Sets default isolate into "has_been_disposed" state rather then destroying, 50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for legacy API reasons. 50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void TearDown(); 50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void GlobalTearDown(); 51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ClearSerializerData(); 512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Find the PerThread for this particular (isolate, thread) combination 514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // If one does not yet exist, return null. 515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PerIsolateThreadData* FindPerThreadDataForThisThread(); 516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the PerThread for given (isolate, thread) combination 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If one does not yet exist, return null. 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id); 52044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Discard the PerThread for this particular (isolate, thread) combination 522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If one does not yet exist, no-op. 523014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void DiscardPerThreadDataForThisThread(); 524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 52544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store the pointer to the current isolate. 52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Used internally for V8 threads that do not execute JavaScript but still 52744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // are part of the domain of an isolate (like the context switcher). 528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey isolate_key() { 52985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return isolate_key_; 53085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch } 53144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store process-wide thread IDs. 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey thread_id_key() { 53485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return thread_id_key_; 53585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch } 53644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey per_isolate_thread_data_key(); 53844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Mutex for serializing access to break control structures. 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RecursiveMutex* break_access() { return &break_access_; } 54169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 54244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address get_address_from_id(AddressId id); 54344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 54444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to top context (where the current function object was created). 54544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context() { return thread_local_top_.context_; } 546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_context(Context* context); 54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context** context_address() { return &thread_local_top_.context_; } 54844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(SaveContext*, save_context) 55044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 55144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to current thread id. 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(ThreadId, thread_id) 55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Interface to pending exception. 555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* pending_exception(); 556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_pending_exception(Object* exception_obj); 557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_pending_exception(); 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception) 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 561014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_pending_exception(); 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context) 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code) 565014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset) 566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp) 567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp) 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception) 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57144f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::TryCatch* try_catch_handler() { 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return thread_local_top_.try_catch_handler(); 57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool* external_caught_exception_address() { 57544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.external_caught_exception_; 57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception) 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_pending_message(); 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address pending_message_obj_address() { 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_); 5838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* scheduled_exception(); 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_scheduled_exception(); 587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_scheduled_exception(); 58844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsJavaScriptHandlerOnTop(Object* exception); 590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsExternalHandlerOnTop(Object* exception); 59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_catchable_by_javascript(Object* exception); 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JS execution stack (see frames.h). 59544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address c_entry_fp(ThreadLocalTop* thread) { 59644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread->c_entry_fp_; 59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address handler(ThreadLocalTop* thread) { return thread->handler_; } 599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Address c_function() { return thread_local_top_.c_function_; } 60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 60144f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* c_entry_fp_address() { 60244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.c_entry_fp_; 60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* handler_address() { return &thread_local_top_.handler_; } 605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Address* c_function_address() { 606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return &thread_local_top_.c_function_; 607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 60844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bottom JS entry. 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address js_entry_sp() { 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return thread_local_top_.js_entry_sp_; 61244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 61344f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* js_entry_sp_address() { 61444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.js_entry_sp_; 61544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global object of the current context. It could be 6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a builtin object, or a JS global object. 619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Handle<JSGlobalObject> global_object(); 62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global proxy object of the current context. 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSObject* global_proxy() { 62344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return context()->global_proxy(); 62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 62544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } 62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FreeThreadResources() { thread_local_top_.Free(); } 62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method is called by the api after operations that may throw 63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // exceptions. If an exception was thrown and not handled by an external 63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // handler the exception is scheduled to be rethrown when we return to running 63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JavaScript code. If an exception is scheduled true is returned. 63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool OptionalRescheduleException(bool is_bottom_call); 63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push and pop a promise and the current try-catch handler. 636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PushPromise(Handle<JSObject> promise, Handle<JSFunction> function); 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PopPromise(); 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> GetPromiseOnStackOnThrow(); 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch class ExceptionScope { 6418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Scope currently can only be used for regular exceptions, 643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // not termination exception. 644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline explicit ExceptionScope(Isolate* isolate); 645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ~ExceptionScope(); 6468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 6478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 6488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate_; 6498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> pending_exception_; 6508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }; 6518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 65244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetCaptureStackTraceForUncaughtExceptions( 65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture, 65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAbortOnUncaughtExceptionCallback( 658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback callback); 659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum PrintStackMode { kPrintStackConcise, kPrintStackVerbose }; 66144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintCurrentStackTrace(FILE* out); 662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintStack(StringStream* accumulator, 663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintStackMode mode = kPrintStackVerbose); 664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintStack(FILE* out, PrintStackMode mode = kPrintStackVerbose); 66544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> StackTraceString(); 666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NO_INLINE(void PushStackTraceAndDie(unsigned int magic, void* ptr1, 667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* ptr2, unsigned int magic2)); 66844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<JSArray> CaptureCurrentStackTrace( 66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> CaptureSimpleStackTrace(Handle<JSObject> error_object, 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> caller); 673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeHandle<JSObject> CaptureAndSetDetailedStackTrace( 674014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> error_object); 675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MaybeHandle<JSObject> CaptureAndSetSimpleStackTrace( 676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> error_object, Handle<Object> caller); 677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> GetDetailedStackTrace(Handle<JSObject> error_object); 678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> GetDetailedFromSimpleStackTrace( 679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSObject> error_object); 6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns if the given context may access the given global object. If 68244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the result is false, the pending exception is guaranteed to be 68344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // set. 684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool MayAccess(Handle<Context> accessing_context, Handle<JSObject> receiver); 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback); 687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReportFailedAccessCheck(Handle<JSObject> receiver); 68844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exception throwing support. The caller should use the result 69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // of Throw() as its return value. 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* Throw(Object* exception, MessageLocation* location = NULL); 692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* ThrowIllegalOperation(); 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename T> 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception, 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MessageLocation* location = NULL) { 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Throw(*exception, location); 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MaybeHandle<T>(); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Re-throw an exception. This involves no error reporting since error 702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // reporting was handled when the exception was thrown originally. 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* ReThrow(Object* exception); 704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find the correct handler for the current pending exception. This also 706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // clears and returns the current pending exception. 707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* UnwindAndFindHandler(); 708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to predict whether an exception will be caught. Note that this can 710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // only produce an estimate, because it is undecidable whether a finally 711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // clause will consume or re-throw an exception. We conservatively assume any 712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // finally clause will behave as if the exception were consumed. 713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum CatchType { NOT_CAUGHT, CAUGHT_BY_JAVASCRIPT, CAUGHT_BY_EXTERNAL }; 714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CatchType PredictExceptionCatcher(); 715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 71644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ScheduleThrow(Object* exception); 717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Re-set pending message, script and positions reported to the TryCatch 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // back to the TLS for re-use when rethrowing. 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RestorePendingMessageFromTryCatch(v8::TryCatch* handler); 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Un-schedule an exception that was caught by a TryCatch handler. 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler); 72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ReportPendingMessages(); 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return pending location if any or unfilled structure. 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MessageLocation GetMessageLocation(); 72544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 72644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Promote a scheduled exception to pending. Asserts has_scheduled_exception. 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* PromoteScheduledException(); 72844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 72944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Attempts to compute the current source location, storing the 73044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // result in the target out parameter. 731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ComputeLocation(MessageLocation* target); 732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ComputeLocationFromException(MessageLocation* target, 733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> exception); 734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool ComputeLocationFromStackTrace(MessageLocation* target, 735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> exception); 736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSMessageObject> CreateMessage(Handle<Object> exception, 738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MessageLocation* location); 73944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Out of resource exception helpers. 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* StackOverflow(); 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* TerminateExecution(); 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CancelTerminateExecution(); 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void RequestInterrupt(InterruptCallback callback, void* data); 746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void InvokeApiInterruptCallbacks(); 74744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 74844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Administration 74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v); 75044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v, ThreadLocalTop* t); 75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* Iterate(ObjectVisitor* v, char* t); 75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IterateThread(ThreadVisitor* v, char* t); 75344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns the current native context. 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> native_context(); 75644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the native context of the calling JavaScript code. That 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is, the native context of the top-most JavaScript frame. 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> GetCallingNativeContext(); 76044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void RegisterTryCatchHandler(v8::TryCatch* that); 76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UnregisterTryCatchHandler(v8::TryCatch* that); 76344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76444f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* ArchiveThread(char* to); 76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* RestoreThread(char* from); 76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const kStackOverflowMessage; 76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kUC16AlphabetSize = 256; // See StringSearchBase. 77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kBMMaxShift = 250; // See StringSearchBase. 77144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 77244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Accessors. 77344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue) \ 77444f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type name() const { \ 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 77644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return name##_; \ 77744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } \ 77844f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_##name(type value) { \ 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 78044f0eee88ff00398ff7f715fab053374d808c90dSteve Block name##_ = value; \ 78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_ACCESSOR) 78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR 78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length) \ 78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type* name() { \ 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 78844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &(name##_)[0]; \ 78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR) 79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR 79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 793014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \ 794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Handle<type> name(); \ 795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_##name(type* value); 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSOR) 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSOR 79844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper() { return bootstrapper_; } 80069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Counters* counters() { 80169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Call InitializeLoggingAndCounters() if logging is needed before 80269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the isolate is fully initialized. 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(counters_ != NULL); 80469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return counters_; 80569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 80644f0eee88ff00398ff7f715fab053374d808c90dSteve Block CodeRange* code_range() { return code_range_; } 80744f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler() { return runtime_profiler_; } 80844f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache() { return compilation_cache_; } 80969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Logger* logger() { 81069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Call InitializeLoggingAndCounters() if logging is needed before 81169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the isolate is fully initialized. 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(logger_ != NULL); 81369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return logger_; 81469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 81544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard() { return &stack_guard_; } 81644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap* heap() { return &heap_; } 81769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch StatsTable* stats_table(); 81844f0eee88ff00398ff7f715fab053374d808c90dSteve Block StubCache* stub_cache() { return stub_cache_; } 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeAgingHelper* code_aging_helper() { return code_aging_helper_; } 82044f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; } 821109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool deoptimizer_lazy_throw() const { return deoptimizer_lazy_throw_; } 822109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void set_deoptimizer_lazy_throw(bool value) { 823109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch deoptimizer_lazy_throw_ = value; 824109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 82544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* thread_local_top() { return &thread_local_top_; } 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaterializedObjectStore* materialized_object_store() { 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return materialized_object_store_; 82844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83044f0eee88ff00398ff7f715fab053374d808c90dSteve Block MemoryAllocator* memory_allocator() { 83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return memory_allocator_; 83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block KeyedLookupCache* keyed_lookup_cache() { 83544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return keyed_lookup_cache_; 83644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 83744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache() { 83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return context_slot_cache_; 84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 84144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 84244f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache() { 84344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return descriptor_lookup_cache_; 84444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 84544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData* handle_scope_data() { return &handle_scope_data_; } 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer() { 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handle_scope_implementer_); 85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return handle_scope_implementer_; 85144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* runtime_zone() { return &runtime_zone_; } 853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Zone* interface_descriptor_zone() { return &interface_descriptor_zone_; } 85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch UnicodeCache* unicode_cache() { 8568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return unicode_cache_; 85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InnerPointerToCodeCache* inner_pointer_to_code_cache() { 8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return inner_pointer_to_code_cache_; 8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 86344f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles() { return global_handles_; } 86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EternalHandles* eternal_handles() { return eternal_handles_; } 86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadManager* thread_manager() { return thread_manager_; } 86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() { 87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_uncanonicalize_; 87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() { 87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_canonrange_; 87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState* runtime_state() { return &runtime_state_; } 87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins* builtins() { return &builtins_; } 88044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void NotifyExtensionInstalled() { 8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has_installed_extensions_ = true; 8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool has_installed_extensions() { return has_installed_extensions_; } 8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 88744f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize() { 88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ®exp_macro_assembler_canonicalize_; 89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 89244f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack() { return regexp_stack_; } 89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block interp_canonicalize_mapping() { 896109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ®exp_macro_assembler_canonicalize_; 89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 89844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug* debug() { return debug_; } 90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CpuProfiler* cpu_profiler() const { return cpu_profiler_; } 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* heap_profiler() const { return heap_profiler_; } 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo* heap_histograms() { return heap_histograms_; } 90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation* js_spill_information() { 90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &js_spill_information_; 90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Factory* factory() { return reinterpret_cast<Factory*>(this); } 91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kJSRegexpStaticOffsetsVectorSize = 128; 91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(ExternalCallbackScope*, external_callback_scope) 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(StateTag, current_vm_state) 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetData(uint32_t slot, void* data) { 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot < Internals::kNumIsolateDataSlots); 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch embedder_data_[slot] = data; 92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* GetData(uint32_t slot) { 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot < Internals::kNumIsolateDataSlots); 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return embedder_data_[slot]; 92744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 92844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool serializer_enabled() const { return serializer_enabled_; } 930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool snapshot_available() const { 931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return snapshot_blob_ != NULL && snapshot_blob_->raw_size != 0; 932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 93344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDead() { return has_fatal_error_; } 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SignalFatalError() { has_fatal_error_ = true; } 93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_crankshaft() const; 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool initialized_from_snapshot() { return initialized_from_snapshot_; } 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double time_millis_since_init() { 942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return heap_.MonotonicallyIncreasingTimeInMs() - time_millis_at_init_; 94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DateCache* date_cache() { 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return date_cache_; 94744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_date_cache(DateCache* date_cache) { 950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (date_cache != date_cache_) { 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete date_cache_; 95244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch date_cache_ = date_cache; 95444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 95544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Map* get_initial_js_array_map(ElementsKind kind, 957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Strength strength = Strength::WEAK); 958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kArrayProtectorValid = 1; 960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kArrayProtectorInvalid = 0; 961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFastArrayConstructorPrototypeChainIntact(); 963109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool IsArraySpeciesLookupChainIntact(); 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // On intent to set an element in object, make sure that appropriate 966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // notifications occur if the set is on the elements of the array or 967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // object prototype. Also ensure that changes to prototype chain between 968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Array and Object fire notifications. 969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetElement(Handle<JSObject> object); 970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetLength(Handle<JSObject> object) { 971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetPrototype(Handle<JSObject> object) { 974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnNormalizeElements(Handle<JSObject> object) { 977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 978014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 979109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void InvalidateArraySpeciesProtector(); 980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if array is the initial array prototype in any native context. 982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsAnyInitialArrayPrototype(Handle<JSArray> array); 983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptorData* call_descriptor_data(int index); 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void IterateDeferredHandles(ObjectVisitor* visitor); 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void LinkDeferredHandles(DeferredHandles* deferred_handles); 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UnlinkDeferredHandles(DeferredHandles* deferred_handles); 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDeferredHandle(Object** location); 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // DEBUG 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool concurrent_recompilation_enabled() { 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Thread is only available with flag enabled. 996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(optimizing_compile_dispatcher_ == NULL || 997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FLAG_concurrent_recompilation); 998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_ != NULL; 9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool concurrent_osr_enabled() const { 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Thread is only available with flag enabled. 1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(optimizing_compile_dispatcher_ == NULL || 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FLAG_concurrent_recompilation); 1005014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_ != NULL && FLAG_concurrent_osr; 10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1008014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizingCompileDispatcher* optimizing_compile_dispatcher() { 1009014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_; 10103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id() const { return static_cast<int>(id_); } 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStatistics* GetHStatistics(); 1015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CompilationStatistics* GetTurboStatistics(); 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTracer* GetHTracer(); 1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeTracer* GetCodeTracer(); 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DumpAndResetCompilationStats(); 1020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook function_entry_hook() { return function_entry_hook_; } 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_function_entry_hook(FunctionEntryHook function_entry_hook) { 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function_entry_hook_ = function_entry_hook; 10243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* stress_deopt_count_address() { return &stress_deopt_count_; } 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* virtual_handler_register_address() { 1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return &virtual_handler_register_; 1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* virtual_slot_register_address() { return &virtual_slot_register_; } 1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::RandomNumberGenerator* random_number_generator(); 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Given an address occupied by a live code object, return that object. 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* FindCodeObject(Address a); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NextOptimizationId() { 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id = next_optimization_id_++; 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!Smi::IsValid(next_optimization_id_)) { 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_optimization_id_ = 0; 10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return id; 10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IncrementJsCallsFromApiCounter() { ++js_calls_from_api_counter_; } 1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch unsigned int js_calls_from_api_counter() { 1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return js_calls_from_api_counter_; 1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get (and lazily initialize) the registry for per-isolate symbols. 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> GetSymbolRegistry(); 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCallCompletedCallback(CallCompletedCallback callback); 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemoveCallCompletedCallback(CallCompletedCallback callback); 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void FireCallCompletedCallback(); 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1060109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 1061109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 1062109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void FireBeforeCallEnteredCallback(); 1063109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetPromiseRejectCallback(PromiseRejectCallback callback); 1065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void ReportPromiseReject(Handle<JSObject> promise, Handle<Object> value, 1066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::PromiseRejectEvent event); 1067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void EnqueueMicrotask(Handle<Object> microtask); 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RunMicrotasks(); 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback); 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CountUsage(v8::Isolate::UseCounterFeature feature); 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* GetOrCreateBasicBlockProfiler(); 1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* basic_block_profiler() { return basic_block_profiler_; } 1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::string GetTurboCfgFileName(); 1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 1080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int GetNextUniqueSharedFunctionInfoId() { return next_unique_sfi_id_++; } 1081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1083014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1084014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddDetachedContext(Handle<Context> context); 1085014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CheckDetachedContextsAfterGC(); 1086014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1087014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Object*>* partial_snapshot_cache() { return &partial_snapshot_cache_; } 1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void set_array_buffer_allocator(v8::ArrayBuffer::Allocator* allocator) { 1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch array_buffer_allocator_ = allocator; 1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::ArrayBuffer::Allocator* array_buffer_allocator() const { 1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return array_buffer_allocator_; 1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FutexWaitListNode* futex_wait_list_node() { return &futex_wait_list_node_; } 1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CancelableTaskManager* cancelable_task_manager() { 1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cancelable_task_manager_; 1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Interpreter* interpreter() const { return interpreter_; } 1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 1105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit Isolate(bool enable_serializer); 110644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch friend struct GlobalState; 11093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch friend struct InitializeGlobalState; 1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> SetUpSubregistry(Handle<JSObject> registry, Handle<Map> map, 1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* name); 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These fields are accessed through the API, offsets must be kept in sync 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // with v8::internal::Internals (in include/v8.h) constants. This is also 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // verified in Isolate::Init() using runtime checks. 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* embedder_data_[Internals::kNumIsolateDataSlots]; 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap heap_; 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 111944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The per-process lock should be acquired before the ThreadDataTable is 112044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // modified. 112144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable { 112244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 112344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadDataTable(); 112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ThreadDataTable(); 112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id); 112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Insert(PerIsolateThreadData* data); 112844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Remove(PerIsolateThreadData* data); 11293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void RemoveAllThreads(Isolate* isolate); 113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* list_; 113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These items form a stack synchronously with threads Enter'ing and Exit'ing 113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the Isolate. The top of the stack points to a thread which is currently 113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // running the Isolate. When the stack is empty, the Isolate is considered 113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not entered by any thread and can be Disposed. 113944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If the same thread enters the Isolate more then once, the entry_count_ 114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // is incremented rather then a new item pushed to the stack. 114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem { 114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem(PerIsolateThreadData* previous_thread_data, 114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate, 114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item) 114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block : entry_count(1), 114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_thread_data(previous_thread_data), 114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_isolate(previous_isolate), 114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_item(previous_item) { } 115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block int entry_count; 115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* previous_thread_data; 115344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate; 115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item; 115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 11563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(EntryStackItem); 115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::LazyMutex thread_data_table_mutex_; 116185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey per_isolate_thread_data_key_; 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey isolate_key_; 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey thread_id_key_; 116585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch static ThreadDataTable* thread_data_table_; 116685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A global counter for all generated Isolates, might overflow. 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Atomic32 isolate_counter_; 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG 1171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static base::Atomic32 isolate_key_created_; 1172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 117444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Deinit(); 117544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 117644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void SetIsolateThreadLocals(Isolate* isolate, 117744f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* data); 117844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 117944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Find the PerThread for this particular (isolate, thread) combination. 118044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If one does not yet exist, allocate a new one. 118144f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread(); 118244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initializes the current thread to run this Isolate. 118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Enter(); 118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exits the current thread. The previosuly entered Isolate is restored 118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for the thread. 119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Exit(); 119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void InitializeThreadLocal(); 119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactPrologue(bool is_compacting, 119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactEpilogue(bool is_compacting, 119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FillCache(); 120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Propagate pending exception message to the v8::TryCatch. 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If there is no external try-catch or message was successfully propagated, 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // then return true. 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool PropagatePendingExceptionToExternalTryCatch(); 120769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Remove per-frame stored materialized objects when we are unwinding 1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the frame. 1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveMaterializedObjectsOnUnwind(StackFrame* frame); 12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Atomic32 id_; 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EntryStackItem* entry_stack_; 121444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_nesting_level_; 121544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* incomplete_message_; 1216589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Address isolate_addresses_[kIsolateAddressCount + 1]; // NOLINT 121744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper_; 121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler_; 121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache_; 122044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Counters* counters_; 122144f0eee88ff00398ff7f715fab053374d808c90dSteve Block CodeRange* code_range_; 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RecursiveMutex break_access_; 122344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger* logger_; 122444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard stack_guard_; 122544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StatsTable* stats_table_; 122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block StubCache* stub_cache_; 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeAgingHelper* code_aging_helper_; 122844f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data_; 1229109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool deoptimizer_lazy_throw_; 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaterializedObjectStore* materialized_object_store_; 123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop thread_local_top_; 123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture_stack_trace_for_uncaught_exceptions_; 123344f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_for_uncaught_exceptions_frame_limit_; 123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_; 123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block MemoryAllocator* memory_allocator_; 123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block KeyedLookupCache* keyed_lookup_cache_; 123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache_; 123844f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache_; 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData handle_scope_data_; 124044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer_; 12418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch UnicodeCache* unicode_cache_; 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone runtime_zone_; 1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Zone interface_descriptor_zone_; 12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InnerPointerToCodeCache* inner_pointer_to_code_cache_; 124544f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles_; 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EternalHandles* eternal_handles_; 124744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadManager* thread_manager_; 124844f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState runtime_state_; 124944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins builtins_; 12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool has_installed_extensions_; 125144f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_; 125244f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_; 125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize> 125444f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize_; 125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack_; 12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DateCache* date_cache_; 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptorData* call_descriptor_data_; 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RandomNumberGenerator* random_number_generator_; 125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Whether the isolate has been created for snapshotting. 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool serializer_enabled_; 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if fatal error has been signaled for this isolate. 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_fatal_error_; 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if this isolate was initialized from a snapshot. 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool initialized_from_snapshot_; 12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Time stamp at initialization. 12703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double time_millis_at_init_; 12713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A static array of histogram info for each type. 127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo heap_histograms_[LAST_TYPE + 1]; 127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation js_spill_information_; 127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debug* debug_; 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CpuProfiler* cpu_profiler_; 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* heap_profiler_; 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook function_entry_hook_; 128244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1283014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Interpreter* interpreter_; 1284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typedef std::pair<InterruptCallback, void*> InterruptEntry; 1286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::queue<InterruptEntry> api_interrupts_queue_; 1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue) \ 128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_; 129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE) 129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE 129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length) \ 129444f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_[length]; 129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE) 129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE 129744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 129944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This class is huge and has a number of fields controlled by 130044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // preprocessor defines. Make sure the offsets of these fields agree 130144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // between compilation units. 130244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const intptr_t name##_debug_offset_; 130444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 130544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 130644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET 130744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 130844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* deferred_handles_head_; 1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizingCompileDispatcher* optimizing_compile_dispatcher_; 1311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Counts deopt points if deopt_every_n_times is enabled. 1313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned int stress_deopt_count_; 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address virtual_handler_register_; 1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address virtual_slot_register_; 1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int next_optimization_id_; 1319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Counts javascript calls from the API. Wraps around on overflow. 1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch unsigned int js_calls_from_api_counter_; 1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 1324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int next_unique_sfi_id_; 1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1327109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // List of callbacks before a Call starts execution. 1328109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch List<BeforeCallEnteredCallback> before_call_entered_callbacks_; 1329109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // List of callbacks when a Call completes. 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch List<CallCompletedCallback> call_completed_callbacks_; 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Isolate::UseCounterCallback use_counter_callback_; 1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* basic_block_profiler_; 1335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Object*> partial_snapshot_cache_; 1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::ArrayBuffer::Allocator* array_buffer_allocator_; 1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FutexWaitListNode futex_wait_list_node_; 1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CancelableTaskManager* cancelable_task_manager_; 1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback 1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch abort_on_uncaught_exception_callback_; 1346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 134744f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ExecutionAccess; 1348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HandleScopeImplementer; 1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class OptimizingCompileDispatcher; 1350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class SweeperThread; 1351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class ThreadManager; 1352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class Simulator; 1353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class StackGuard; 13548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch friend class ThreadId; 135569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch friend class TestMemoryAllocatorScope; 1356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class TestCodeRangeScope; 135744f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Isolate; 135844f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Locker; 1359257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class v8::Unlocker; 1360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend v8::StartupData v8::V8::CreateSnapshotDataBlob(const char*); 136144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 136244f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(Isolate); 136344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 136444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ACCESSOR 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef THREAD_LOCAL_TOP_ACCESSOR 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack { 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PromiseOnStack(Handle<JSFunction> function, Handle<JSObject> promise, 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev) 1374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : function_(function), promise_(promise), prev_(prev) {} 1375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> function() { return function_; } 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> promise() { return promise_; } 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev() { return prev_; } 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> function_; 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> promise_; 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev_; 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 138644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the 138744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these 138844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details. 138944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED { 139044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit SaveContext(Isolate* isolate); 1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ~SaveContext(); 139344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 139444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context() { return context_; } 139544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev() { return prev_; } 139644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 139744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns true if this save context is below a given JavaScript frame. 13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool IsBelowFrame(JavaScriptFrame* frame) { 13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp()); 140044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 140144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 140244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 140444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev_; 14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address c_entry_fp_; 140744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 140844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 140944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 141044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED { 141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit AssertNoContextChange(Isolate* isolate); 141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~AssertNoContextChange() { 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate_->context() == *context_); 141644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 141744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 141844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 142144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 142244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AssertNoContextChange(Isolate* isolate) { } 142444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 142544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 142644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED { 142944f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 143044f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) { 143144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Lock(isolate); 143244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 143344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ExecutionAccess() { Unlock(isolate_); } 143444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Lock(Isolate* isolate) { isolate->break_access()->Lock(); } 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Unlock(Isolate* isolate) { isolate->break_access()->Unlock(); } 143744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 143844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static bool TryLock(Isolate* isolate) { 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return isolate->break_access()->TryLock(); 144044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 144144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 144244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 144344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 144444f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 144644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for checking for stack-overflows. 144844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED { 144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 145044f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { } 145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use this to check for stack-overflows in C++ code. 1453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasOverflowed() const { 145444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard = isolate_->stack_guard(); 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GetCurrentStackPosition() < stack_guard->real_climit(); 145644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Use this to check for interrupt request in C++ code. 1459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool InterruptRequested() { 1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackGuard* stack_guard = isolate_->stack_guard(); 1461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetCurrentStackPosition() < stack_guard->climit(); 1462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use this to check for stack-overflow when entering runtime from JS code. 1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool JsHasOverflowed(uintptr_t gap = 0) const; 1466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 146744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 146844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 146944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 147044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 147144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 147244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost 147344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any 147444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into 147544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account. 147644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED { 147744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PostponeInterruptsScope(Isolate* isolate, 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercept_mask = StackGuard::ALL_INTERRUPTS) 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : stack_guard_(isolate->stack_guard()), 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercept_mask_(intercept_mask), 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercepted_flags_(0) { 1483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_guard_->PushPostponeInterruptsScope(this); 148444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 148544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 148644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~PostponeInterruptsScope() { 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_guard_->PopPostponeInterruptsScope(); 148844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the bottom-most scope that intercepts this interrupt. 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return whether the interrupt has been intercepted. 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Intercept(StackGuard::InterruptFlag flag); 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 149444f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 149544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard_; 1496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercept_mask_; 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercepted_flags_; 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PostponeInterruptsScope* prev_; 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class StackGuard; 150144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 150244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 150344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CodeTracer final : public Malloced { 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit CodeTracer(int isolate_id) 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : file_(NULL), 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_depth_(0) { 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch file_ = stdout; 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 151344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_redirect_code_traces_to == NULL) { 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SNPrintF(filename_, 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "code-%d-%d.asm", 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::GetCurrentProcessId(), 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_id); 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length()); 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 152244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteChars(filename_.start(), "", 0, false); 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 152544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Scope { 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); } 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~Scope() { tracer_->CloseFile(); } 153044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file() const { return tracer_->file(); } 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeTracer* tracer_; 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void OpenFile() { 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file_ == NULL) { 1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch file_ = base::OS::FOpen(filename_.start(), "ab"); 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_depth_++; 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CloseFile() { 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (--scope_depth_ == 0) { 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(file_); 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch file_ = NULL; 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file() const { return file_; } 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool ShouldRedirect() { 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FLAG_redirect_code_traces; 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EmbeddedVector<char, 128> filename_; 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file_; 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scope_depth_; 1570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 157144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 1573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 157444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 157544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // V8_ISOLATE_H_ 1576