isolate.h revision bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8
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" 143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/base/accounting-allocator.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/builtins.h" 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/cancelable-task.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h" 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/date.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h" 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/frames.h" 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/futex-emulation.h" 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h" 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h" 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hashmap.h" 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h" 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h" 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/optimizing-compile-dispatcher.h" 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h" 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/runtime-profiler.h" 313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/runtime/runtime.h" 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h" 3344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3444f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 { 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base { 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RandomNumberGenerator; 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4044f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal { 4144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass BasicBlockProfiler; 4344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper; 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallInterfaceDescriptorData; 4544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator; 4644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange; 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeStubDescriptor; 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeTracer; 4944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache; 50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CompilationStatistics; 5144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache; 5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters; 5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures; 5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler; 5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData; 5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer; 5744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalCallbackScope; 5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable; 6044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory; 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 1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define FOR_WITH_HANDLE_SCOPE(isolate, loop_var_type, init, loop_var, \ 1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch limit_check, increment, body) \ 1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch do { \ 1843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch loop_var_type init; \ 1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch loop_var_type for_with_handle_limit = loop_var; \ 1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* for_with_handle_isolate = isolate; \ 1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch while (limit_check) { \ 1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for_with_handle_limit += 1024; \ 1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch HandleScope loop_scope(for_with_handle_isolate); \ 1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (; limit_check && loop_var < for_with_handle_limit; increment) { \ 1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch body \ 1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } \ 1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } \ 1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } while (false) 19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier. 1978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId { 1988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 1998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Creates an invalid ThreadId. 200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); } 201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ThreadId& operator=(const ThreadId& other) { 203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::NoBarrier_Store(&id_, base::NoBarrier_Load(&other.id_)); 204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return *this; 205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Returns ThreadId for current thread. 2088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId Current() { return ThreadId(GetCurrentThreadId()); } 2098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Returns invalid ThreadId (guaranteed not to be equal to any thread). 2118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId Invalid() { return ThreadId(kInvalidId); } 2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Compares ThreadIds for equality. 2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch INLINE(bool Equals(const ThreadId& other) const) { 215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::NoBarrier_Load(&id_) == base::NoBarrier_Load(&other.id_); 2168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Checks whether this ThreadId refers to any thread. 2198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch INLINE(bool IsValid() const) { 220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::NoBarrier_Load(&id_) != kInvalidId; 2218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts ThreadId to an integer representation 2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // (required for public API: V8::V8::GetCurrentThreadId). 225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int ToInteger() const { return static_cast<int>(base::NoBarrier_Load(&id_)); } 2268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts ThreadId to an integer representation 2288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // (required for public API: V8::V8::TerminateExecution). 2298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId FromInteger(int id) { return ThreadId(id); } 2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static const int kInvalidId = -1; 2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit ThreadId(int id) { base::NoBarrier_Store(&id_, id); } 2358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static int AllocateThreadId(); 2378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static int GetCurrentThreadId(); 2398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::Atomic32 id_; 2418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Atomic32 highest_thread_id_; 2438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch friend class Isolate; 2458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 2468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ACCESSOR(type, name) \ 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_##name(type v) { name##_ = v; } \ 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type name() const { return name##_; } 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 25344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED { 25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 2558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Does early low-level initialization that does not depend on the 2568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // isolate being present. 2578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadLocalTop(); 2588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initialize the thread data. 26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Initialize(); 26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the top C++ try catch handler or NULL if none are registered. 26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This method is not guaranteed to return an address that can be 26544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // used for comparison with addresses into the JS stack. If such an 26644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // address is needed, use try_catch_handler_address. 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(v8::TryCatch*, try_catch_handler) 26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the address of the top C++ try catch handler or NULL if 27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // none are registered. 27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method always returns an address that can be compared to 27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // pointers into the JavaScript stack. When running on actual 27444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // hardware, try_catch_handler_address and TryCatchHandler return 27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the same pointer. When running on a simulator with a separate JS 27644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // stack, try_catch_handler_address returns a JS stack address that 27744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // corresponds to the place on the JS stack where the C++ handler 27844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // would have been if the stack were not separate. 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address try_catch_handler_address() { 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>( 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch::JSStackComparableAddress(try_catch_handler())); 28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 28344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Free(); 28544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Isolate* isolate_; 28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The context where the current execution method is created and for variable 28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // lookups. 28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context_; 2908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId thread_id_; 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* pending_exception_; 292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Communication channel between Isolate::FindHandler and the CEntryStub. 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* pending_handler_context_; 295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Code* pending_handler_code_; 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch intptr_t pending_handler_offset_; 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pending_handler_fp_; 298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pending_handler_sp_; 299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Communication channel between Isolate::Throw and message consumers. 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool rethrowing_message_; 30244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* pending_message_obj_; 303014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Use a separate value for scheduled exceptions to preserve the 30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // invariants that hold about pending_exception. We may want to 30644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // unify them later. 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* scheduled_exception_; 30844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool external_caught_exception_; 30944f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* save_context_; 31044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 31144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Stack. 31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address c_entry_fp_; // the frame pointer of the top c entry frame 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address handler_; // try-blocks are chained through the stack 314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Address c_function_; // C function that was called at c entry. 31544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Throwing an exception may cause a Promise rejection. For this purpose 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // we keep track of a stack of nested promises and the corresponding 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // try-catch handlers. 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* promise_on_stack_; 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR 32244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 32344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address js_entry_sp_; // the stack pointer of the bottom JS entry frame 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the external callback we're currently in 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalCallbackScope* external_callback_scope_; 32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block StateTag current_vm_state_; 32944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Call back function to report unsafe JS accesses. 33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::FailedAccessCheckCallback failed_access_check_callback_; 33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 3348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch void InitializeInternal(); 3358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch* try_catch_handler_; 33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 33844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 34144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V) \ 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(bool, simulator_initialized, false) \ 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HashMap*, simulator_i_cache, NULL) \ 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Redirection*, simulator_redirection, NULL) 34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V) 34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) \ 35644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(CommentStatistic, paged_space_comments_statistics, \ 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CommentStatistic::kMaxComments + 1) \ 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int, code_kind_statistics, Code::NUMBER_OF_KINDS) 35944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 36444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V) \ 36644f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* SerializerDeserializer state. */ \ 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int32_t, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \ 36844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, bad_char_shift_table, kUC16AlphabetSize) \ 36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, good_suffix_shift_table, (kBMMaxShift + 1)) \ 37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, suffix_table, (kBMMaxShift + 1)) \ 3713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(uint32_t, private_random_seed, 2) \ 37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 37344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef List<HeapObject*> DebugObjectCache; 37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_LIST(V) \ 37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* Assembler state. */ \ 37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(FatalErrorCallback, exception_behavior, NULL) \ 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LogEventCallback, event_logger, NULL) \ 380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, NULL) \ 38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* To distinguish the function templates, so that we can find them in the */ \ 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch /* function cache of the native context. */ \ 38344f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, next_serial_number, 0) \ 38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalReferenceRedirectorPointer*, external_reference_redirector, NULL) \ 38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* State for Relocatable. */ \ 38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Relocatable*, relocatable_top, NULL) \ 38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(DebugObjectCache*, string_stream_debug_object_cache, NULL) \ 38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(Object*, string_stream_current_security_token, NULL) \ 38944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalReferenceTable*, external_reference_table, NULL) \ 390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HashMap*, external_reference_map, NULL) \ 391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HashMap*, root_index_map, NULL) \ 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int, pending_microtask_count, 0) \ 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HStatistics*, hstatistics, NULL) \ 394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CompilationStatistics*, turbo_statistics, NULL) \ 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HTracer*, htracer, NULL) \ 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CodeTracer*, code_tracer, NULL) \ 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(bool, fp_stubs_generated, false) \ 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu) \ 399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(PromiseRejectCallback, promise_reject_callback, NULL) \ 400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(const v8::StartupData*, snapshot_blob, NULL) \ 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ISOLATE_INIT_SIMULATOR_LIST(V) 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define THREAD_LOCAL_TOP_ACCESSOR(type, name) \ 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_##name(type v) { thread_local_top_.name##_ = v; } \ 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type name() const { return thread_local_top_.name##_; } 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THREAD_LOCAL_TOP_ADDRESS(type, name) \ 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch type* name##_address() { return &thread_local_top_.name##_; } 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 41044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate { 41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These forward declarations are required to make the friend declarations in 41344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // PerIsolateThreadData work on some older versions of gcc. 41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable; 41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem; 41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~Isolate(); 41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A thread has a PerIsolateThreadData instance for each isolate that it has 42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // entered. That instance is allocated when the isolate is initially entered 42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // and reused on subsequent entries. 42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block class PerIsolateThreadData { 42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData(Isolate* isolate, ThreadId thread_id) 42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block : isolate_(isolate), 42644f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_id_(thread_id), 42744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_limit_(0), 42844f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_state_(NULL), 429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 43044f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_(NULL), 43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 43244f0eee88ff00398ff7f715fab053374d808c90dSteve Block next_(NULL), 43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block prev_(NULL) { } 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~PerIsolateThreadData(); 43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate() const { return isolate_; } 43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id() const { return thread_id_; } 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(uintptr_t, stack_limit) 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(ThreadState*, thread_state) 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(Simulator*, simulator) 44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Matches(Isolate* isolate, ThreadId thread_id) const { 4468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return isolate_ == isolate && thread_id_.Equals(thread_id); 44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id_; 45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t stack_limit_; 45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadState* thread_state_; 45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* next_; 46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* prev_; 46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class Isolate; 46344f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ThreadDataTable; 46444f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class EntryStackItem; 46544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData); 46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47044f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum AddressId { 471589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address, 472589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM) 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_ENUM 474589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kIsolateAddressCount 47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitializeOncePerProcess(); 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the PerIsolateThreadData for the current thread (or NULL if one is 48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not currently set). 48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static PerIsolateThreadData* CurrentPerIsolateThreadData() { 48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return reinterpret_cast<PerIsolateThreadData*>( 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetThreadLocal(per_isolate_thread_data_key_)); 48444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 48644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the isolate inside which the current thread is running. 48744f0eee88ff00398ff7f715fab053374d808c90dSteve Block INLINE(static Isolate* Current()) { 488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1); 48944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = reinterpret_cast<Isolate*>( 490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetExistingThreadLocal(isolate_key_)); 491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate != NULL); 49244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate; 49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 49444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 49569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Usually called by Init(), but can be called early e.g. to allow 49669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // testing components that require logging but not the whole 49769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // isolate. 49869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // 49969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Safe to call more than once. 50069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void InitializeLoggingAndCounters(); 50169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 50244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Init(Deserializer* des); 50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // True if at least one thread Enter'ed this isolate. 50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsInUse() { return entry_stack_ != NULL; } 50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 50744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Destroys the non-default isolates. 50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Sets default isolate into "has_been_disposed" state rather then destroying, 50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for legacy API reasons. 51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void TearDown(); 51144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void GlobalTearDown(); 51344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ClearSerializerData(); 515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Find the PerThread for this particular (isolate, thread) combination 517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // If one does not yet exist, return null. 518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PerIsolateThreadData* FindPerThreadDataForThisThread(); 519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the PerThread for given (isolate, thread) combination 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If one does not yet exist, return null. 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id); 52344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 524014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Discard the PerThread for this particular (isolate, thread) combination 525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If one does not yet exist, no-op. 526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void DiscardPerThreadDataForThisThread(); 527014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store the pointer to the current isolate. 52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Used internally for V8 threads that do not execute JavaScript but still 53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // are part of the domain of an isolate (like the context switcher). 531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey isolate_key() { 53285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return isolate_key_; 53385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch } 53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store process-wide thread IDs. 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey thread_id_key() { 53785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return thread_id_key_; 53885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch } 53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey per_isolate_thread_data_key(); 54144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 54244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Mutex for serializing access to break control structures. 543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RecursiveMutex* break_access() { return &break_access_; } 54469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 54544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address get_address_from_id(AddressId id); 54644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 54744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to top context (where the current function object was created). 54844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context() { return thread_local_top_.context_; } 549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_context(Context* context); 55044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context** context_address() { return &thread_local_top_.context_; } 55144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(SaveContext*, save_context) 55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to current thread id. 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(ThreadId, thread_id) 55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 55744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Interface to pending exception. 558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* pending_exception(); 559014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_pending_exception(Object* exception_obj); 560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_pending_exception(); 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception) 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_pending_exception(); 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context) 567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code) 568014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset) 569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp) 570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp) 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception) 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::TryCatch* try_catch_handler() { 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return thread_local_top_.try_catch_handler(); 57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool* external_caught_exception_address() { 57844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.external_caught_exception_; 57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception) 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_pending_message(); 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address pending_message_obj_address() { 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_); 5868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* scheduled_exception(); 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_scheduled_exception(); 590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_scheduled_exception(); 59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsJavaScriptHandlerOnTop(Object* exception); 593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsExternalHandlerOnTop(Object* exception); 59444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_catchable_by_javascript(Object* exception); 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JS execution stack (see frames.h). 59844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address c_entry_fp(ThreadLocalTop* thread) { 59944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread->c_entry_fp_; 60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 60144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address handler(ThreadLocalTop* thread) { return thread->handler_; } 602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Address c_function() { return thread_local_top_.c_function_; } 60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* c_entry_fp_address() { 60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.c_entry_fp_; 60644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 60744f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* handler_address() { return &thread_local_top_.handler_; } 608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Address* c_function_address() { 609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return &thread_local_top_.c_function_; 610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 61144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bottom JS entry. 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address js_entry_sp() { 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return thread_local_top_.js_entry_sp_; 61544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 61644f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* js_entry_sp_address() { 61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.js_entry_sp_; 61844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 61944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global object of the current context. It could be 6213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a builtin object, or a JS global object. 622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Handle<JSGlobalObject> global_object(); 62344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global proxy object of the current context. 625bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline Handle<JSObject> global_proxy(); 62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } 62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FreeThreadResources() { thread_local_top_.Free(); } 62944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method is called by the api after operations that may throw 63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // exceptions. If an exception was thrown and not handled by an external 63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // handler the exception is scheduled to be rethrown when we return to running 63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JavaScript code. If an exception is scheduled true is returned. 63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool OptionalRescheduleException(bool is_bottom_call); 63544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push and pop a promise and the current try-catch handler. 637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PushPromise(Handle<JSObject> promise, Handle<JSFunction> function); 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PopPromise(); 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> GetPromiseOnStackOnThrow(); 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch class ExceptionScope { 6428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Scope currently can only be used for regular exceptions, 644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // not termination exception. 645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline explicit ExceptionScope(Isolate* isolate); 646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ~ExceptionScope(); 6478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 6488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 6498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate_; 6508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> pending_exception_; 6518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }; 6528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetCaptureStackTraceForUncaughtExceptions( 65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture, 65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 65744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAbortOnUncaughtExceptionCallback( 659014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback callback); 660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum PrintStackMode { kPrintStackConcise, kPrintStackVerbose }; 66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintCurrentStackTrace(FILE* out); 663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintStack(StringStream* accumulator, 664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintStackMode mode = kPrintStackVerbose); 665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintStack(FILE* out, PrintStackMode mode = kPrintStackVerbose); 66644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> StackTraceString(); 667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NO_INLINE(void PushStackTraceAndDie(unsigned int magic, void* ptr1, 668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* ptr2, unsigned int magic2)); 66944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<JSArray> CaptureCurrentStackTrace( 67044f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 67144f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 6723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> CaptureSimpleStackTrace(Handle<JSReceiver> error_object, 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> caller); 6743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MaybeHandle<JSReceiver> CaptureAndSetDetailedStackTrace( 6753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> error_object); 6763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MaybeHandle<JSReceiver> CaptureAndSetSimpleStackTrace( 6773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> error_object, Handle<Object> caller); 678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> GetDetailedStackTrace(Handle<JSObject> error_object); 679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> GetDetailedFromSimpleStackTrace( 680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSObject> error_object); 6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 682014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns if the given context may access the given global object. If 68344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the result is false, the pending exception is guaranteed to be 68444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // set. 685014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool MayAccess(Handle<Context> accessing_context, Handle<JSObject> receiver); 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback); 688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReportFailedAccessCheck(Handle<JSObject> receiver); 68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exception throwing support. The caller should use the result 691bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // of Throw() as its return vaue. 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* Throw(Object* exception, MessageLocation* location = NULL); 693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* ThrowIllegalOperation(); 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename T> 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception, 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MessageLocation* location = NULL) { 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Throw(*exception, location); 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MaybeHandle<T>(); 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 702014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Re-throw an exception. This involves no error reporting since error 703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // reporting was handled when the exception was thrown originally. 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* ReThrow(Object* exception); 705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find the correct handler for the current pending exception. This also 707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // clears and returns the current pending exception. 708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* UnwindAndFindHandler(); 709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 710014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to predict whether an exception will be caught. Note that this can 711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // only produce an estimate, because it is undecidable whether a finally 712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // clause will consume or re-throw an exception. We conservatively assume any 713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // finally clause will behave as if the exception were consumed. 714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum CatchType { NOT_CAUGHT, CAUGHT_BY_JAVASCRIPT, CAUGHT_BY_EXTERNAL }; 715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CatchType PredictExceptionCatcher(); 716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ScheduleThrow(Object* exception); 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Re-set pending message, script and positions reported to the TryCatch 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // back to the TLS for re-use when rethrowing. 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RestorePendingMessageFromTryCatch(v8::TryCatch* handler); 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Un-schedule an exception that was caught by a TryCatch handler. 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler); 72344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ReportPendingMessages(); 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return pending location if any or unfilled structure. 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MessageLocation GetMessageLocation(); 72644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 72744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Promote a scheduled exception to pending. Asserts has_scheduled_exception. 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* PromoteScheduledException(); 72944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 73044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Attempts to compute the current source location, storing the 73144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // result in the target out parameter. 732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ComputeLocation(MessageLocation* target); 733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ComputeLocationFromException(MessageLocation* target, 734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> exception); 735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool ComputeLocationFromStackTrace(MessageLocation* target, 736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> exception); 737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSMessageObject> CreateMessage(Handle<Object> exception, 739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MessageLocation* location); 74044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 74144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Out of resource exception helpers. 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* StackOverflow(); 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* TerminateExecution(); 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CancelTerminateExecution(); 745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void RequestInterrupt(InterruptCallback callback, void* data); 747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void InvokeApiInterruptCallbacks(); 74844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 74944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Administration 75044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v); 75144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v, ThreadLocalTop* t); 75244f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* Iterate(ObjectVisitor* v, char* t); 75344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IterateThread(ThreadVisitor* v, char* t); 75444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns the current native context. 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> native_context(); 75744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the native context of the calling JavaScript code. That 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is, the native context of the top-most JavaScript frame. 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> GetCallingNativeContext(); 76144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void RegisterTryCatchHandler(v8::TryCatch* that); 76344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UnregisterTryCatchHandler(v8::TryCatch* that); 76444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* ArchiveThread(char* to); 76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* RestoreThread(char* from); 76744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const char* const kStackOverflowMessage; 76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 77044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kUC16AlphabetSize = 256; // See StringSearchBase. 77144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kBMMaxShift = 250; // See StringSearchBase. 77244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 77344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Accessors. 77444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue) \ 77544f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type name() const { \ 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 77744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return name##_; \ 77844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } \ 77944f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_##name(type value) { \ 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block name##_ = value; \ 78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_ACCESSOR) 78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR 78544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length) \ 78744f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type* name() { \ 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &(name##_)[0]; \ 79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR) 79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR 79344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 794014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \ 795014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Handle<type> name(); \ 796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_##name(type* value); 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSOR) 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSOR 79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 80044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper() { return bootstrapper_; } 80169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Counters* counters() { 80269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Call InitializeLoggingAndCounters() if logging is needed before 80369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the isolate is fully initialized. 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(counters_ != NULL); 80569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return counters_; 80669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 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 KeyedLookupCache* keyed_lookup_cache() { 83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return keyed_lookup_cache_; 83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache() { 83544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return context_slot_cache_; 83644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 83744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 83844f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache() { 83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return descriptor_lookup_cache_; 84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 84144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData* handle_scope_data() { return &handle_scope_data_; } 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 84444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer() { 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handle_scope_implementer_); 84644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return handle_scope_implementer_; 84744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* runtime_zone() { return &runtime_zone_; } 849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Zone* interface_descriptor_zone() { return &interface_descriptor_zone_; } 85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch UnicodeCache* unicode_cache() { 8528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return unicode_cache_; 85344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 85444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InnerPointerToCodeCache* inner_pointer_to_code_cache() { 8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return inner_pointer_to_code_cache_; 8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 85944f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles() { return global_handles_; } 86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EternalHandles* eternal_handles() { return eternal_handles_; } 86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadManager* thread_manager() { return thread_manager_; } 86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 86544f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() { 86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_uncanonicalize_; 86744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 86844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() { 87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_canonrange_; 87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState* runtime_state() { return &runtime_state_; } 87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins* builtins() { return &builtins_; } 87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void NotifyExtensionInstalled() { 8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has_installed_extensions_ = true; 8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool has_installed_extensions() { return has_installed_extensions_; } 8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize() { 88544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ®exp_macro_assembler_canonicalize_; 88644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 88744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack() { return regexp_stack_; } 88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block interp_canonicalize_mapping() { 892109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ®exp_macro_assembler_canonicalize_; 89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug* debug() { return debug_; } 89644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CpuProfiler* cpu_profiler() const { return cpu_profiler_; } 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* heap_profiler() const { return heap_profiler_; } 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo* heap_histograms() { return heap_histograms_; } 90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation* js_spill_information() { 90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &js_spill_information_; 90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Factory* factory() { return reinterpret_cast<Factory*>(this); } 90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kJSRegexpStaticOffsetsVectorSize = 128; 91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(ExternalCallbackScope*, external_callback_scope) 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(StateTag, current_vm_state) 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetData(uint32_t slot, void* data) { 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot < Internals::kNumIsolateDataSlots); 918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch embedder_data_[slot] = data; 91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* GetData(uint32_t slot) { 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot < Internals::kNumIsolateDataSlots); 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return embedder_data_[slot]; 92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool serializer_enabled() const { return serializer_enabled_; } 926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool snapshot_available() const { 927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return snapshot_blob_ != NULL && snapshot_blob_->raw_size != 0; 928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 92944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDead() { return has_fatal_error_; } 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SignalFatalError() { has_fatal_error_ = true; } 93244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool use_crankshaft() const; 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool initialized_from_snapshot() { return initialized_from_snapshot_; } 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double time_millis_since_init() { 938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return heap_.MonotonicallyIncreasingTimeInMs() - time_millis_at_init_; 93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DateCache* date_cache() { 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return date_cache_; 94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_date_cache(DateCache* date_cache) { 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (date_cache != date_cache_) { 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete date_cache_; 94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch date_cache_ = date_cache; 95044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 95144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Map* get_initial_js_array_map(ElementsKind kind); 953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kArrayProtectorValid = 1; 955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kArrayProtectorInvalid = 0; 956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFastArrayConstructorPrototypeChainIntact(); 9583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool IsArraySpeciesLookupChainIntact(); 959bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline bool IsHasInstanceLookupChainIntact(); 960bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsIsConcatSpreadableLookupChainIntact(); 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // On intent to set an element in object, make sure that appropriate 963014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // notifications occur if the set is on the elements of the array or 964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // object prototype. Also ensure that changes to prototype chain between 965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Array and Object fire notifications. 966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetElement(Handle<JSObject> object); 967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetLength(Handle<JSObject> object) { 968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetPrototype(Handle<JSObject> object) { 971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnNormalizeElements(Handle<JSObject> object) { 974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 976109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void InvalidateArraySpeciesProtector(); 977bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void InvalidateHasInstanceProtector(); 978bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void InvalidateIsConcatSpreadableProtector(); 979014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if array is the initial array prototype in any native context. 981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsAnyInitialArrayPrototype(Handle<JSArray> array); 982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptorData* call_descriptor_data(int index); 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void IterateDeferredHandles(ObjectVisitor* visitor); 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void LinkDeferredHandles(DeferredHandles* deferred_handles); 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UnlinkDeferredHandles(DeferredHandles* deferred_handles); 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDeferredHandle(Object** location); 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // DEBUG 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool concurrent_recompilation_enabled() { 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Thread is only available with flag enabled. 995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(optimizing_compile_dispatcher_ == NULL || 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FLAG_concurrent_recompilation); 997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_ != NULL; 9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizingCompileDispatcher* optimizing_compile_dispatcher() { 1001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_; 10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id() const { return static_cast<int>(id_); } 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStatistics* GetHStatistics(); 1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CompilationStatistics* GetTurboStatistics(); 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTracer* GetHTracer(); 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeTracer* GetCodeTracer(); 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DumpAndResetCompilationStats(); 1012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook function_entry_hook() { return function_entry_hook_; } 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_function_entry_hook(FunctionEntryHook function_entry_hook) { 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function_entry_hook_ = function_entry_hook; 10163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* stress_deopt_count_address() { return &stress_deopt_count_; } 1019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* virtual_handler_register_address() { 1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return &virtual_handler_register_; 1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* virtual_slot_register_address() { return &virtual_slot_register_; } 1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::RandomNumberGenerator* random_number_generator(); 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Given an address occupied by a live code object, return that object. 1029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* FindCodeObject(Address a); 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NextOptimizationId() { 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id = next_optimization_id_++; 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!Smi::IsValid(next_optimization_id_)) { 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_optimization_id_ = 0; 10353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return id; 10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void IncrementJsCallsFromApiCounter() { ++js_calls_from_api_counter_; } 1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch unsigned int js_calls_from_api_counter() { 1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return js_calls_from_api_counter_; 1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get (and lazily initialize) the registry for per-isolate symbols. 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> GetSymbolRegistry(); 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCallCompletedCallback(CallCompletedCallback callback); 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemoveCallCompletedCallback(CallCompletedCallback callback); 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void FireCallCompletedCallback(); 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1052109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 1053109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 1054109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void FireBeforeCallEnteredCallback(); 1055109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 10563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void AddMicrotasksCompletedCallback(MicrotasksCompletedCallback callback); 10573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void RemoveMicrotasksCompletedCallback(MicrotasksCompletedCallback callback); 10583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void FireMicrotasksCompletedCallback(); 10593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetPromiseRejectCallback(PromiseRejectCallback callback); 1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void ReportPromiseReject(Handle<JSObject> promise, Handle<Object> value, 1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::PromiseRejectEvent event); 1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void EnqueueMicrotask(Handle<Object> microtask); 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RunMicrotasks(); 1066bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsRunningMicrotasks() const { return is_running_microtasks_; } 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback); 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CountUsage(v8::Isolate::UseCounterFeature feature); 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* GetOrCreateBasicBlockProfiler(); 1072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* basic_block_profiler() { return basic_block_profiler_; } 1073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::string GetTurboCfgFileName(); 1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int GetNextUniqueSharedFunctionInfoId() { return next_unique_sfi_id_++; } 1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Support for dynamically disabling tail call elimination. 10813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address is_tail_call_elimination_enabled_address() { 10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>(&is_tail_call_elimination_enabled_); 10833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 10843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool is_tail_call_elimination_enabled() const { 10853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return is_tail_call_elimination_enabled_; 10863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 10873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void SetTailCallEliminationEnabled(bool enabled); 1088014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddDetachedContext(Handle<Context> context); 1090014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CheckDetachedContextsAfterGC(); 1091014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Object*>* partial_snapshot_cache() { return &partial_snapshot_cache_; } 1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void set_array_buffer_allocator(v8::ArrayBuffer::Allocator* allocator) { 1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch array_buffer_allocator_ = allocator; 1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::ArrayBuffer::Allocator* array_buffer_allocator() const { 1098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return array_buffer_allocator_; 1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FutexWaitListNode* futex_wait_list_node() { return &futex_wait_list_node_; } 1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CancelableTaskManager* cancelable_task_manager() { 1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cancelable_task_manager_; 1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Interpreter* interpreter() const { return interpreter_; } 1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch base::AccountingAllocator* allocator() { return &allocator_; } 11103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1111bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsInAnyContext(Object* object, uint32_t index); 1112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 1113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit Isolate(bool enable_serializer); 1115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsArrayOrObjectPrototype(Object* object); 111644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 11183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch friend struct GlobalState; 11193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch friend struct InitializeGlobalState; 1120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> SetUpSubregistry(Handle<JSObject> registry, Handle<Map> map, 1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* name); 11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These fields are accessed through the API, offsets must be kept in sync 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // with v8::internal::Internals (in include/v8.h) constants. This is also 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // verified in Isolate::Init() using runtime checks. 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* embedder_data_[Internals::kNumIsolateDataSlots]; 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap heap_; 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The per-process lock should be acquired before the ThreadDataTable is 113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // modified. 113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable { 113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 113344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadDataTable(); 113444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ThreadDataTable(); 113544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113644f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id); 113744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Insert(PerIsolateThreadData* data); 113844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Remove(PerIsolateThreadData* data); 11393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void RemoveAllThreads(Isolate* isolate); 114044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 114144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 114244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* list_; 114344f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 114444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 114544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These items form a stack synchronously with threads Enter'ing and Exit'ing 114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the Isolate. The top of the stack points to a thread which is currently 114744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // running the Isolate. When the stack is empty, the Isolate is considered 114844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not entered by any thread and can be Disposed. 114944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If the same thread enters the Isolate more then once, the entry_count_ 115044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // is incremented rather then a new item pushed to the stack. 115144f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem { 115244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 115344f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem(PerIsolateThreadData* previous_thread_data, 115444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate, 115544f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item) 115644f0eee88ff00398ff7f715fab053374d808c90dSteve Block : entry_count(1), 115744f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_thread_data(previous_thread_data), 115844f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_isolate(previous_isolate), 115944f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_item(previous_item) { } 116044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 116144f0eee88ff00398ff7f715fab053374d808c90dSteve Block int entry_count; 116244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* previous_thread_data; 116344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate; 116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item; 116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 11663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 116744f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(EntryStackItem); 116844f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 116944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::LazyMutex thread_data_table_mutex_; 117185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey per_isolate_thread_data_key_; 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey isolate_key_; 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey thread_id_key_; 117585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch static ThreadDataTable* thread_data_table_; 117685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A global counter for all generated Isolates, might overflow. 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Atomic32 isolate_counter_; 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG 1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static base::Atomic32 isolate_key_created_; 1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Deinit(); 118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void SetIsolateThreadLocals(Isolate* isolate, 118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* data); 118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Find the PerThread for this particular (isolate, thread) combination. 119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If one does not yet exist, allocate a new one. 119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread(); 119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initializes the current thread to run this Isolate. 119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Enter(); 119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exits the current thread. The previosuly entered Isolate is restored 119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for the thread. 120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Exit(); 120344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void InitializeThreadLocal(); 120544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 120644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactPrologue(bool is_compacting, 120744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 120844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactEpilogue(bool is_compacting, 120944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 121144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FillCache(); 121244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Propagate pending exception message to the v8::TryCatch. 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If there is no external try-catch or message was successfully propagated, 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // then return true. 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool PropagatePendingExceptionToExternalTryCatch(); 121769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Remove per-frame stored materialized objects when we are unwinding 1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the frame. 1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveMaterializedObjectsOnUnwind(StackFrame* frame); 12213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void RunMicrotasksInternal(); 12233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Atomic32 id_; 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EntryStackItem* entry_stack_; 122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_nesting_level_; 122744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* incomplete_message_; 1228589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Address isolate_addresses_[kIsolateAddressCount + 1]; // NOLINT 122944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper_; 123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler_; 123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache_; 123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Counters* counters_; 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RecursiveMutex break_access_; 123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger* logger_; 123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard stack_guard_; 123644f0eee88ff00398ff7f715fab053374d808c90dSteve Block StatsTable* stats_table_; 123744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StubCache* stub_cache_; 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeAgingHelper* code_aging_helper_; 123944f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data_; 1240109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool deoptimizer_lazy_throw_; 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaterializedObjectStore* materialized_object_store_; 124244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop thread_local_top_; 124344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture_stack_trace_for_uncaught_exceptions_; 124444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_for_uncaught_exceptions_frame_limit_; 124544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_; 124644f0eee88ff00398ff7f715fab053374d808c90dSteve Block KeyedLookupCache* keyed_lookup_cache_; 124744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache_; 124844f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache_; 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData handle_scope_data_; 125044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer_; 12518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch UnicodeCache* unicode_cache_; 12523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch base::AccountingAllocator allocator_; 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone runtime_zone_; 1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Zone interface_descriptor_zone_; 12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InnerPointerToCodeCache* inner_pointer_to_code_cache_; 125644f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles_; 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EternalHandles* eternal_handles_; 125844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadManager* thread_manager_; 125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState runtime_state_; 126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins builtins_; 12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool has_installed_extensions_; 126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_; 126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_; 126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize> 126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize_; 126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack_; 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DateCache* date_cache_; 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptorData* call_descriptor_data_; 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RandomNumberGenerator* random_number_generator_; 127044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Whether the isolate has been created for snapshotting. 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool serializer_enabled_; 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if fatal error has been signaled for this isolate. 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_fatal_error_; 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if this isolate was initialized from a snapshot. 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool initialized_from_snapshot_; 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // True if ES2015 tail call elimination feature is enabled. 12813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool is_tail_call_elimination_enabled_; 12823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Time stamp at initialization. 12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double time_millis_at_init_; 12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 128644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 128744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A static array of histogram info for each type. 128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo heap_histograms_[LAST_TYPE + 1]; 128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation js_spill_information_; 129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debug* debug_; 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CpuProfiler* cpu_profiler_; 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* heap_profiler_; 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook function_entry_hook_; 129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Interpreter* interpreter_; 1298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typedef std::pair<InterruptCallback, void*> InterruptEntry; 1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::queue<InterruptEntry> api_interrupts_queue_; 1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 130244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue) \ 130344f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_; 130444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE) 130544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE 130644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 130744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length) \ 130844f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_[length]; 130944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE) 131044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE 131144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 131244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 131344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This class is huge and has a number of fields controlled by 131444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // preprocessor defines. Make sure the offsets of these fields agree 131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // between compilation units. 131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const intptr_t name##_debug_offset_; 131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET 132144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 132244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* deferred_handles_head_; 1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizingCompileDispatcher* optimizing_compile_dispatcher_; 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Counts deopt points if deopt_every_n_times is enabled. 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned int stress_deopt_count_; 1328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address virtual_handler_register_; 1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address virtual_slot_register_; 1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int next_optimization_id_; 1333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Counts javascript calls from the API. Wraps around on overflow. 1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch unsigned int js_calls_from_api_counter_; 1336014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int next_unique_sfi_id_; 1339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1341109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // List of callbacks before a Call starts execution. 1342109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch List<BeforeCallEnteredCallback> before_call_entered_callbacks_; 1343109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // List of callbacks when a Call completes. 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch List<CallCompletedCallback> call_completed_callbacks_; 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // List of callbacks after microtasks were run. 13483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch List<MicrotasksCompletedCallback> microtasks_completed_callbacks_; 1349bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool is_running_microtasks_; 13503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Isolate::UseCounterCallback use_counter_callback_; 1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* basic_block_profiler_; 1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1354014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Object*> partial_snapshot_cache_; 1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::ArrayBuffer::Allocator* array_buffer_allocator_; 1357014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1358014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FutexWaitListNode futex_wait_list_node_; 1359014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CancelableTaskManager* cancelable_task_manager_; 1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback 1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch abort_on_uncaught_exception_callback_; 1364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ExecutionAccess; 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HandleScopeImplementer; 1367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class OptimizingCompileDispatcher; 1368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class SweeperThread; 1369257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class ThreadManager; 1370257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class Simulator; 1371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class StackGuard; 13728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch friend class ThreadId; 137344f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Isolate; 137444f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Locker; 1375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class v8::Unlocker; 1376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend v8::StartupData v8::V8::CreateSnapshotDataBlob(const char*); 13773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch friend v8::StartupData v8::V8::WarmUpSnapshotDataBlob(v8::StartupData, 13783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch const char*); 137944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(Isolate); 138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 138244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ACCESSOR 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef THREAD_LOCAL_TOP_ACCESSOR 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack { 1389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PromiseOnStack(Handle<JSFunction> function, Handle<JSObject> promise, 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev) 1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : function_(function), promise_(promise), prev_(prev) {} 1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> function() { return function_; } 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> promise() { return promise_; } 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev() { return prev_; } 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> function_; 1399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> promise_; 1400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev_; 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 140444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the 140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these 140644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details. 140744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED { 140844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit SaveContext(Isolate* isolate); 1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ~SaveContext(); 141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context() { return context_; } 141344f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev() { return prev_; } 141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns true if this save context is below a given JavaScript frame. 14163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool IsBelowFrame(JavaScriptFrame* frame) { 14173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp()); 141844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 141944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 142244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 142344f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev_; 14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address c_entry_fp_; 142544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 142644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED { 142944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 143044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit AssertNoContextChange(Isolate* isolate); 143244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~AssertNoContextChange() { 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate_->context() == *context_); 143444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 143544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 143644f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 1437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 143844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 143944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 144044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AssertNoContextChange(Isolate* isolate) { } 144244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 144344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 144444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 144644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED { 144744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 144844f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) { 144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Lock(isolate); 145044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 145144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ExecutionAccess() { Unlock(isolate_); } 145244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Lock(Isolate* isolate) { isolate->break_access()->Lock(); } 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Unlock(Isolate* isolate) { isolate->break_access()->Unlock(); } 145544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 145644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static bool TryLock(Isolate* isolate) { 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return isolate->break_access()->TryLock(); 145844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 145944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 146044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 146144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 146244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 146344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 146444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for checking for stack-overflows. 146644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED { 146744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 146844f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { } 146944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use this to check for stack-overflows in C++ code. 1471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasOverflowed() const { 147244f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard = isolate_->stack_guard(); 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GetCurrentStackPosition() < stack_guard->real_climit(); 147444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Use this to check for interrupt request in C++ code. 1477014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool InterruptRequested() { 1478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackGuard* stack_guard = isolate_->stack_guard(); 1479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetCurrentStackPosition() < stack_guard->climit(); 1480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use this to check for stack-overflow when entering runtime from JS code. 1483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool JsHasOverflowed(uintptr_t gap = 0) const; 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 148544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 148644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 148744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 148844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1489bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#define STACK_CHECK(isolate, result_value) \ 1490bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch do { \ 1491bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch StackLimitCheck stack_check(isolate); \ 1492bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (stack_check.HasOverflowed()) { \ 1493bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch isolate->Throw(*isolate->factory()->NewRangeError( \ 1494bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch MessageTemplate::kStackOverflow)); \ 1495bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return result_value; \ 1496bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } \ 1497bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } while (false) 149844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 149944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost 150044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any 150144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into 150244f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account. 150344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED { 150444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PostponeInterruptsScope(Isolate* isolate, 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercept_mask = StackGuard::ALL_INTERRUPTS) 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : stack_guard_(isolate->stack_guard()), 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercept_mask_(intercept_mask), 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercepted_flags_(0) { 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_guard_->PushPostponeInterruptsScope(this); 151144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 151244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 151344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~PostponeInterruptsScope() { 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_guard_->PopPostponeInterruptsScope(); 151544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the bottom-most scope that intercepts this interrupt. 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return whether the interrupt has been intercepted. 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Intercept(StackGuard::InterruptFlag flag); 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 152144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 152244f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard_; 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercept_mask_; 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercepted_flags_; 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PostponeInterruptsScope* prev_; 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class StackGuard; 152844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 152944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 153044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CodeTracer final : public Malloced { 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit CodeTracer(int isolate_id) 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : file_(NULL), 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_depth_(0) { 1536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch file_ = stdout; 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 154044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_redirect_code_traces_to == NULL) { 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SNPrintF(filename_, 1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "code-%d-%d.asm", 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::GetCurrentProcessId(), 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_id); 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length()); 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 154944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteChars(filename_.start(), "", 0, false); 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 155244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Scope { 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); } 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~Scope() { tracer_->CloseFile(); } 155744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file() const { return tracer_->file(); } 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeTracer* tracer_; 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void OpenFile() { 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file_ == NULL) { 1570014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch file_ = base::OS::FOpen(filename_.start(), "ab"); 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_depth_++; 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 157544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CloseFile() { 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (--scope_depth_ == 0) { 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(file_); 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch file_ = NULL; 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file() const { return file_; } 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool ShouldRedirect() { 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FLAG_redirect_code_traces; 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EmbeddedVector<char, 128> filename_; 1595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file_; 1596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scope_depth_; 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 159844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 1600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 160144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 160244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // V8_ISOLATE_H_ 1603