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 813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include <memory> 9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <queue> 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8-debug.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/atomicops.h" 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/builtins/builtins.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/contexts.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/date.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/execution.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/frames.h" 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/futex-emulation.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/global-handles.h" 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/handles.h" 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/heap/heap.h" 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h" 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h" 253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/runtime/runtime.h" 26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h" 2744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2844f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 { 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace base { 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass RandomNumberGenerator; 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3444f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal { 3544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass AccessCompilerData; 37c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass AddressToIndexHashMap; 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass AstStringConstants; 39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass BasicBlockProfiler; 4044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Bootstrapper; 41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass CancelableTaskManager; 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CallInterfaceDescriptorData; 4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass CodeAgingHelper; 4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass CodeEventDispatcher; 4544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeGenerator; 4644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CodeRange; 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeStubDescriptor; 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass CodeTracer; 4944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CompilationCache; 5062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass CompilerDispatcher; 51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CompilationStatistics; 5244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ContextSlotCache; 5344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Counters; 5444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuFeatures; 5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass CpuProfiler; 5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass DeoptimizerData; 57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass DescriptorLookupCache; 5844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Deserializer; 5944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass EmptyStatement; 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ExternalCallbackScope; 6144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExternalReferenceTable; 6244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Factory; 6344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HandleScopeImplementer; 64c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass HeapObjectToIndexHashMap; 6544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HeapProfiler; 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStatistics; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTracer; 6844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass InlineRuntimeFunctionsTable; 693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass InnerPointerToCodeCache; 70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Logger; 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MaterializedObjectStore; 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass OptimizingCompileDispatcher; 7344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass RegExpStack; 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass RuntimeProfiler; 7544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext; 76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass StatsTable; 7744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StringTracker; 7844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StubCache; 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SweeperThread; 8044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadManager; 8144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadState; 8244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadVisitor; // Defined in v8threads.h 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass UnicodeCache; 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <StateTag Tag> class VMState; 8544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// 'void function pointer', used to roundtrip the 8744f0eee88ff00398ff7f715fab053374d808c90dSteve Block// ExternalReference::ExternalReferenceRedirector since we can not include 8844f0eee88ff00398ff7f715fab053374d808c90dSteve Block// assembler.h, where it is defined, here. 8944f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktypedef void* ExternalReferenceRedirectorPointer(); 9044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Debug; 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack; 9444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Redirection; 9544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Simulator; 9644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace interpreter { 98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass Interpreter; 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 10044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate) \ 1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch do { \ 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Isolate* __isolate__ = (isolate); \ 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (__isolate__->has_scheduled_exception()) { \ 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return __isolate__->PromoteScheduledException(); \ 1063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } while (false) 10844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Macros for MaybeHandle. 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, value) \ 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { \ 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* __isolate__ = (isolate); \ 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (__isolate__->has_scheduled_exception()) { \ 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch __isolate__->PromoteScheduledException(); \ 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; \ 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, T) \ 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, MaybeHandle<T>()) 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define RETURN_RESULT_OR_FAILURE(isolate, call) \ 12413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch do { \ 12513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Object> __result__; \ 12613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* __isolate__ = (isolate); \ 12713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!(call).ToHandle(&__result__)) { \ 12813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(__isolate__->has_pending_exception()); \ 12913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return __isolate__->heap()->exception(); \ 13013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } \ 13113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return *__result__; \ 13213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } while (false) 13313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, value) \ 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { \ 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!(call).ToHandle(&dst)) { \ 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((isolate)->has_pending_exception()); \ 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; \ 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } while (false) 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call) \ 14313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch do { \ 14413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* __isolate__ = (isolate); \ 14513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch ASSIGN_RETURN_ON_EXCEPTION_VALUE(__isolate__, dst, call, \ 14613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch __isolate__->heap()->exception()); \ 14713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } while (false) 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call, T) \ 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, dst, call, MaybeHandle<T>()) 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define THROW_NEW_ERROR(isolate, call, T) \ 15313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch do { \ 15413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* __isolate__ = (isolate); \ 15513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return __isolate__->Throw<T>(__isolate__->factory()->call); \ 1563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } while (false) 15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 15813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call) \ 15913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch do { \ 16013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* __isolate__ = (isolate); \ 16113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return __isolate__->Throw(*__isolate__->factory()->call); \ 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION_VALUE(isolate, call, value) \ 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch do { \ 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((call).is_null()) { \ 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK((isolate)->has_pending_exception()); \ 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; \ 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } while (false) 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 17213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define RETURN_FAILURE_ON_EXCEPTION(isolate, call) \ 17313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch do { \ 17413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Isolate* __isolate__ = (isolate); \ 17513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch RETURN_ON_EXCEPTION_VALUE(__isolate__, call, \ 17613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch __isolate__->heap()->exception()); \ 17713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } while (false); 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define RETURN_ON_EXCEPTION(isolate, call, T) \ 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RETURN_ON_EXCEPTION_VALUE(isolate, call, MaybeHandle<T>()) 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 183589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define FOR_EACH_ISOLATE_ADDRESS_NAME(C) \ 184589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(Handler, handler) \ 185589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(CEntryFP, c_entry_fp) \ 186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier C(CFunction, c_function) \ 187589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(Context, context) \ 188589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(PendingException, pending_exception) \ 189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerContext, pending_handler_context) \ 190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerCode, pending_handler_code) \ 191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerOffset, pending_handler_offset) \ 192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerFP, pending_handler_fp) \ 193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch C(PendingHandlerSP, pending_handler_sp) \ 194589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(ExternalCaughtException, external_caught_exception) \ 195589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch C(JSEntrySP, js_entry_sp) 19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define FOR_WITH_HANDLE_SCOPE(isolate, loop_var_type, init, loop_var, \ 1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch limit_check, increment, body) \ 1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch do { \ 2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch loop_var_type init; \ 2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch loop_var_type for_with_handle_limit = loop_var; \ 2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* for_with_handle_isolate = isolate; \ 2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch while (limit_check) { \ 2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for_with_handle_limit += 1024; \ 2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch HandleScope loop_scope(for_with_handle_isolate); \ 2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (; limit_check && loop_var < for_with_handle_limit; increment) { \ 2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch body \ 2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } \ 2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } \ 2103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } while (false) 21144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Platform-independent, reliable thread identifier. 2138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass ThreadId { 2148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 2158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Creates an invalid ThreadId. 216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ThreadId() { base::NoBarrier_Store(&id_, kInvalidId); } 217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ThreadId& operator=(const ThreadId& other) { 219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::NoBarrier_Store(&id_, base::NoBarrier_Load(&other.id_)); 220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return *this; 221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Returns ThreadId for current thread. 2248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId Current() { return ThreadId(GetCurrentThreadId()); } 2258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Returns invalid ThreadId (guaranteed not to be equal to any thread). 2278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId Invalid() { return ThreadId(kInvalidId); } 2288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Compares ThreadIds for equality. 2308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch INLINE(bool Equals(const ThreadId& other) const) { 231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::NoBarrier_Load(&id_) == base::NoBarrier_Load(&other.id_); 2328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Checks whether this ThreadId refers to any thread. 2358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch INLINE(bool IsValid() const) { 236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return base::NoBarrier_Load(&id_) != kInvalidId; 2378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts ThreadId to an integer representation 2408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // (required for public API: V8::V8::GetCurrentThreadId). 241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int ToInteger() const { return static_cast<int>(base::NoBarrier_Load(&id_)); } 2428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Converts ThreadId to an integer representation 2448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // (required for public API: V8::V8::TerminateExecution). 2458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static ThreadId FromInteger(int id) { return ThreadId(id); } 2468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 2488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static const int kInvalidId = -1; 2498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit ThreadId(int id) { base::NoBarrier_Store(&id_, id); } 2518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch static int AllocateThreadId(); 2538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 25462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_EXPORT_PRIVATE static int GetCurrentThreadId(); 2558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::Atomic32 id_; 2578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Atomic32 highest_thread_id_; 2598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch friend class Isolate; 2618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 2628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define FIELD_ACCESSOR(type, name) \ 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_##name(type v) { name##_ = v; } \ 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type name() const { return name##_; } 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ThreadLocalTop BASE_EMBEDDED { 27044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 2718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Does early low-level initialization that does not depend on the 2728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // isolate being present. 2738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadLocalTop(); 2748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 27544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initialize the thread data. 27644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Initialize(); 27744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 27844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the top C++ try catch handler or NULL if none are registered. 27944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This method is not guaranteed to return an address that can be 28144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // used for comparison with addresses into the JS stack. If such an 28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // address is needed, use try_catch_handler_address. 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(v8::TryCatch*, try_catch_handler) 28444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 28544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Get the address of the top C++ try catch handler or NULL if 28644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // none are registered. 28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // 28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method always returns an address that can be compared to 28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // pointers into the JavaScript stack. When running on actual 29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // hardware, try_catch_handler_address and TryCatchHandler return 29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the same pointer. When running on a simulator with a separate JS 29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // stack, try_catch_handler_address returns a JS stack address that 29344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // corresponds to the place on the JS stack where the C++ handler 29444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // would have been if the stack were not separate. 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address try_catch_handler_address() { 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>( 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch::JSStackComparableAddress(try_catch_handler())); 29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 29944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Free(); 30144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Isolate* isolate_; 30344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The context where the current execution method is created and for variable 30444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // lookups. 30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context_; 3068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId thread_id_; 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* pending_exception_; 308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Communication channel between Isolate::FindHandler and the CEntryStub. 310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* pending_handler_context_; 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Code* pending_handler_code_; 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch intptr_t pending_handler_offset_; 313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pending_handler_fp_; 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address pending_handler_sp_; 315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Communication channel between Isolate::Throw and message consumers. 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool rethrowing_message_; 31844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* pending_message_obj_; 319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Use a separate value for scheduled exceptions to preserve the 32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // invariants that hold about pending_exception. We may want to 32244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // unify them later. 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* scheduled_exception_; 32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool external_caught_exception_; 32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* save_context_; 32644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Stack. 32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address c_entry_fp_; // the frame pointer of the top c entry frame 329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address handler_; // try-blocks are chained through the stack 330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Address c_function_; // C function that was called at c entry. 33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Throwing an exception may cause a Promise rejection. For this purpose 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // we keep track of a stack of nested promises and the corresponding 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // try-catch handlers. 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* promise_on_stack_; 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef USE_SIMULATOR 33844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 33944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 34044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address js_entry_sp_; // the stack pointer of the bottom JS entry frame 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the external callback we're currently in 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalCallbackScope* external_callback_scope_; 34444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StateTag current_vm_state_; 34544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 34644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Call back function to report unsafe JS accesses. 34744f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::FailedAccessCheckCallback failed_access_check_callback_; 34844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 34944f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 3508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch void InitializeInternal(); 3518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch* try_catch_handler_; 35344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 35444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 356014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 35744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 358f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V) \ 359f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(bool, simulator_initialized, false) \ 360f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch V(base::CustomMatcherHashMap*, simulator_i_cache, NULL) \ 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Redirection*, simulator_redirection, NULL) 36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 36344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ISOLATE_INIT_SIMULATOR_LIST(V) 36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 36644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 36744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 37044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) \ 37213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CommentStatistic, paged_space_comments_statistics, \ 37313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch CommentStatistic::kMaxComments + 1) \ 37413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(int, code_kind_statistics, AbstractCode::NUMBER_OF_KINDS) 37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 37644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 37844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 38044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 38144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_LIST(V) \ 38244f0eee88ff00398ff7f715fab053374d808c90dSteve Block /* SerializerDeserializer state. */ \ 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(int32_t, jsregexp_static_offsets_vector, kJSRegexpStaticOffsetsVectorSize) \ 38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, bad_char_shift_table, kUC16AlphabetSize) \ 38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, good_suffix_shift_table, (kBMMaxShift + 1)) \ 38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(int, suffix_table, (kBMMaxShift + 1)) \ 38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_DEBUG_ARRAY_LIST(V) 38844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef List<HeapObject*> DebugObjectCache; 39044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 39113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#define ISOLATE_INIT_LIST(V) \ 39213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /* Assembler state. */ \ 39313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(FatalErrorCallback, exception_behavior, nullptr) \ 394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(OOMErrorCallback, oom_behavior, nullptr) \ 39513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(LogEventCallback, event_logger, nullptr) \ 39613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(AllowCodeGenerationFromStringsCallback, allow_code_gen_callback, nullptr) \ 39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(AllowWasmCompileCallback, allow_wasm_compile_callback, nullptr) \ 39862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(AllowWasmInstantiateCallback, allow_wasm_instantiate_callback, nullptr) \ 39913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalReferenceRedirectorPointer*, external_reference_redirector, \ 40013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch nullptr) \ 40113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /* State for Relocatable. */ \ 40213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Relocatable*, relocatable_top, nullptr) \ 40313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(DebugObjectCache*, string_stream_debug_object_cache, nullptr) \ 40413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(Object*, string_stream_current_security_token, nullptr) \ 40513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(ExternalReferenceTable*, external_reference_table, nullptr) \ 40613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(intptr_t*, api_external_references, nullptr) \ 407c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(AddressToIndexHashMap*, external_reference_map, nullptr) \ 408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V(HeapObjectToIndexHashMap*, root_index_map, nullptr) \ 40913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(int, pending_microtask_count, 0) \ 41013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HStatistics*, hstatistics, nullptr) \ 41113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CompilationStatistics*, turbo_statistics, nullptr) \ 41213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(HTracer*, htracer, nullptr) \ 41313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(CodeTracer*, code_tracer, nullptr) \ 41413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(uint32_t, per_isolate_assert_data, 0xFFFFFFFFu) \ 41513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(PromiseRejectCallback, promise_reject_callback, nullptr) \ 41613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(const v8::StartupData*, snapshot_blob, nullptr) \ 41713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(int, code_and_metadata_size, 0) \ 41813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(int, bytecode_and_metadata_size, 0) \ 41913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch /* true if being profiled. Causes collection of extra compile info. */ \ 42013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(bool, is_profiling, false) \ 421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch /* true if a trace is being formatted through Error.prepareStackTrace. */ \ 422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch V(bool, formatting_stack_trace, false) \ 42362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch /* Perform side effect checks on function call and API callbacks. */ \ 42462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V(bool, needs_side_effect_check, false) \ 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ISOLATE_INIT_SIMULATOR_LIST(V) 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define THREAD_LOCAL_TOP_ACCESSOR(type, name) \ 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline void set_##name(type v) { thread_local_top_.name##_ = v; } \ 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline type name() const { return thread_local_top_.name##_; } 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define THREAD_LOCAL_TOP_ADDRESS(type, name) \ 432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch type* name##_address() { return &thread_local_top_.name##_; } 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Isolate { 43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These forward declarations are required to make the friend declarations in 43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // PerIsolateThreadData work on some older versions of gcc. 43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable; 43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem; 44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~Isolate(); 44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A thread has a PerIsolateThreadData instance for each isolate that it has 44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // entered. That instance is allocated when the isolate is initially entered 44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // and reused on subsequent entries. 44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block class PerIsolateThreadData { 44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData(Isolate* isolate, ThreadId thread_id) 44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block : isolate_(isolate), 45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_id_(thread_id), 45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_limit_(0), 45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_state_(NULL), 453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block simulator_(NULL), 45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block next_(NULL), 45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block prev_(NULL) { } 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~PerIsolateThreadData(); 45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate() const { return isolate_; } 46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id() const { return thread_id_; } 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(uintptr_t, stack_limit) 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(ThreadState*, thread_state) 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIELD_ACCESSOR(Simulator*, simulator) 46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 46844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Matches(Isolate* isolate, ThreadId thread_id) const { 4708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return isolate_ == isolate && thread_id_.Equals(thread_id); 47144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 47244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 47444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 47544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadId thread_id_; 47644f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t stack_limit_; 47744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadState* thread_state_; 47844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 48044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Simulator* simulator_; 48144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 48244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 48344f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* next_; 48444f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* prev_; 48544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 48644f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class Isolate; 48744f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ThreadDataTable; 48844f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class EntryStackItem; 48944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 49044f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(PerIsolateThreadData); 49144f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 49244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 49444f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum AddressId { 495589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define DECLARE_ENUM(CamelName, hacker_name) k##CamelName##Address, 496589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch FOR_EACH_ISOLATE_ADDRESS_NAME(DECLARE_ENUM) 497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef DECLARE_ENUM 498589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kIsolateAddressCount 49944f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 50044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void InitializeOncePerProcess(); 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 50344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the PerIsolateThreadData for the current thread (or NULL if one is 50444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not currently set). 50544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static PerIsolateThreadData* CurrentPerIsolateThreadData() { 50644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return reinterpret_cast<PerIsolateThreadData*>( 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetThreadLocal(per_isolate_thread_data_key_)); 50844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 50944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 51044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the isolate inside which the current thread is running. 51144f0eee88ff00398ff7f715fab053374d808c90dSteve Block INLINE(static Isolate* Current()) { 512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1); 51344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = reinterpret_cast<Isolate*>( 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::GetExistingThreadLocal(isolate_key_)); 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate != NULL); 51644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return isolate; 51744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 51844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 51969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Usually called by Init(), but can be called early e.g. to allow 52069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // testing components that require logging but not the whole 52169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // isolate. 52269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // 52369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Safe to call more than once. 52469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void InitializeLoggingAndCounters(); 52569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 52644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool Init(Deserializer* des); 52744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 52844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // True if at least one thread Enter'ed this isolate. 52944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsInUse() { return entry_stack_ != NULL; } 53044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Destroys the non-default isolates. 53244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Sets default isolate into "has_been_disposed" state rather then destroying, 53344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for legacy API reasons. 53444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void TearDown(); 53544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 53662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void ReleaseManagedObjects(); 53762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void GlobalTearDown(); 53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ClearSerializerData(); 541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Find the PerThread for this particular (isolate, thread) combination 543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // If one does not yet exist, return null. 544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PerIsolateThreadData* FindPerThreadDataForThisThread(); 545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the PerThread for given (isolate, thread) combination 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If one does not yet exist, return null. 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PerIsolateThreadData* FindPerThreadDataForThread(ThreadId thread_id); 54944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Discard the PerThread for this particular (isolate, thread) combination 551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If one does not yet exist, no-op. 552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void DiscardPerThreadDataForThisThread(); 553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store the pointer to the current isolate. 55544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Used internally for V8 threads that do not execute JavaScript but still 55644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // are part of the domain of an isolate (like the context switcher). 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey isolate_key() { 55885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return isolate_key_; 55985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch } 56044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 56144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the key used to store process-wide thread IDs. 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey thread_id_key() { 56385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch return thread_id_key_; 56485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch } 56544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey per_isolate_thread_data_key(); 56744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 56844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Mutex for serializing access to break control structures. 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RecursiveMutex* break_access() { return &break_access_; } 57069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 57144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address get_address_from_id(AddressId id); 57244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 57344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to top context (where the current function object was created). 57444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context* context() { return thread_local_top_.context_; } 575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_context(Context* context); 57644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Context** context_address() { return &thread_local_top_.context_; } 57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(SaveContext*, save_context) 57944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 58044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Access to current thread id. 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(ThreadId, thread_id) 58244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 58344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Interface to pending exception. 584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* pending_exception(); 585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void set_pending_exception(Object* exception_obj); 586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_pending_exception(); 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Object*, pending_exception) 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_pending_exception(); 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Context*, pending_handler_context) 593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Code*, pending_handler_code) 594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(intptr_t, pending_handler_offset) 595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_fp) 596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Address, pending_handler_sp) 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(bool, external_caught_exception) 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 60044f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::TryCatch* try_catch_handler() { 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return thread_local_top_.try_catch_handler(); 60244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 60344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool* external_caught_exception_address() { 60444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.external_caught_exception_; 60544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THREAD_LOCAL_TOP_ADDRESS(Object*, scheduled_exception) 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_pending_message(); 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address pending_message_obj_address() { 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<Address>(&thread_local_top_.pending_message_obj_); 6128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Object* scheduled_exception(); 615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool has_scheduled_exception(); 616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline void clear_scheduled_exception(); 61744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 618014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsJavaScriptHandlerOnTop(Object* exception); 619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsExternalHandlerOnTop(Object* exception); 62044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_catchable_by_javascript(Object* exception); 622f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline bool is_catchable_by_wasm(Object* exception); 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JS execution stack (see frames.h). 62544f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address c_entry_fp(ThreadLocalTop* thread) { 62644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return thread->c_entry_fp_; 62744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 62844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static Address handler(ThreadLocalTop* thread) { return thread->handler_; } 629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Address c_function() { return thread_local_top_.c_function_; } 63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* c_entry_fp_address() { 63244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.c_entry_fp_; 63344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 63444f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* handler_address() { return &thread_local_top_.handler_; } 635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Address* c_function_address() { 636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return &thread_local_top_.c_function_; 637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 63844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bottom JS entry. 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address js_entry_sp() { 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return thread_local_top_.js_entry_sp_; 64244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 64344f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline Address* js_entry_sp_address() { 64444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &thread_local_top_.js_entry_sp_; 64544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 64644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 64744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global object of the current context. It could be 6483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a builtin object, or a JS global object. 649014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Handle<JSGlobalObject> global_object(); 65044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 65144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns the global proxy object of the current context. 652bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inline Handle<JSObject> global_proxy(); 65344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 65444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static int ArchiveSpacePerThread() { return sizeof(ThreadLocalTop); } 65544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FreeThreadResources() { thread_local_top_.Free(); } 65644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 65744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This method is called by the api after operations that may throw 65844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // exceptions. If an exception was thrown and not handled by an external 65944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // handler the exception is scheduled to be rethrown when we return to running 66044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // JavaScript code. If an exception is scheduled true is returned. 66144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool OptionalRescheduleException(bool is_bottom_call); 66244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Push and pop a promise and the current try-catch handler. 664f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void PushPromise(Handle<JSObject> promise); 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PopPromise(); 666f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 667f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Return the relevant Promise that a throw/rejection pertains to, based 668f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // on the contents of the Promise stack 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> GetPromiseOnStackOnThrow(); 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 671f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Heuristically guess whether a Promise is handled by user catch handler 672f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool PromiseHasUserDefinedRejectHandler(Handle<Object> promise); 673f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 6748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch class ExceptionScope { 6758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Scope currently can only be used for regular exceptions, 677014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // not termination exception. 678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline explicit ExceptionScope(Isolate* isolate); 679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline ~ExceptionScope(); 6808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 6818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 6828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate* isolate_; 6838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> pending_exception_; 6848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch }; 6858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 68644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetCaptureStackTraceForUncaughtExceptions( 68744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture, 68844f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 68944f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 69044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void SetAbortOnUncaughtExceptionCallback( 692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback callback); 693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch enum PrintStackMode { kPrintStackConcise, kPrintStackVerbose }; 69544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void PrintCurrentStackTrace(FILE* out); 696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintStack(StringStream* accumulator, 697014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintStackMode mode = kPrintStackVerbose); 698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintStack(FILE* out, PrintStackMode mode = kPrintStackVerbose); 69944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> StackTraceString(); 700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NO_INLINE(void PushStackTraceAndDie(unsigned int magic, void* ptr1, 701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void* ptr2, unsigned int magic2)); 70244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<JSArray> CaptureCurrentStackTrace( 70344f0eee88ff00398ff7f715fab053374d808c90dSteve Block int frame_limit, 70444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions options); 7053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> CaptureSimpleStackTrace(Handle<JSReceiver> error_object, 706f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FrameSkipMode mode, 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> caller); 7083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MaybeHandle<JSReceiver> CaptureAndSetDetailedStackTrace( 7093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> error_object); 7103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MaybeHandle<JSReceiver> CaptureAndSetSimpleStackTrace( 711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSReceiver> error_object, FrameSkipMode mode, 712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> caller); 713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> GetDetailedStackTrace(Handle<JSObject> error_object); 7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns if the given context may access the given global object. If 71644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the result is false, the pending exception is guaranteed to be 71744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // set. 718014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool MayAccess(Handle<Context> accessing_context, Handle<JSObject> receiver); 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 72044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetFailedAccessCheckCallback(v8::FailedAccessCheckCallback callback); 721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void ReportFailedAccessCheck(Handle<JSObject> receiver); 72244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 72344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exception throwing support. The caller should use the result 724c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // of Throw() as its return value. 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* Throw(Object* exception, MessageLocation* location = NULL); 726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* ThrowIllegalOperation(); 727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <typename T> 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MUST_USE_RESULT MaybeHandle<T> Throw(Handle<Object> exception, 730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MessageLocation* location = NULL) { 731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Throw(*exception, location); 732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MaybeHandle<T>(); 733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Re-throw an exception. This involves no error reporting since error 736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // reporting was handled when the exception was thrown originally. 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* ReThrow(Object* exception); 738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find the correct handler for the current pending exception. This also 740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // clears and returns the current pending exception. 741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* UnwindAndFindHandler(); 742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Tries to predict whether an exception will be caught. Note that this can 744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // only produce an estimate, because it is undecidable whether a finally 745f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // clause will consume or re-throw an exception. 746f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch enum CatchType { 747f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch NOT_CAUGHT, 748f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CAUGHT_BY_JAVASCRIPT, 749f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CAUGHT_BY_EXTERNAL, 750f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CAUGHT_BY_DESUGARING, 751f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CAUGHT_BY_PROMISE, 752f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch CAUGHT_BY_ASYNC_AWAIT 753f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch }; 754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CatchType PredictExceptionCatcher(); 755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 75644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ScheduleThrow(Object* exception); 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Re-set pending message, script and positions reported to the TryCatch 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // back to the TLS for re-use when rethrowing. 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RestorePendingMessageFromTryCatch(v8::TryCatch* handler); 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Un-schedule an exception that was caught by a TryCatch handler. 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler); 76244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ReportPendingMessages(); 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return pending location if any or unfilled structure. 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MessageLocation GetMessageLocation(); 76544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Promote a scheduled exception to pending. Asserts has_scheduled_exception. 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* PromoteScheduledException(); 76844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 76944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Attempts to compute the current source location, storing the 77062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // result in the target out parameter. The source location is attached to a 77162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Message object as the location which should be shown to the user. It's 77262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // typically the top-most meaningful location on the stack. 773014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ComputeLocation(MessageLocation* target); 774014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ComputeLocationFromException(MessageLocation* target, 775014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> exception); 776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool ComputeLocationFromStackTrace(MessageLocation* target, 777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> exception); 778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSMessageObject> CreateMessage(Handle<Object> exception, 780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MessageLocation* location); 78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Out of resource exception helpers. 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* StackOverflow(); 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* TerminateExecution(); 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CancelTerminateExecution(); 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void RequestInterrupt(InterruptCallback callback, void* data); 788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void InvokeApiInterruptCallbacks(); 78944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 79044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Administration 79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v); 79244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Iterate(ObjectVisitor* v, ThreadLocalTop* t); 79344f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* Iterate(ObjectVisitor* v, char* t); 79444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IterateThread(ThreadVisitor* v, char* t); 79544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Returns the current native context. 797f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Handle<Context> native_context(); 798f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline Context* raw_native_context(); 79944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns the native context of the calling JavaScript code. That 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is, the native context of the top-most JavaScript frame. 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> GetCallingNativeContext(); 80344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 80444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void RegisterTryCatchHandler(v8::TryCatch* that); 80544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UnregisterTryCatchHandler(v8::TryCatch* that); 80644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 80744f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* ArchiveThread(char* to); 80844f0eee88ff00398ff7f715fab053374d808c90dSteve Block char* RestoreThread(char* from); 80944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 81044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kUC16AlphabetSize = 256; // See StringSearchBase. 81144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kBMMaxShift = 250; // See StringSearchBase. 81244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 81344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Accessors. 81444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ACCESSOR(type, name, initialvalue) \ 81544f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type name() const { \ 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 81744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return name##_; \ 81844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } \ 81944f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline void set_##name(type value) { \ 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 82144f0eee88ff00398ff7f715fab053374d808c90dSteve Block name##_ = value; \ 82244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 82344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_ACCESSOR) 82444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ACCESSOR 82544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 82644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_ACCESSOR(type, name, length) \ 82744f0eee88ff00398ff7f715fab053374d808c90dSteve Block inline type* name() { \ 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(OFFSET_OF(Isolate, name##_) == name##_debug_offset_); \ 82944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &(name##_)[0]; \ 83044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 83144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_ACCESSOR) 83244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_ACCESSOR 83344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define NATIVE_CONTEXT_FIELD_ACCESSOR(index, type, name) \ 835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline Handle<type> name(); \ 836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inline bool is_##name(type* value); 837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSOR) 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef NATIVE_CONTEXT_FIELD_ACCESSOR 83944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper() { return bootstrapper_; } 84169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Counters* counters() { 84269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Call InitializeLoggingAndCounters() if logging is needed before 84369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the isolate is fully initialized. 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(counters_ != NULL); 84569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return counters_; 84669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 84744f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler() { return runtime_profiler_; } 84844f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache() { return compilation_cache_; } 84969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Logger* logger() { 85069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Call InitializeLoggingAndCounters() if logging is needed before 85169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // the isolate is fully initialized. 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(logger_ != NULL); 85369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return logger_; 85469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 85544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard() { return &stack_guard_; } 85644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Heap* heap() { return &heap_; } 85769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch StatsTable* stats_table(); 858f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StubCache* load_stub_cache() { return load_stub_cache_; } 859f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StubCache* store_stub_cache() { return store_stub_cache_; } 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeAgingHelper* code_aging_helper() { return code_aging_helper_; } 86144f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data() { return deoptimizer_data_; } 862109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool deoptimizer_lazy_throw() const { return deoptimizer_lazy_throw_; } 863109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void set_deoptimizer_lazy_throw(bool value) { 864109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch deoptimizer_lazy_throw_ = value; 865109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 86644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* thread_local_top() { return &thread_local_top_; } 867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaterializedObjectStore* materialized_object_store() { 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return materialized_object_store_; 86944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache() { 87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return context_slot_cache_; 87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache() { 87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return descriptor_lookup_cache_; 87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData* handle_scope_data() { return &handle_scope_data_; } 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 88144f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer() { 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handle_scope_implementer_); 88344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return handle_scope_implementer_; 88444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 88544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch UnicodeCache* unicode_cache() { 8878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return unicode_cache_; 88844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 88944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InnerPointerToCodeCache* inner_pointer_to_code_cache() { 8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return inner_pointer_to_code_cache_; 8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles() { return global_handles_; } 89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EternalHandles* eternal_handles() { return eternal_handles_; } 89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadManager* thread_manager() { return thread_manager_; } 89944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize>* jsregexp_uncanonicalize() { 90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_uncanonicalize_; 90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange>* jsregexp_canonrange() { 90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &jsregexp_canonrange_; 90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState* runtime_state() { return &runtime_state_; } 90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins* builtins() { return &builtins_; } 91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize() { 91444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return ®exp_macro_assembler_canonicalize_; 91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 91644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91744f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack() { return regexp_stack_; } 91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t total_regexp_code_generated() { return total_regexp_code_generated_; } 92062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void IncreaseTotalRegexpCodeGenerated(int size) { 92162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch total_regexp_code_generated_ += size; 92262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 92362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch List<int>* regexp_indices() { return ®exp_indices_; } 925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 92644f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize>* 92744f0eee88ff00398ff7f715fab053374d808c90dSteve Block interp_canonicalize_mapping() { 928109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch return ®exp_macro_assembler_canonicalize_; 92944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 93044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Debug* debug() { return debug_; } 93244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 93313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool* is_profiling_address() { return &is_profiling_; } 93413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch CodeEventDispatcher* code_event_dispatcher() const { 93513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return code_event_dispatcher_.get(); 93613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* heap_profiler() const { return heap_profiler_; } 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo* heap_histograms() { return heap_histograms_; } 94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation* js_spill_information() { 94344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return &js_spill_information_; 94444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 94544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 94644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Factory* factory() { return reinterpret_cast<Factory*>(this); } 94844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kJSRegexpStaticOffsetsVectorSize = 128; 95044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(ExternalCallbackScope*, external_callback_scope) 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THREAD_LOCAL_TOP_ACCESSOR(StateTag, current_vm_state) 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetData(uint32_t slot, void* data) { 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot < Internals::kNumIsolateDataSlots); 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch embedder_data_[slot] = data; 95844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* GetData(uint32_t slot) { 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(slot < Internals::kNumIsolateDataSlots); 961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return embedder_data_[slot]; 96244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 96344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool serializer_enabled() const { return serializer_enabled_; } 965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool snapshot_available() const { 966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return snapshot_blob_ != NULL && snapshot_blob_->raw_size != 0; 967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 96844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDead() { return has_fatal_error_; } 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SignalFatalError() { has_fatal_error_ = true; } 97144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 97262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool use_crankshaft(); 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool initialized_from_snapshot() { return initialized_from_snapshot_; } 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 97662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool NeedsSourcePositionsForProfiling() const; 97762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 97862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsCodeCoverageEnabled(); 97962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetCodeCoverageList(Object* value); 98062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double time_millis_since_init() { 982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return heap_.MonotonicallyIncreasingTimeInMs() - time_millis_at_init_; 98344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 98444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DateCache* date_cache() { 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return date_cache_; 98744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 98844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_date_cache(DateCache* date_cache) { 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (date_cache != date_cache_) { 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete date_cache_; 99244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch date_cache_ = date_cache; 99444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 99544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Map* get_initial_js_array_map(ElementsKind kind); 997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 998c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kProtectorValid = 1; 999c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kProtectorInvalid = 0; 1000257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFastArrayConstructorPrototypeChainIntact(); 10023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch inline bool IsArraySpeciesLookupChainIntact(); 1003bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsIsConcatSpreadableLookupChainIntact(); 1004f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsIsConcatSpreadableLookupChainIntact(JSReceiver* receiver); 1005f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch inline bool IsStringLengthOverflowIntact(); 1006c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsArrayIteratorLookupChainIntact(); 1007c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1008c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Avoid deopt loops if fast Array Iterators migrate to slow Array Iterators. 1009c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch inline bool IsFastArrayIterationIntact(); 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 101162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Make sure we do check for neutered array buffers. 101262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch inline bool IsArrayBufferNeuteringIntact(); 101362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1014014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // On intent to set an element in object, make sure that appropriate 1015014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // notifications occur if the set is on the elements of the array or 1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // object prototype. Also ensure that changes to prototype chain between 1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Array and Object fire notifications. 1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetElement(Handle<JSObject> object); 1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetLength(Handle<JSObject> object) { 1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnSetPrototype(Handle<JSObject> object) { 1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void UpdateArrayProtectorOnNormalizeElements(Handle<JSObject> object) { 1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UpdateArrayProtectorOnSetElement(object); 1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1028109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void InvalidateArraySpeciesProtector(); 1029bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch void InvalidateIsConcatSpreadableProtector(); 1030f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void InvalidateStringLengthOverflowProtector(); 1031c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void InvalidateArrayIteratorProtector(); 103262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void InvalidateArrayBufferNeuteringProtector(); 1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Returns true if array is the initial array prototype in any native context. 1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsAnyInitialArrayPrototype(Handle<JSArray> array); 1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 103762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch V8_EXPORT_PRIVATE CallInterfaceDescriptorData* call_descriptor_data( 103862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int index); 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1040c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch AccessCompilerData* access_compiler_data() { return access_compiler_data_; } 1041c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void IterateDeferredHandles(ObjectVisitor* visitor); 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void LinkDeferredHandles(DeferredHandles* deferred_handles); 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UnlinkDeferredHandles(DeferredHandles* deferred_handles); 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDeferredHandle(Object** location); 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // DEBUG 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool concurrent_recompilation_enabled() { 1051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Thread is only available with flag enabled. 1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(optimizing_compile_dispatcher_ == NULL || 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FLAG_concurrent_recompilation); 1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_ != NULL; 10553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizingCompileDispatcher* optimizing_compile_dispatcher() { 1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return optimizing_compile_dispatcher_; 10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id() const { return static_cast<int>(id_); } 1062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStatistics* GetHStatistics(); 1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CompilationStatistics* GetTurboStatistics(); 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTracer* GetHTracer(); 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeTracer* GetCodeTracer(); 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DumpAndResetCompilationStats(); 1069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook function_entry_hook() { return function_entry_hook_; } 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_function_entry_hook(FunctionEntryHook function_entry_hook) { 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function_entry_hook_ = function_entry_hook; 10733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* stress_deopt_count_address() { return &stress_deopt_count_; } 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1077c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE base::RandomNumberGenerator* random_number_generator(); 1078c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1079c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Generates a random number that is non-zero when masked 1080c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // with the provided mask. 1081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int GenerateIdentityHash(uint32_t mask); 1082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Given an address occupied by a live code object, return that object. 108462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Code* FindCodeObject(Address a); 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int NextOptimizationId() { 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int id = next_optimization_id_++; 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!Smi::IsValid(next_optimization_id_)) { 1089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_optimization_id_ = 0; 10903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return id; 10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 10933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCallCompletedCallback(CallCompletedCallback callback); 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RemoveCallCompletedCallback(CallCompletedCallback callback); 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void FireCallCompletedCallback(); 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1098109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 1099109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch void RemoveBeforeCallEnteredCallback(BeforeCallEnteredCallback callback); 1100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch inline void FireBeforeCallEnteredCallback(); 1101109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 11023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void AddMicrotasksCompletedCallback(MicrotasksCompletedCallback callback); 11033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void RemoveMicrotasksCompletedCallback(MicrotasksCompletedCallback callback); 11043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void FireMicrotasksCompletedCallback(); 11053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void SetPromiseRejectCallback(PromiseRejectCallback callback); 1107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void ReportPromiseReject(Handle<JSObject> promise, Handle<Object> value, 1108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::PromiseRejectEvent event); 1109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void PromiseReactionJob(Handle<PromiseReactionJobInfo> info, 1111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MaybeHandle<Object>* result, 1112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MaybeHandle<Object>* maybe_exception); 1113c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void PromiseResolveThenableJob(Handle<PromiseResolveThenableJobInfo> info, 1114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MaybeHandle<Object>* result, 1115f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MaybeHandle<Object>* maybe_exception); 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void EnqueueMicrotask(Handle<Object> microtask); 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RunMicrotasks(); 1118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsRunningMicrotasks() const { return is_running_microtasks_; } 111962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 112062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Symbol> SymbolFor(Heap::RootListIndex dictionary_index, 112162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> name, bool private_symbol); 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetUseCounterCallback(v8::Isolate::UseCounterCallback callback); 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CountUsage(v8::Isolate::UseCounterFeature feature); 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* GetOrCreateBasicBlockProfiler(); 1127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* basic_block_profiler() { return basic_block_profiler_; } 1128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::string GetTurboCfgFileName(); 1130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 1132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int GetNextUniqueSharedFunctionInfoId() { return next_unique_sfi_id_++; } 1133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 113562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Address promise_hook_or_debug_is_active_address() { 113662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return reinterpret_cast<Address>(&promise_hook_or_debug_is_active_); 113762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 113862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 113962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void DebugStateUpdated(); 114062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 114162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void SetPromiseHook(PromiseHook hook); 114262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise, 114362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> parent); 114462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 11453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Support for dynamically disabling tail call elimination. 11463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Address is_tail_call_elimination_enabled_address() { 11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return reinterpret_cast<Address>(&is_tail_call_elimination_enabled_); 11483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 11493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool is_tail_call_elimination_enabled() const { 11503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return is_tail_call_elimination_enabled_; 11513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 11523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void SetTailCallEliminationEnabled(bool enabled); 1153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void AddDetachedContext(Handle<Context> context); 1155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CheckDetachedContextsAfterGC(); 1156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Object*>* partial_snapshot_cache() { return &partial_snapshot_cache_; } 1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void set_array_buffer_allocator(v8::ArrayBuffer::Allocator* allocator) { 1160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch array_buffer_allocator_ = allocator; 1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::ArrayBuffer::Allocator* array_buffer_allocator() const { 1163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return array_buffer_allocator_; 1164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FutexWaitListNode* futex_wait_list_node() { return &futex_wait_list_node_; } 1167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CancelableTaskManager* cancelable_task_manager() { 1169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cancelable_task_manager_; 1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 117262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const AstStringConstants* ast_string_constants() const { 117362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return ast_string_constants_; 117462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 117562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Interpreter* interpreter() const { return interpreter_; } 1177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1178f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AccountingAllocator* allocator() { return allocator_; } 11793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 118062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CompilerDispatcher* compiler_dispatcher() const { 118162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return compiler_dispatcher_; 1182c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 1183c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 118462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Clear all optimized code stored in native contexts. 118562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void ClearOSROptimizedCode(); 118662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 118762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Ensure that a particular optimized code is evicted. 118862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void EvictOSROptimizedCode(Code* code, const char* reason); 118962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1190bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsInAnyContext(Object* object, uint32_t index); 1191bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 119213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch void SetRAILMode(RAILMode rail_mode); 119313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 119462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch RAILMode rail_mode() { return rail_mode_.Value(); } 119562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 119662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch double LoadStartTimeMs(); 119762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void IsolateInForegroundNotification(); 1199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch void IsolateInBackgroundNotification(); 1201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsIsolateInBackground() { return is_isolate_in_background_; } 1203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1204f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PRINTF_FORMAT(2, 3) void PrintWithTimestamp(const char* format, ...); 1205f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifdef USE_SIMULATOR 1207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch base::Mutex* simulator_i_cache_mutex() { return &simulator_i_cache_mutex_; } 1208f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif 1209f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 121062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void set_allow_atomics_wait(bool set) { allow_atomics_wait_ = set; } 121162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool allow_atomics_wait() { return allow_atomics_wait_; } 121262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 121362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // List of native heap values allocated by the runtime as part of its 121462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // implementation that must be freed at isolate deinit. 121562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch class ManagedObjectFinalizer final { 121662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch public: 121762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch typedef void (*Deleter)(void*); 121862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void Dispose() { deleter_(value_); } 121962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 122062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private: 122162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch friend class Isolate; 122262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 122362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ManagedObjectFinalizer() { 122462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_EQ(reinterpret_cast<void*>(this), 122562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch reinterpret_cast<void*>(&value_)); 122662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 122762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 122862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // value_ must be the first member 122962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* value_ = nullptr; 123062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Deleter deleter_ = nullptr; 123162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ManagedObjectFinalizer* prev_ = nullptr; 123262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ManagedObjectFinalizer* next_ = nullptr; 123362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch }; 123462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 123562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Register a native value for destruction at isolate teardown. 123662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ManagedObjectFinalizer* RegisterForReleaseAtTeardown( 123762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* value, ManagedObjectFinalizer::Deleter deleter); 123862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 123962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Unregister a previously registered value from release at 124062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // isolate teardown, deleting the ManagedObjectFinalizer. 124162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // This transfers the responsibility of the previously managed value's 124262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // deletion to the caller. Pass by pointer, because *finalizer_ptr gets 124362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // reset to nullptr. 124462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void UnregisterFromReleaseAtTeardown(ManagedObjectFinalizer** finalizer_ptr); 124562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch protected: 1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit Isolate(bool enable_serializer); 1248bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool IsArrayOrObjectPrototype(Object* object); 124944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch friend struct GlobalState; 12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch friend struct InitializeGlobalState; 12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // These fields are accessed through the API, offsets must be kept in sync 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // with v8::internal::Internals (in include/v8.h) constants. This is also 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // verified in Isolate::Init() using runtime checks. 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void* embedder_data_[Internals::kNumIsolateDataSlots]; 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap heap_; 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // The per-process lock should be acquired before the ThreadDataTable is 126144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // modified. 126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block class ThreadDataTable { 126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadDataTable(); 126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ThreadDataTable(); 126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 126744f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* Lookup(Isolate* isolate, ThreadId thread_id); 126844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Insert(PerIsolateThreadData* data); 126944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Remove(PerIsolateThreadData* data); 12703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void RemoveAllThreads(Isolate* isolate); 127144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* list_; 127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // These items form a stack synchronously with threads Enter'ing and Exit'ing 127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the Isolate. The top of the stack points to a thread which is currently 127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // running the Isolate. When the stack is empty, the Isolate is considered 127944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // not entered by any thread and can be Disposed. 1280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // If the same thread enters the Isolate more than once, the entry_count_ 128144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // is incremented rather then a new item pushed to the stack. 128244f0eee88ff00398ff7f715fab053374d808c90dSteve Block class EntryStackItem { 128344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 128444f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem(PerIsolateThreadData* previous_thread_data, 128544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate, 128644f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item) 128744f0eee88ff00398ff7f715fab053374d808c90dSteve Block : entry_count(1), 128844f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_thread_data(previous_thread_data), 128944f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_isolate(previous_isolate), 129044f0eee88ff00398ff7f715fab053374d808c90dSteve Block previous_item(previous_item) { } 129144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 129244f0eee88ff00398ff7f715fab053374d808c90dSteve Block int entry_count; 129344f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* previous_thread_data; 129444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate; 129544f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* previous_item; 129644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(EntryStackItem); 129944f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 130044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::LazyMutex thread_data_table_mutex_; 130285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey per_isolate_thread_data_key_; 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey isolate_key_; 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Thread::LocalStorageKey thread_id_key_; 130685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch static ThreadDataTable* thread_data_table_; 130785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A global counter for all generated Isolates, might overflow. 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static base::Atomic32 isolate_counter_; 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG 1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static base::Atomic32 isolate_key_created_; 1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Deinit(); 131644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 131744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void SetIsolateThreadLocals(Isolate* isolate, 131844f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* data); 131944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 132044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Find the PerThread for this particular (isolate, thread) combination. 132144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If one does not yet exist, allocate a new one. 132244f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* FindOrAllocatePerThreadDataForThisThread(); 132344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 132444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initializes the current thread to run this Isolate. 132544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 132644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 132744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Enter(); 132844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 132944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Exits the current thread. The previosuly entered Isolate is restored 133044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // for the thread. 133144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Not thread-safe. Multiple threads should not Enter/Exit the same isolate 133244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // at the same time, this should be prevented using external locking. 133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void Exit(); 133444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 133544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void InitializeThreadLocal(); 133644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 133744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactPrologue(bool is_compacting, 133844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 133944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MarkCompactEpilogue(bool is_compacting, 134044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop* archived_thread_data); 134144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 134244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void FillCache(); 134344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Propagate pending exception message to the v8::TryCatch. 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If there is no external try-catch or message was successfully propagated, 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // then return true. 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool PropagatePendingExceptionToExternalTryCatch(); 134869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Remove per-frame stored materialized objects when we are unwinding 1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the frame. 1351014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void RemoveMaterializedObjectsOnUnwind(StackFrame* frame); 13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void RunMicrotasksInternal(); 13543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 135513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const char* RAILModeName(RAILMode rail_mode) const { 135613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch switch (rail_mode) { 135713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case PERFORMANCE_RESPONSE: 135813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return "RESPONSE"; 135913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case PERFORMANCE_ANIMATION: 136013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return "ANIMATION"; 136113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case PERFORMANCE_IDLE: 136213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return "IDLE"; 136313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case PERFORMANCE_LOAD: 136413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return "LOAD"; 136513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 136613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ""; 136713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 136813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // TODO(alph): Remove along with the deprecated GetCpuProfiler(). 1370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch friend v8::CpuProfiler* v8::Isolate::GetCpuProfiler(); 1371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CpuProfiler* cpu_profiler() const { return cpu_profiler_; } 1372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Atomic32 id_; 1374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EntryStackItem* entry_stack_; 137544f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_nesting_level_; 137644f0eee88ff00398ff7f715fab053374d808c90dSteve Block StringStream* incomplete_message_; 1377589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Address isolate_addresses_[kIsolateAddressCount + 1]; // NOLINT 137844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Bootstrapper* bootstrapper_; 137944f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeProfiler* runtime_profiler_; 138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block CompilationCache* compilation_cache_; 138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Counters* counters_; 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RecursiveMutex break_access_; 138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger* logger_; 138444f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard stack_guard_; 138544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StatsTable* stats_table_; 1386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StubCache* load_stub_cache_; 1387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StubCache* store_stub_cache_; 1388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeAgingHelper* code_aging_helper_; 138944f0eee88ff00398ff7f715fab053374d808c90dSteve Block DeoptimizerData* deoptimizer_data_; 1390109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch bool deoptimizer_lazy_throw_; 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaterializedObjectStore* materialized_object_store_; 139244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadLocalTop thread_local_top_; 139344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool capture_stack_trace_for_uncaught_exceptions_; 139444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int stack_trace_for_uncaught_exceptions_frame_limit_; 139544f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackTrace::StackTraceOptions stack_trace_for_uncaught_exceptions_options_; 139644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ContextSlotCache* context_slot_cache_; 139744f0eee88ff00398ff7f715fab053374d808c90dSteve Block DescriptorLookupCache* descriptor_lookup_cache_; 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScopeData handle_scope_data_; 139944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HandleScopeImplementer* handle_scope_implementer_; 14008b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch UnicodeCache* unicode_cache_; 1401f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AccountingAllocator* allocator_; 14023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InnerPointerToCodeCache* inner_pointer_to_code_cache_; 140344f0eee88ff00398ff7f715fab053374d808c90dSteve Block GlobalHandles* global_handles_; 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EternalHandles* eternal_handles_; 140544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ThreadManager* thread_manager_; 140644f0eee88ff00398ff7f715fab053374d808c90dSteve Block RuntimeState runtime_state_; 140744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Builtins builtins_; 140844f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262UnCanonicalize> jsregexp_uncanonicalize_; 140944f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::CanonicalizationRange> jsregexp_canonrange_; 141044f0eee88ff00398ff7f715fab053374d808c90dSteve Block unibrow::Mapping<unibrow::Ecma262Canonicalize> 141144f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_macro_assembler_canonicalize_; 141244f0eee88ff00398ff7f715fab053374d808c90dSteve Block RegExpStack* regexp_stack_; 1413c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch List<int> regexp_indices_; 14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DateCache* date_cache_; 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptorData* call_descriptor_data_; 1416c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch AccessCompilerData* access_compiler_data_; 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::RandomNumberGenerator* random_number_generator_; 1418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch base::AtomicValue<RAILMode> rail_mode_; 141962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool promise_hook_or_debug_is_active_; 142062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PromiseHook promise_hook_; 142162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch base::Mutex rail_mutex_; 142262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch double load_start_time_ms_; 142344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Whether the isolate has been created for snapshotting. 1425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool serializer_enabled_; 1426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if fatal error has been signaled for this isolate. 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_fatal_error_; 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if this isolate was initialized from a snapshot. 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool initialized_from_snapshot_; 14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // True if ES2015 tail call elimination feature is enabled. 14343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool is_tail_call_elimination_enabled_; 14353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1436f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // True if the isolate is in background. This flag is used 1437f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // to prioritize between memory usage and latency. 1438f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool is_isolate_in_background_; 1439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Time stamp at initialization. 14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch double time_millis_at_init_; 14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 144344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 144444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // A static array of histogram info for each type. 144544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HistogramInfo heap_histograms_[LAST_TYPE + 1]; 144644f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject::SpillInformation js_spill_information_; 144744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 144844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 144944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Debug* debug_; 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CpuProfiler* cpu_profiler_; 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapProfiler* heap_profiler_; 145213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch std::unique_ptr<CodeEventDispatcher> code_event_dispatcher_; 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionEntryHook function_entry_hook_; 145444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 145562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const AstStringConstants* ast_string_constants_; 145662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter::Interpreter* interpreter_; 1458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 145962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CompilerDispatcher* compiler_dispatcher_; 1460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier typedef std::pair<InterruptCallback, void*> InterruptEntry; 1462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::queue<InterruptEntry> api_interrupts_queue_; 1463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 146444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_BACKING_STORE(type, name, initialvalue) \ 146544f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_; 146644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(GLOBAL_BACKING_STORE) 146744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_BACKING_STORE 146844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 146944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define GLOBAL_ARRAY_BACKING_STORE(type, name, length) \ 147044f0eee88ff00398ff7f715fab053374d808c90dSteve Block type name##_[length]; 147144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(GLOBAL_ARRAY_BACKING_STORE) 147244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef GLOBAL_ARRAY_BACKING_STORE 147344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 147444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 147544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This class is huge and has a number of fields controlled by 147644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // preprocessor defines. Make sure the offsets of these fields agree 147744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // between compilation units. 147844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 147944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const intptr_t name##_debug_offset_; 148044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 148144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 148244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET 148344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 148444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* deferred_handles_head_; 1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizingCompileDispatcher* optimizing_compile_dispatcher_; 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Counts deopt points if deopt_every_n_times is enabled. 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned int stress_deopt_count_; 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int next_optimization_id_; 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int next_unique_sfi_id_; 1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1497109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // List of callbacks before a Call starts execution. 1498109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch List<BeforeCallEnteredCallback> before_call_entered_callbacks_; 1499109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // List of callbacks when a Call completes. 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch List<CallCompletedCallback> call_completed_callbacks_; 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // List of callbacks after microtasks were run. 15043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch List<MicrotasksCompletedCallback> microtasks_completed_callbacks_; 1505bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool is_running_microtasks_; 15063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 1507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Isolate::UseCounterCallback use_counter_callback_; 1508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BasicBlockProfiler* basic_block_profiler_; 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch List<Object*> partial_snapshot_cache_; 1511014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::ArrayBuffer::Allocator* array_buffer_allocator_; 1513014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1514014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FutexWaitListNode futex_wait_list_node_; 1515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CancelableTaskManager* cancelable_task_manager_; 1517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback 1519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch abort_on_uncaught_exception_callback_; 1520014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1521f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifdef USE_SIMULATOR 1522f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch base::Mutex simulator_i_cache_mutex_; 1523f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif 1524f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 152562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool allow_atomics_wait_; 152662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 152762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ManagedObjectFinalizer managed_object_finalizers_list_; 152862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 152962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size_t total_regexp_code_generated_; 153062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 153144f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class ExecutionAccess; 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HandleScopeImplementer; 153362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch friend class HeapTester; 1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend class OptimizingCompileDispatcher; 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class SweeperThread; 1536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class ThreadManager; 1537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class Simulator; 1538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class StackGuard; 15398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch friend class ThreadId; 154044f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Isolate; 154144f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class v8::Locker; 1542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class v8::Unlocker; 154313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch friend class v8::SnapshotCreator; 1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch friend v8::StartupData v8::V8::CreateSnapshotDataBlob(const char*); 15453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch friend v8::StartupData v8::V8::WarmUpSnapshotDataBlob(v8::StartupData, 15463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch const char*); 154744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_COPY_AND_ASSIGN(Isolate); 154944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 155044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 155144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef FIELD_ACCESSOR 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef THREAD_LOCAL_TOP_ACCESSOR 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass PromiseOnStack { 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1558f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PromiseOnStack(Handle<JSObject> promise, PromiseOnStack* prev) 1559f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : promise_(promise), prev_(prev) {} 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> promise() { return promise_; } 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev() { return prev_; } 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> promise_; 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev_; 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 156944f0eee88ff00398ff7f715fab053374d808c90dSteve Block// If the GCC version is 4.1.x or 4.2.x an additional field is added to the 157044f0eee88ff00398ff7f715fab053374d808c90dSteve Block// class as a work around for a bug in the generated code found with these 157144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// versions of GCC. See V8 issue 122 for details. 157244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SaveContext BASE_EMBEDDED { 157344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1574f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch explicit SaveContext(Isolate* isolate); 1575f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ~SaveContext(); 157644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 157744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context() { return context_; } 157844f0eee88ff00398ff7f715fab053374d808c90dSteve Block SaveContext* prev() { return prev_; } 157944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 158044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns true if this save context is below a given JavaScript frame. 1581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsBelowFrame(StandardFrame* frame) { 15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (c_entry_fp_ == 0) || (c_entry_fp_ > frame->sp()); 158344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 158444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 158544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 1586f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* const isolate_; 158744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 1588f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SaveContext* const prev_; 15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Address c_entry_fp_; 159044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 159144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 159244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 159344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass AssertNoContextChange BASE_EMBEDDED { 159444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 159544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit AssertNoContextChange(Isolate* isolate); 159744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~AssertNoContextChange() { 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate_->context() == *context_); 159944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 160044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 160144f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate_; 160344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Context> context_; 160444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 160544f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit AssertNoContextChange(Isolate* isolate) { } 160744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 160844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 160944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 161044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 161144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass ExecutionAccess BASE_EMBEDDED { 161244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 161344f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit ExecutionAccess(Isolate* isolate) : isolate_(isolate) { 161444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Lock(isolate); 161544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 161644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~ExecutionAccess() { Unlock(isolate_); } 161744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Lock(Isolate* isolate) { isolate->break_access()->Lock(); } 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void Unlock(Isolate* isolate) { isolate->break_access()->Unlock(); } 162044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 162144f0eee88ff00398ff7f715fab053374d808c90dSteve Block static bool TryLock(Isolate* isolate) { 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return isolate->break_access()->TryLock(); 162344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 162444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 162544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 162644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 162744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 162844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 162944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for checking for stack-overflows. 163144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass StackLimitCheck BASE_EMBEDDED { 163244f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 163344f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit StackLimitCheck(Isolate* isolate) : isolate_(isolate) { } 163444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use this to check for stack-overflows in C++ code. 1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasOverflowed() const { 163744f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard = isolate_->stack_guard(); 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return GetCurrentStackPosition() < stack_guard->real_climit(); 163944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Use this to check for interrupt request in C++ code. 1642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool InterruptRequested() { 1643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackGuard* stack_guard = isolate_->stack_guard(); 1644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetCurrentStackPosition() < stack_guard->climit(); 1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use this to check for stack-overflow when entering runtime from JS code. 1648014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool JsHasOverflowed(uintptr_t gap = 0) const; 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 165044f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 165144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate_; 165244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 165344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 165462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define STACK_CHECK(isolate, result_value) \ 165562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch do { \ 165662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch StackLimitCheck stack_check(isolate); \ 165762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (stack_check.HasOverflowed()) { \ 165862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate->StackOverflow(); \ 165962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return result_value; \ 166062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } \ 1661bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } while (false) 166244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 166344f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Support for temporarily postponing interrupts. When the outermost 166444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// postpone scope is left the interrupts will be re-enabled and any 166544f0eee88ff00398ff7f715fab053374d808c90dSteve Block// interrupts that occurred while in the scope will be taken into 166644f0eee88ff00398ff7f715fab053374d808c90dSteve Block// account. 166744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass PostponeInterruptsScope BASE_EMBEDDED { 166844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PostponeInterruptsScope(Isolate* isolate, 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercept_mask = StackGuard::ALL_INTERRUPTS) 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : stack_guard_(isolate->stack_guard()), 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercept_mask_(intercept_mask), 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercepted_flags_(0) { 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_guard_->PushPostponeInterruptsScope(this); 167544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 167644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 167744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~PostponeInterruptsScope() { 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stack_guard_->PopPostponeInterruptsScope(); 167944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Find the bottom-most scope that intercepts this interrupt. 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Return whether the interrupt has been intercepted. 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Intercept(StackGuard::InterruptFlag flag); 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 168544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 168644f0eee88ff00398ff7f715fab053374d808c90dSteve Block StackGuard* stack_guard_; 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercept_mask_; 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int intercepted_flags_; 1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PostponeInterruptsScope* prev_; 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class StackGuard; 169244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 169344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 169444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass CodeTracer final : public Malloced { 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit CodeTracer(int isolate_id) 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : file_(NULL), 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_depth_(0) { 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch file_ = stdout; 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 170444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_redirect_code_traces_to == NULL) { 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SNPrintF(filename_, 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "code-%d-%d.asm", 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::GetCurrentProcessId(), 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_id); 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrNCpy(filename_, FLAG_redirect_code_traces_to, filename_.length()); 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 171344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteChars(filename_.start(), "", 0, false); 1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 171644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class Scope { 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit Scope(CodeTracer* tracer) : tracer_(tracer) { tracer->OpenFile(); } 1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~Scope() { tracer_->CloseFile(); } 172144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file() const { return tracer_->file(); } 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeTracer* tracer_; 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void OpenFile() { 1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file_ == NULL) { 1734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch file_ = base::OS::FOpen(filename_.start(), "ab"); 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scope_depth_++; 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 173944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CloseFile() { 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!ShouldRedirect()) { 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (--scope_depth_ == 0) { 1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(file_); 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch file_ = NULL; 1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file() const { return file_; } 1752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool ShouldRedirect() { 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FLAG_redirect_code_traces; 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EmbeddedVector<char, 128> filename_; 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file_; 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scope_depth_; 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 176244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 1764014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 176544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 176644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // V8_ISOLATE_H_ 1767