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 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/isolate.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include <stdlib.h> 844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <fstream> // NOLINT(readability/streams) 10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <sstream> 11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/assembler-inl.h" 1362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/ast/ast-value-factory.h" 14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/ast/context-slot-cache.h" 15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/base/hashmap.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/platform/platform.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/sys-info.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/utils/random-number-generator.h" 19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/basic-block-profiler.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/bootstrapper.h" 21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/cancelable-task.h" 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/codegen.h" 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compilation-cache.h" 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/compilation-statistics.h" 2562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/compiler-dispatcher/compiler-dispatcher.h" 26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/compiler-dispatcher/optimizing-compile-dispatcher.h" 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen.h" 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/debug/debug.h" 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/deoptimizer.h" 30c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/elements.h" 313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/external-reference-table.h" 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/frames-inl.h" 33c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/ic/access-compiler-data.h" 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ic/stub-cache.h" 35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/interface-descriptors.h" 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/interpreter/interpreter.h" 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate-inl.h" 38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/libsampler/sampler.h" 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/log.h" 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/messages.h" 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/profiler/cpu-profiler.h" 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/prototype.h" 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/regexp/regexp-stack.h" 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/runtime-profiler.h" 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/simulator.h" 463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/snapshot/deserializer.h" 47c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/tracing/tracing-category-observer.h" 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/v8.h" 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/version.h" 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/vm-state-inl.h" 5113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch#include "src/wasm/wasm-module.h" 5262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/wasm/wasm-objects.h" 53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/accounting-allocator.h" 5444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 5544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 { 5644f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal { 5744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbase::Atomic32 ThreadId::highest_thread_id_ = 0; 598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochint ThreadId::AllocateThreadId() { 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int new_id = base::NoBarrier_AtomicIncrement(&highest_thread_id_, 1); 628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return new_id; 638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 65257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochint ThreadId::GetCurrentThreadId() { 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int thread_id = base::Thread::GetThreadLocalInt(Isolate::thread_id_key_); 688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch if (thread_id == 0) { 698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch thread_id = AllocateThreadId(); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::SetThreadLocalInt(Isolate::thread_id_key_, thread_id); 718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return thread_id; 738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 7444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 756d7cb000ed533f52d745e60663019ff891bb19a8Ben Murdoch 76257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochThreadLocalTop::ThreadLocalTop() { 77257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch InitializeInternal(); 78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 81257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid ThreadLocalTop::InitializeInternal() { 82257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch c_entry_fp_ = 0; 83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier c_function_ = 0; 84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch handler_ = 0; 85257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef USE_SIMULATOR 86257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch simulator_ = NULL; 87257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 88257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch js_entry_sp_ = NULL; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_callback_scope_ = NULL; 90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch current_vm_state_ = EXTERNAL; 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try_catch_handler_ = NULL; 92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch context_ = NULL; 93257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_id_ = ThreadId::Invalid(); 94257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch external_caught_exception_ = false; 95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch failed_access_check_callback_ = NULL; 96257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch save_context_ = NULL; 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch promise_on_stack_ = NULL; 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // These members are re-initialized later after deserialization 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // is complete. 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pending_exception_ = NULL; 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rethrowing_message_ = false; 1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pending_message_obj_ = NULL; 1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch scheduled_exception_ = NULL; 105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid ThreadLocalTop::Initialize() { 109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch InitializeInternal(); 110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef USE_SIMULATOR 111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch simulator_ = Simulator::current(isolate_); 112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_id_ = ThreadId::Current(); 114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid ThreadLocalTop::Free() { 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Match unmatched PopPromise calls. 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (promise_on_stack_) isolate_->PopPromise(); 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbase::Thread::LocalStorageKey Isolate::isolate_key_; 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbase::Thread::LocalStorageKey Isolate::thread_id_key_; 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbase::Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbase::LazyMutex Isolate::thread_data_table_mutex_ = LAZY_MUTEX_INITIALIZER; 12785b71799222b55eb5dd74ea26efe0c64ab655c8cBen MurdochIsolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbase::Atomic32 Isolate::isolate_counter_ = 0; 129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG 130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbase::Atomic32 Isolate::isolate_key_created_ = 0; 131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 13344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIsolate::PerIsolateThreadData* 13444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate::FindOrAllocatePerThreadDataForThisThread() { 1358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId thread_id = ThreadId::Current(); 13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* per_thread = NULL; 13744f0eee88ff00398ff7f715fab053374d808c90dSteve Block { 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 13985b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch per_thread = thread_data_table_->Lookup(this, thread_id); 14044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (per_thread == NULL) { 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch per_thread = new PerIsolateThreadData(this, thread_id); 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_data_table_->Insert(per_thread); 14344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(thread_data_table_->Lookup(this, thread_id) == per_thread); 14544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 14644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return per_thread; 14744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 14944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::DiscardPerThreadDataForThisThread() { 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int thread_id_int = base::Thread::GetThreadLocalInt(Isolate::thread_id_key_); 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (thread_id_int) { 153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ThreadId thread_id = ThreadId(thread_id_int); 154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!thread_manager_->mutex_owner_.Equals(thread_id)); 155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PerIsolateThreadData* per_thread = 157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_data_table_->Lookup(this, thread_id); 158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (per_thread) { 159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!per_thread->thread_state_); 160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_data_table_->Remove(per_thread); 161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochIsolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { 167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ThreadId thread_id = ThreadId::Current(); 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return FindPerThreadDataForThread(thread_id); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochIsolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread( 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadId thread_id) { 174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PerIsolateThreadData* per_thread = NULL; 175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch { 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 17785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch per_thread = thread_data_table_->Lookup(this, thread_id); 178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return per_thread; 180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::InitializeOncePerProcess() { 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(thread_data_table_ == NULL); 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate_key_ = base::Thread::CreateThreadLocalKey(); 187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if DEBUG 188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::NoBarrier_Store(&isolate_key_created_, 1); 189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_id_key_ = base::Thread::CreateThreadLocalKey(); 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch per_isolate_thread_data_key_ = base::Thread::CreateThreadLocalKey(); 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_data_table_ = new Isolate::ThreadDataTable(); 19344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochAddress Isolate::get_address_from_id(Isolate::AddressId id) { 197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return isolate_addresses_[id]; 198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochchar* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) { 202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage); 203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Iterate(v, thread); 204257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return thread_storage + sizeof(ThreadLocalTop); 205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::IterateThread(ThreadVisitor* v, char* t) { 209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(t); 210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch v->VisitThread(this, thread); 211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 212257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 213257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 214257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::Iterate(ObjectVisitor* v, ThreadLocalTop* thread) { 215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Visit the roots from the top for a given thread. 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v->VisitPointer(&thread->pending_exception_); 217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch v->VisitPointer(&(thread->pending_message_obj_)); 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v->VisitPointer(bit_cast<Object**>(&(thread->context_))); 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v->VisitPointer(&thread->scheduled_exception_); 220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (v8::TryCatch* block = thread->try_catch_handler(); 222257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch block != NULL; 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch block = block->next_) { 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v->VisitPointer(bit_cast<Object**>(&(block->exception_))); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v->VisitPointer(bit_cast<Object**>(&(block->message_obj_))); 226257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 227257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Iterate over pointers on native execution stack. 229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (StackFrameIterator it(this, thread); !it.done(); it.Advance()) { 230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch it.frame()->Iterate(v); 231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 232257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::Iterate(ObjectVisitor* v) { 236257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ThreadLocalTop* current_t = thread_local_top(); 237257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Iterate(v, current_t); 238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::IterateDeferredHandles(ObjectVisitor* visitor) { 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (DeferredHandles* deferred = deferred_handles_head_; 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred != NULL; 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred = deferred->next_) { 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred->Iterate(visitor); 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Isolate::IsDeferredHandle(Object** handle) { 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Each DeferredHandles instance keeps the handles to one job in the 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // concurrent recompilation queue, containing a list of blocks. Each block 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // contains kHandleBlockSize handles except for the first block, which may 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not be fully filled. 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We iterate through all the blocks to see whether the argument handle 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // belongs to one of the blocks. If so, it is deferred. 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (DeferredHandles* deferred = deferred_handles_head_; 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred != NULL; 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred = deferred->next_) { 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch List<Object**>* blocks = &deferred->blocks_; 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < blocks->length(); i++) { 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object** block_limit = (i == 0) ? deferred->first_block_limit_ 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : blocks->at(i) + kHandleBlockSize; 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (blocks->at(i) <= handle && handle < block_limit) return true; 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // DEBUG 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::RegisterTryCatchHandler(v8::TryCatch* that) { 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->set_try_catch_handler(that); 275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::UnregisterTryCatchHandler(v8::TryCatch* that) { 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(thread_local_top()->try_catch_handler() == that); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->set_try_catch_handler(that->next_); 281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 282257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<String> Isolate::StackTraceString() { 285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (stack_trace_nesting_level_ == 0) { 286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_nesting_level_++; 287257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HeapStringAllocator allocator; 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringStream::ClearMentionedObjectCache(this); 289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch StringStream accumulator(&allocator); 290257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch incomplete_message_ = &accumulator; 291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PrintStack(&accumulator); 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> stack_trace = accumulator.ToString(this); 293257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch incomplete_message_ = NULL; 294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_nesting_level_ = 0; 295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return stack_trace; 296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (stack_trace_nesting_level_ == 1) { 297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_nesting_level_++; 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError( 299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "\n\nAttempt to print stack while printing stack (double fault)\n"); 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError( 301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "If you are lucky you may find a partial stack dump on stdout.\n\n"); 302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch incomplete_message_->OutputToStdOut(); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return factory()->empty_string(); 304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::Abort(); 306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Unreachable 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return factory()->empty_string(); 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::PushStackTraceAndDie(unsigned int magic, void* ptr1, void* ptr2, 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch unsigned int magic2) { 314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const int kMaxStackTraceSize = 32 * KB; 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> trace = StackTraceString(); 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t buffer[kMaxStackTraceSize]; 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = Min(kMaxStackTraceSize - 1, trace->length()); 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::WriteToFlat(*trace, buffer, 0, length); 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer[length] = '\0'; 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(dcarney): convert buffer to utf8? 321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::PrintError("Stacktrace (%x-%x) %p %p: %s\n", magic, magic2, ptr1, 322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ptr2, reinterpret_cast<char*>(buffer)); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::Abort(); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 326f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace { 327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass StackTraceHelper { 329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StackTraceHelper(Isolate* isolate, FrameSkipMode mode, Handle<Object> caller) 331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : isolate_(isolate), 332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch mode_(mode), 333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch caller_(caller), 334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch skip_next_frame_(true) { 335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (mode_) { 336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case SKIP_FIRST: 337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch skip_next_frame_ = true; 338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case SKIP_UNTIL_SEEN: 340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(caller_->IsJSFunction()); 341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch skip_next_frame_ = true; 342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case SKIP_NONE: 344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch skip_next_frame_ = false; 345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch break; 346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch encountered_strict_function_ = false; 348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 350f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Poison stack frames below the first strict mode frame. 351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // The stack trace API should not expose receivers and function 352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // objects on frames deeper than the top-most one with a strict mode 353f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // function. 354f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool IsStrictFrame(JSFunction* fun) { 355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!encountered_strict_function_) { 356f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch encountered_strict_function_ = is_strict(fun->shared()->language_mode()); 357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 358f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return encountered_strict_function_; 359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Determines whether the given stack frame should be displayed in a stack 362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // trace. 363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsVisibleInStackTrace(JSFunction* fun) { 36462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return ShouldIncludeFrame(fun) && IsNotHidden(fun) && 365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch IsInSameSecurityContext(fun); 366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This mechanism excludes a number of uninteresting frames from the stack 370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // trace. This can be be the first frame (which will be a builtin-exit frame 371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // for the error constructor builtin) or every frame until encountering a 372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // user-specified function. 373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool ShouldIncludeFrame(JSFunction* fun) { 374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (mode_) { 375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case SKIP_NONE: 376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return true; 377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case SKIP_FIRST: 378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!skip_next_frame_) return true; 379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch skip_next_frame_ = false; 380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return false; 381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case SKIP_UNTIL_SEEN: 382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (skip_next_frame_ && (fun == *caller_)) { 383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch skip_next_frame_ = false; 384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return false; 385f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return !skip_next_frame_; 387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return false; 390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 39262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool IsNotHidden(JSFunction* fun) { 39362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Functions defined not in user scripts are not visible unless directly 394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // exposed, in which case the native flag is set. 395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // The --builtins-in-stack-traces command line flag allows including 396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // internal call sites in the stack trace for debugging purposes. 39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (!FLAG_builtins_in_stack_traces && !fun->shared()->IsUserJavaScript()) { 398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return fun->shared()->native(); 399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return true; 401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool IsInSameSecurityContext(JSFunction* fun) { 404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return isolate_->context()->HasSameSecurityTokenAs(fun->context()); 405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Isolate* isolate_; 408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const FrameSkipMode mode_; 410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch const Handle<Object> caller_; 411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool skip_next_frame_; 412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool encountered_strict_function_; 414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// TODO(jgruber): Fix all cases in which frames give us a hole value (e.g. the 417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// receiver in RegExp constructor frames. 418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<Object> TheHoleToUndefined(Isolate* isolate, Handle<Object> in) { 419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return (in->IsTheHole(isolate)) 420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ? Handle<Object>::cast(isolate->factory()->undefined_value()) 421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : in; 422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 423f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 424f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochbool GetStackTraceLimit(Isolate* isolate, int* result) { 425f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSObject> error = isolate->error_function(); 426f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 427f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<String> key = isolate->factory()->stackTraceLimit_string(); 428f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> stack_trace_limit = JSReceiver::GetDataProperty(error, key); 429f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!stack_trace_limit->IsNumber()) return false; 430f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 431f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Ensure that limit is not negative. 432f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch *result = Max(FastD2IChecked(stack_trace_limit->Number()), 0); 433f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return true; 434f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 435f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 436f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} // namespace 437f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 4383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSReceiver> error_object, 439f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FrameSkipMode mode, 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> caller) { 441f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DisallowJavascriptExecution no_js(this); 442f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 443f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int limit; 444f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!GetStackTraceLimit(this, &limit)) return factory()->undefined_value(); 445f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 446f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int initial_size = Min(limit, 10); 447f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<FrameArray> elements = factory()->NewFrameArray(initial_size); 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 449f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch StackTraceHelper helper(this, mode, caller); 450f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 451f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (StackFrameIterator iter(this); 452f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch !iter.done() && elements->FrameCount() < limit; iter.Advance()) { 4533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch StackFrame* frame = iter.frame(); 4543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 4553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch switch (frame->type()) { 4563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case StackFrame::JAVA_SCRIPT: 4573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch case StackFrame::OPTIMIZED: 45813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case StackFrame::INTERPRETED: 45913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch case StackFrame::BUILTIN: { 4603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JavaScriptFrame* js_frame = JavaScriptFrame::cast(frame); 4613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Set initial size to the maximum inlining level + 1 for the outermost 4623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // function. 4633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch List<FrameSummary> frames(FLAG_max_inlining_levels + 1); 4643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch js_frame->Summarize(&frames); 4653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = frames.length() - 1; i >= 0; i--) { 46662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const auto& summ = frames[i].AsJavaScript(); 46762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSFunction> fun = summ.function(); 468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 4693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Filter out internal frames that we do not want to show. 470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!helper.IsVisibleInStackTrace(*fun)) continue; 4713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 472f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> recv = frames[i].receiver(); 47362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<AbstractCode> abstract_code = summ.abstract_code(); 474f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int offset = frames[i].code_offset(); 475f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 476f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool force_constructor = false; 477f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (frame->type() == StackFrame::BUILTIN) { 478f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Help CallSite::IsConstructor correctly detect hand-written 479f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // construct stubs. 480f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (Code::cast(*abstract_code)->is_construct_stub()) { 481f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch force_constructor = true; 4823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 4833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int flags = 0; 486f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (helper.IsStrictFrame(*fun)) flags |= FrameArray::kIsStrict; 487f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (force_constructor) flags |= FrameArray::kForceConstructor; 488f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 489f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch elements = FrameArray::AppendJSFrame( 490f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch elements, TheHoleToUndefined(this, recv), fun, abstract_code, 491f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch offset, flags); 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } break; 4943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 495f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case StackFrame::BUILTIN_EXIT: { 496f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch BuiltinExitFrame* exit_frame = BuiltinExitFrame::cast(frame); 497f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSFunction> fun = handle(exit_frame->function(), this); 498f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 499f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Filter out internal frames that we do not want to show. 500f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!helper.IsVisibleInStackTrace(*fun)) continue; 501f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 502f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> recv(exit_frame->receiver(), this); 503f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Code> code(exit_frame->LookupCode(), this); 504f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int offset = 505f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static_cast<int>(exit_frame->pc() - code->instruction_start()); 506f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 507f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int flags = 0; 508f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (helper.IsStrictFrame(*fun)) flags |= FrameArray::kIsStrict; 509f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (exit_frame->IsConstructor()) flags |= FrameArray::kForceConstructor; 510f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 511f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch elements = FrameArray::AppendJSFrame(elements, recv, fun, 512f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode>::cast(code), 513f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch offset, flags); 514f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } break; 515f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 51662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case StackFrame::WASM_COMPILED: { 51762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WasmCompiledFrame* wasm_frame = WasmCompiledFrame::cast(frame); 51862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<WasmInstanceObject> instance(wasm_frame->wasm_instance(), this); 519f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int wasm_function_index = wasm_frame->function_index(); 5203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Code* code = wasm_frame->unchecked_code(); 521f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode> abstract_code(AbstractCode::cast(code), this); 522f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int offset = 523bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static_cast<int>(wasm_frame->pc() - code->instruction_start()); 524f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 52562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int flags = 0; 52662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (instance->compiled_module()->is_asm_js()) { 52762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch flags |= FrameArray::kIsAsmJsWasmFrame; 52862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (wasm_frame->at_to_number_conversion()) { 52962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch flags |= FrameArray::kAsmJsAtNumberConversion; 53062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 53162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 53262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch flags |= FrameArray::kIsWasmFrame; 53362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 534c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 535c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch elements = 536c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch FrameArray::AppendWasmFrame(elements, instance, wasm_function_index, 537c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch abstract_code, offset, flags); 5383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } break; 5393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 54062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case StackFrame::WASM_INTERPRETER_ENTRY: 54162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(clemensh): Add frames. 54262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch break; 54362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 5443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch default: 5453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch break; 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 548f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 549f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch elements->ShrinkToFit(); 550f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(yangguo): Queue this structured stack trace for preprocessing on GC. 552f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return factory()->NewJSArrayWithElements(elements); 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<JSReceiver> Isolate::CaptureAndSetDetailedStackTrace( 5563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> error_object) { 5573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (capture_stack_trace_for_uncaught_exceptions_) { 5583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Capture stack trace for a detailed exception message. 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> key = factory()->detailed_stack_trace_symbol(); 5603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSArray> stack_trace = CaptureCurrentStackTrace( 5613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stack_trace_for_uncaught_exceptions_frame_limit_, 5623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch stack_trace_for_uncaught_exceptions_options_); 563014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RETURN_ON_EXCEPTION( 5643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this, JSReceiver::SetProperty(error_object, key, stack_trace, STRICT), 5653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JSReceiver); 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 567014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return error_object; 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMaybeHandle<JSReceiver> Isolate::CaptureAndSetSimpleStackTrace( 571f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSReceiver> error_object, FrameSkipMode mode, 572f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> caller) { 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Capture stack trace for simple stack trace string formatting. 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> key = factory()->stack_trace_symbol(); 575f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> stack_trace = 576f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CaptureSimpleStackTrace(error_object, mode, caller); 577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RETURN_ON_EXCEPTION( 5783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this, JSReceiver::SetProperty(error_object, key, stack_trace, STRICT), 5793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JSReceiver); 580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return error_object; 581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSArray> Isolate::GetDetailedStackTrace(Handle<JSObject> error_object) { 585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Name> key_detailed = factory()->detailed_stack_trace_symbol(); 586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> stack_trace = 587014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSReceiver::GetDataProperty(error_object, key_detailed); 588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stack_trace->IsJSArray()) return Handle<JSArray>::cast(stack_trace); 589f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Handle<JSArray>(); 590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CaptureStackTraceHelper { 594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CaptureStackTraceHelper(Isolate* isolate, 596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier StackTrace::StackTraceOptions options) 597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : isolate_(isolate) { 598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kColumnOffset) { 599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier column_key_ = 600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("column")); 601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kLineNumber) { 603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier line_key_ = 604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("lineNumber")); 605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kScriptId) { 607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier script_id_key_ = 608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("scriptId")); 609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kScriptName) { 611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier script_name_key_ = 612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("scriptName")); 613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kScriptNameOrSourceURL) { 615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier script_name_or_source_url_key_ = factory()->InternalizeOneByteString( 616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STATIC_CHAR_VECTOR("scriptNameOrSourceURL")); 617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kFunctionName) { 619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier function_key_ = factory()->InternalizeOneByteString( 620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STATIC_CHAR_VECTOR("functionName")); 621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kIsEval) { 623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier eval_key_ = 624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("isEval")); 625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (options & StackTrace::kIsConstructor) { 627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier constructor_key_ = factory()->InternalizeOneByteString( 628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STATIC_CHAR_VECTOR("isConstructor")); 629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 632bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSObject> NewStackFrameObject(FrameSummary& summ) { 63362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (summ.IsJavaScript()) return NewStackFrameObject(summ.AsJavaScript()); 63462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (summ.IsWasm()) return NewStackFrameObject(summ.AsWasm()); 63562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch UNREACHABLE(); 63662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return Handle<JSObject>::null(); 637bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 638bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 63962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSObject> NewStackFrameObject( 64062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const FrameSummary::JavaScriptFrameSummary& summ) { 641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSObject> stack_frame = 642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier factory()->NewJSObject(isolate_->object_function()); 64362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Script> script = Handle<Script>::cast(summ.script()); 644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!line_key_.is_null()) { 64613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Script::PositionInfo info; 64762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool valid_pos = Script::GetPositionInfo(script, summ.SourcePosition(), 64862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch &info, Script::WITH_OFFSET); 64913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 65013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!column_key_.is_null() && valid_pos) { 651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, column_key_, 65213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch handle(Smi::FromInt(info.column + 1), isolate_), 653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier NONE); 654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, line_key_, 65613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch handle(Smi::FromInt(info.line + 1), isolate_), 657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier NONE); 658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!script_id_key_.is_null()) { 661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, script_id_key_, 662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch handle(Smi::FromInt(script->id()), isolate_), NONE); 663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!script_name_key_.is_null()) { 666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, script_name_key_, 667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier handle(script->name(), isolate_), NONE); 668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!script_name_or_source_url_key_.is_null()) { 67162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> result(script->GetNameOrSourceURL(), isolate_); 672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, script_name_or_source_url_key_, result, 673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier NONE); 674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!eval_key_.is_null()) { 677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> is_eval = factory()->ToBoolean( 678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier script->compilation_type() == Script::COMPILATION_TYPE_EVAL); 679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, eval_key_, is_eval, NONE); 680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 682bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!function_key_.is_null()) { 68362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> fun_name = summ.FunctionName(); 684bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch JSObject::AddProperty(stack_frame, function_key_, fun_name, NONE); 685bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 686bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!constructor_key_.is_null()) { 68862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> is_constructor_obj = 68962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch factory()->ToBoolean(summ.is_constructor()); 690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::AddProperty(stack_frame, constructor_key_, is_constructor_obj, 691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier NONE); 692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 693bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return stack_frame; 694bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 695bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 696f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSObject> NewStackFrameObject(BuiltinExitFrame* frame) { 697f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSObject> stack_frame = 698f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch factory()->NewJSObject(isolate_->object_function()); 699f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSFunction> fun = handle(frame->function(), isolate_); 700f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!function_key_.is_null()) { 701f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> fun_name = JSFunction::GetDebugName(fun); 702f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch JSObject::AddProperty(stack_frame, function_key_, fun_name, NONE); 703f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 704f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 705f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // We don't have a script and hence cannot set line and col positions. 706f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(!fun->shared()->script()->IsScript()); 707f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 708f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return stack_frame; 709f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 710f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 71162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSObject> NewStackFrameObject( 71262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch const FrameSummary::WasmFrameSummary& summ) { 713bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<JSObject> stack_frame = 714bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch factory()->NewJSObject(isolate_->object_function()); 715bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 716bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!function_key_.is_null()) { 71762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<WasmCompiledModule> compiled_module( 71862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch summ.wasm_instance()->compiled_module(), isolate_); 71962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> name = WasmCompiledModule::GetFunctionName( 72062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate_, compiled_module, summ.function_index()); 72113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch JSObject::AddProperty(stack_frame, function_key_, name, NONE); 722bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 723c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Encode the function index as line number (1-based). 724bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!line_key_.is_null()) { 725bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch JSObject::AddProperty( 726bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch stack_frame, line_key_, 72762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate_->factory()->NewNumberFromInt(summ.function_index() + 1), 728c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch NONE); 729bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 730c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Encode the byte offset as column (1-based). 731bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!column_key_.is_null()) { 73262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int position = summ.byte_offset(); 73313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Make position 1-based. 73413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (position >= 0) ++position; 735bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch JSObject::AddProperty(stack_frame, column_key_, 736bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch isolate_->factory()->NewNumberFromInt(position), 737bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch NONE); 738bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 739f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!script_id_key_.is_null()) { 74062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int script_id = summ.script()->id(); 741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch JSObject::AddProperty(stack_frame, script_id_key_, 742f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch handle(Smi::FromInt(script_id), isolate_), NONE); 743f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return stack_frame; 746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inline Factory* factory() { return isolate_->factory(); } 750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Isolate* isolate_; 752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> column_key_; 753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> line_key_; 754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> script_id_key_; 755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> script_name_key_; 756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> script_name_or_source_url_key_; 757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> function_key_; 758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> eval_key_; 759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> constructor_key_; 760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 762257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<JSArray> Isolate::CaptureCurrentStackTrace( 763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int frame_limit, StackTrace::StackTraceOptions options) { 764f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DisallowJavascriptExecution no_js(this); 765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CaptureStackTraceHelper helper(this, options); 766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Ensure no negative values. 768257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int limit = Max(frame_limit, 0); 769257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Handle<JSArray> stack_trace = factory()->NewJSArray(frame_limit); 770bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<FixedArray> stack_trace_elems( 771bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FixedArray::cast(stack_trace->elements()), this); 772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 773257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int frames_seen = 0; 774bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch for (StackTraceFrameIterator it(this); !it.done() && (frames_seen < limit); 775bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch it.Advance()) { 776bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch StandardFrame* frame = it.frame(); 77762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Set initial size to the maximum inlining level + 1 for the outermost 77862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // function. 77962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch List<FrameSummary> frames(FLAG_max_inlining_levels + 1); 78062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch frame->Summarize(&frames); 78162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for (int i = frames.length() - 1; i >= 0 && frames_seen < limit; i--) { 78262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Filter frames from other security contexts. 78362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (!(options & StackTrace::kExposeFramesAcrossSecurityOrigins) && 78462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch !this->context()->HasSameSecurityTokenAs(*frames[i].native_context())) 78562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch continue; 78662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSObject> new_frame_obj = helper.NewStackFrameObject(frames[i]); 787bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch stack_trace_elems->set(frames_seen, *new_frame_obj); 788257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch frames_seen++; 789257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 791257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace->set_length(Smi::FromInt(frames_seen)); 793257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return stack_trace; 794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 795257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 796257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 797014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::PrintStack(FILE* out, PrintStackMode mode) { 798257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (stack_trace_nesting_level_ == 0) { 799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_nesting_level_++; 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringStream::ClearMentionedObjectCache(this); 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapStringAllocator allocator; 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringStream accumulator(&allocator); 803257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch incomplete_message_ = &accumulator; 804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintStack(&accumulator, mode); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch accumulator.OutputToFile(out); 80669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch InitializeLoggingAndCounters(); 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch accumulator.Log(this); 808257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch incomplete_message_ = NULL; 809257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_nesting_level_ = 0; 810257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else if (stack_trace_nesting_level_ == 1) { 811257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_nesting_level_++; 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError( 813257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "\n\nAttempt to print stack while printing stack (double fault)\n"); 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError( 815257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "If you are lucky you may find a partial stack dump on stdout.\n\n"); 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch incomplete_message_->OutputToFile(out); 817257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 818257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 819257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 820257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void PrintFrames(Isolate* isolate, 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringStream* accumulator, 823257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch StackFrame::PrintMode mode) { 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StackFrameIterator it(isolate); 825257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch for (int i = 0; !it.done(); it.Advance()) { 826257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch it.frame()->Print(accumulator, mode, i++); 827257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 828257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 829257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 830257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::PrintStack(StringStream* accumulator, PrintStackMode mode) { 832257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // The MentionedObjectCache is not GC-proof at the moment. 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 834f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch HandleScope scope(this); 835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(accumulator->IsMentionedObjectCacheClear(this)); 836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 837257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Avoid printing anything if there are no frames. 838257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (c_entry_fp(thread_local_top()) == 0) return; 839257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 840257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch accumulator->Add( 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "\n==== JS stack trace =========================================\n\n"); 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintFrames(this, accumulator, StackFrame::OVERVIEW); 843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (mode == kPrintStackVerbose) { 844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch accumulator->Add( 845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "\n==== Details ================================================\n\n"); 846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintFrames(this, accumulator, StackFrame::DETAILS); 847014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch accumulator->PrintMentionedObjectCache(this); 848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 849257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch accumulator->Add("=====================\n\n"); 850257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 851257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 852257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::SetFailedAccessCheckCallback( 854257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch v8::FailedAccessCheckCallback callback) { 855257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_local_top()->failed_access_check_callback_ = callback; 856257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 857257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 858257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::ReportFailedAccessCheck(Handle<JSObject> receiver) { 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!thread_local_top()->failed_access_check_callback_) { 861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ScheduleThrow(*factory()->NewTypeError(MessageTemplate::kNoAccess)); 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(receiver->IsAccessCheckNeeded()); 865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(context()); 866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Get the data object from access check info. 868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(this); 869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> data; 870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { DisallowHeapAllocation no_gc; 87113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch AccessCheckInfo* access_check_info = AccessCheckInfo::Get(this, receiver); 872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!access_check_info) { 873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AllowHeapAllocation doesnt_matter_anymore; 874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return ScheduleThrow( 875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *factory()->NewTypeError(MessageTemplate::kNoAccess)); 876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch data = handle(access_check_info->data(), this); 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Leaving JavaScript. 881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VMState<EXTERNAL> state(this); 882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->failed_access_check_callback_( 883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Utils::ToLocal(receiver), v8::ACCESS_HAS, v8::Utils::ToLocal(data)); 884257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 885257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 886257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 887014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Isolate::MayAccess(Handle<Context> accessing_context, 888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> receiver) { 889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(receiver->IsJSGlobalProxy() || receiver->IsAccessCheckNeeded()); 890257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 891257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Check for compatibility between the security tokens in the 892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // current lexical context and the accessed object. 893257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 894014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // During bootstrapping, callback functions are not enabled yet. 895014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (bootstrapper()->IsActive()) return true; 896014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DisallowHeapAllocation no_gc; 898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (receiver->IsJSGlobalProxy()) { 900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* receiver_context = 901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSGlobalProxy::cast(*receiver)->native_context(); 902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!receiver_context->IsContext()) return false; 903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Get the native context of current top context. 905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // avoid using Isolate::native_context() because it uses Handle. 906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* native_context = 907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch accessing_context->global_object()->native_context(); 908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (receiver_context == native_context) return true; 909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Context::cast(receiver_context)->security_token() == 911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch native_context->security_token()) 912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 914257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 916257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HandleScope scope(this); 917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> data; 918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::AccessCheckCallback callback = nullptr; 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { DisallowHeapAllocation no_gc; 92013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch AccessCheckInfo* access_check_info = AccessCheckInfo::Get(this, receiver); 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!access_check_info) return false; 922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* fun_obj = access_check_info->callback(); 923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch callback = v8::ToCData<v8::AccessCheckCallback>(fun_obj); 924109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch data = handle(access_check_info->data(), this); 925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOG(this, ApiSecurityCheck()); 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { 930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Leaving JavaScript. 931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch VMState<EXTERNAL> state(this); 93213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return callback(v8::Utils::ToLocal(accessing_context), 93313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch v8::Utils::ToLocal(receiver), v8::Utils::ToLocal(data)); 934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Isolate::StackOverflow() { 939f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (FLAG_abort_on_stack_overflow) { 940f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch FATAL("Aborting on stack overflow"); 941f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 942f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 943f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DisallowJavascriptExecution no_js(this); 944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(this); 945f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 946f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSFunction> fun = range_error_function(); 947f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> msg = factory()->NewStringFromAsciiChecked( 948f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MessageTemplate::TemplateString(MessageTemplate::kStackOverflow)); 949f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> no_caller; 950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> exception; 951f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 952f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch this, exception, 953f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ErrorUtils::Construct(this, fun, fun, msg, SKIP_NONE, no_caller, true)); 954f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Throw(*exception, nullptr); 956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef VERIFY_HEAP 958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_verify_heap && FLAG_stress_compaction) { 959f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch heap()->CollectAllGarbage(Heap::kNoGCFlags, 960f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GarbageCollectionReason::kTesting); 961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // VERIFY_HEAP 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return heap()->exception(); 965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 966257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Isolate::TerminateExecution() { 969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Throw(heap_.termination_exception(), nullptr); 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::CancelTerminateExecution() { 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (try_catch_handler()) { 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try_catch_handler()->has_terminated_ = false; 976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_pending_exception() && 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pending_exception() == heap_.termination_exception()) { 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->external_caught_exception_ = false; 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_pending_exception(); 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_scheduled_exception() && 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scheduled_exception() == heap_.termination_exception()) { 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->external_caught_exception_ = false; 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_scheduled_exception(); 986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 987257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 988257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 989257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Isolate::RequestInterrupt(InterruptCallback callback, void* data) { 991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ExecutionAccess access(this); 992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier api_interrupts_queue_.push(InterruptEntry(callback, data)); 993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_guard()->RequestApiInterrupt(); 994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Isolate::InvokeApiInterruptCallbacks() { 998f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch RuntimeCallTimerScope runtimeTimer( 999f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch this, &RuntimeCallStats::InvokeApiInterruptCallbacks); 1000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Note: callback below should be called outside of execution access lock. 1001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier while (true) { 1002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier InterruptEntry entry; 1003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier { 1004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ExecutionAccess access(this); 1005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (api_interrupts_queue_.empty()) return; 1006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier entry = api_interrupts_queue_.front(); 1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier api_interrupts_queue_.pop(); 1008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch VMState<EXTERNAL> state(this); 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope handle_scope(this); 1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier entry.first(reinterpret_cast<v8::Isolate*>(this), entry.second); 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1016014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid ReportBootstrappingException(Handle<Object> exception, 1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageLocation* location) { 1018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::PrintError("Exception thrown during bootstrapping\n"); 1019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location == NULL || location->script().is_null()) return; 1020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We are bootstrapping and caught an error where the location is set 1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // and we have a script for the location. 1022014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // In this case we could have an extension (or an internal error 1023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // somewhere) and we print out the line number at which the error occured 1024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // to the console for easier debugging. 1025014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int line_number = 1026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location->script()->GetLineNumber(location->start_pos()) + 1; 1027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (exception->IsString() && location->script()->name()->IsString()) { 1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::PrintError( 1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Extension or internal compilation error: %s in %s at line %d.\n", 1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String::cast(*exception)->ToCString().get(), 1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String::cast(location->script()->name())->ToCString().get(), 1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch line_number); 1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (location->script()->name()->IsString()) { 1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::PrintError( 1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "Extension or internal compilation error in %s at line %d.\n", 1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String::cast(location->script()->name())->ToCString().get(), 1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch line_number); 1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (exception->IsString()) { 1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::PrintError("Extension or internal compilation error: %s.\n", 1040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch String::cast(*exception)->ToCString().get()); 1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::PrintError("Extension or internal compilation error.\n"); 1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef OBJECT_PRINT 1045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Since comments and empty lines have been stripped from the source of 1046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // builtins, print the actual source here so that line numbers match. 1047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location->script()->source()->IsString()) { 1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> src(String::cast(location->script()->source())); 1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("Failing script:"); 1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int len = src->length(); 1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (len == 0) { 1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF(" <not available>\n"); 1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("\n"); 1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int line_number = 1; 1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("%5d: ", line_number); 1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < len; i++) { 1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint16_t character = src->Get(i); 1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("%c", character); 1060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (character == '\n' && i < len - 2) { 1061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("%5d: ", ++line_number); 1062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("\n"); 1065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 1068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Isolate::Throw(Object* exception, MessageLocation* location) { 1072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!has_pending_exception()); 1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(this); 1075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> exception_handle(exception, this); 1076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1077c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (FLAG_print_all_exceptions) { 1078c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf("=========================================================\n"); 1079c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf("Exception thrown:\n"); 1080c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (location) { 1081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Script> script = location->script(); 108262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> name(script->GetNameOrSourceURL(), this); 1083c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf("at "); 1084c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (name->IsString() && String::cast(*name)->length() > 0) 1085c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch String::cast(*name)->PrintOn(stdout); 1086c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch else 1087c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf("<anonymous>"); 1088c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// Script::GetLineNumber and Script::GetColumnNumber can allocate on the heap to 1089c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// initialize the line_ends array, so be careful when calling them. 1090c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#ifdef DEBUG 1091c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (AllowHeapAllocation::IsAllowed()) { 1092c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#else 1093c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (false) { 1094c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#endif 1095c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf(", %d:%d - %d:%d\n", 1096c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Script::GetLineNumber(script, location->start_pos()) + 1, 1097c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Script::GetColumnNumber(script, location->start_pos()), 1098c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Script::GetLineNumber(script, location->end_pos()) + 1, 1099c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Script::GetColumnNumber(script, location->end_pos())); 1100c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } else { 1101c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf(", line %d\n", script->GetLineNumber(location->start_pos()) + 1); 1102c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 1103c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 1104c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch exception->Print(); 1105c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf("Stack Trace:\n"); 1106c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PrintStack(stdout); 1107c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch printf("=========================================================\n"); 1108c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 1109c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Determine whether a message needs to be created for the given exception 1111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // depending on the following criteria: 1112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1) External v8::TryCatch missing: Always create a message because any 1113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // JavaScript handler for a finally-block might re-throw to top-level. 1114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 2) External v8::TryCatch exists: Only create a message if the handler 1115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // captures messages or is verbose (which reports despite the catch). 1116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 3) ReThrow from v8::TryCatch: The message from a previous throw still 1117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // exists and we preserve it instead of creating a new message. 1118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool requires_message = try_catch_handler() == nullptr || 1119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch try_catch_handler()->is_verbose_ || 1120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch try_catch_handler()->capture_message_; 1121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool rethrowing_message = thread_local_top()->rethrowing_message_; 1122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->rethrowing_message_ = false; 1124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Notify debugger of exception. 1126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (is_catchable_by_javascript(exception)) { 1127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch debug()->OnThrow(exception_handle); 1128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Generate the message if required. 1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (requires_message && !rethrowing_message) { 1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageLocation computed_location; 1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If no location was specified we try to use a computed one instead. 1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location == NULL && ComputeLocation(&computed_location)) { 1135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location = &computed_location; 1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (bootstrapper()->IsActive()) { 1139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // It's not safe to try to make message objects or collect stack traces 1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // while the bootstrapper is active since the infrastructure may not have 1141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // been properly initialized. 1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ReportBootstrappingException(exception_handle, location); 1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> message_obj = CreateMessage(exception_handle, location); 1145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->pending_message_obj_ = *message_obj; 1146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For any exception not caught by JavaScript, even when an external 1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // handler is present: 1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If the abort-on-uncaught-exception flag is specified, and if the 1150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // embedder didn't specify a custom uncaught exception callback, 1151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // or if the custom callback determined that V8 should abort, then 1152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // abort. 1153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (FLAG_abort_on_uncaught_exception) { 1154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CatchType prediction = PredictExceptionCatcher(); 1155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if ((prediction == NOT_CAUGHT || prediction == CAUGHT_BY_EXTERNAL) && 1156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch (!abort_on_uncaught_exception_callback_ || 1157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch abort_on_uncaught_exception_callback_( 1158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch reinterpret_cast<v8::Isolate*>(this)))) { 1159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Prevent endless recursion. 1160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FLAG_abort_on_uncaught_exception = false; 1161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This flag is intended for use by JavaScript developers, so 1162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // print a user-friendly stack trace (not an internal one). 1163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PrintF(stderr, "%s\n\nFROM\n", 1164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MessageHandler::GetLocalizedMessage(this, message_obj).get()); 1165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PrintCurrentStackTrace(stderr); 1166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch base::OS::Abort(); 1167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 1168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Set the exception being thrown. 1173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch set_pending_exception(*exception_handle); 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return heap()->exception(); 1175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Isolate::ReThrow(Object* exception) { 1179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!has_pending_exception()); 1180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Set the exception being re-thrown. 1182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_pending_exception(exception); 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return heap()->exception(); 1184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1185257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1186257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* Isolate::UnwindAndFindHandler() { 1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* exception = pending_exception(); 1189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Code* code = nullptr; 1191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* context = nullptr; 1192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch intptr_t offset = 0; 1193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address handler_sp = nullptr; 1194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address handler_fp = nullptr; 1195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1196f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Special handling of termination exceptions, uncatchable by JavaScript and 1197f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Wasm code, we unwind the handlers until the top ENTRY handler is found. 1198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool catchable_by_js = is_catchable_by_javascript(exception); 1199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Compute handler and stack unwinding information by performing a full walk 1201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // over the stack and dispatching according to the frame type. 1202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (StackFrameIterator iter(this); !iter.done(); iter.Advance()) { 1203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackFrame* frame = iter.frame(); 1204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For JSEntryStub frames we always have a handler. 1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (frame->is_entry() || frame->is_entry_construct()) { 1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackHandler* handler = frame->top_handler(); 1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Restore the next handler. 1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->handler_ = handler->next()->address(); 1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gather information from the handler. 1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch code = frame->LookupCode(); 1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch handler_sp = handler->address() + StackHandlerConstants::kSize; 1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch offset = Smi::cast(code->handler_table()->get(0))->value(); 1216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1219f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (FLAG_wasm_eh_prototype) { 1220f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (frame->is_wasm() && is_catchable_by_wasm(exception)) { 1221f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int stack_slots = 0; // Will contain stack slot count of frame. 122262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WasmCompiledFrame* wasm_frame = static_cast<WasmCompiledFrame*>(frame); 1223f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch offset = wasm_frame->LookupExceptionHandlerInTable(&stack_slots); 1224f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (offset >= 0) { 1225f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Compute the stack pointer from the frame pointer. This ensures that 1226f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // argument slots on the stack are dropped as returning would. 1227f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Address return_sp = frame->fp() + 1228f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch StandardFrameConstants::kFixedFrameSizeAboveFp - 1229f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch stack_slots * kPointerSize; 1230f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1231f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Gather information from the frame. 1232f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch code = frame->LookupCode(); 1233f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch handler_sp = return_sp; 1235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch handler_fp = frame->fp(); 1236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch break; 1237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1239f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For optimized frames we perform a lookup in the handler table. 1242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (frame->is_optimized() && catchable_by_js) { 1243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch OptimizedFrame* js_frame = static_cast<OptimizedFrame*>(frame); 1244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int stack_slots = 0; // Will contain stack slot count of frame. 1245109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch offset = js_frame->LookupExceptionHandlerInTable(&stack_slots, nullptr); 1246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (offset >= 0) { 1247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Compute the stack pointer from the frame pointer. This ensures that 1248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // argument slots on the stack are dropped as returning would. 1249109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Address return_sp = frame->fp() + 1250109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch StandardFrameConstants::kFixedFrameSizeAboveFp - 1251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch stack_slots * kPointerSize; 1252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Gather information from the frame. 1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch code = frame->LookupCode(); 1255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // TODO(bmeurer): Turbofanned BUILTIN frames appear as OPTIMIZED, but 1257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // do not have a code kind of OPTIMIZED_FUNCTION. 1258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (code->kind() == Code::OPTIMIZED_FUNCTION && 1259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch code->marked_for_deoptimization()) { 1260109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // If the target code is lazy deoptimized, we jump to the original 1261109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // return address, but we make a note that we are throwing, so that 1262109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // the deoptimizer can do the right thing. 1263109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch offset = static_cast<int>(frame->pc() - code->entry()); 1264109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch set_deoptimizer_lazy_throw(true); 1265109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch handler_sp = return_sp; 1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch handler_fp = frame->fp(); 1268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 1269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1272109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // For interpreted frame we perform a range lookup in the handler table. 1273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (frame->is_interpreted() && catchable_by_js) { 1274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch InterpretedFrame* js_frame = static_cast<InterpretedFrame*>(frame); 1275c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int register_slots = js_frame->GetBytecodeArray()->register_count(); 1276109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int context_reg = 0; // Will contain register index holding context. 1277109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch offset = js_frame->LookupExceptionHandlerInTable(&context_reg, nullptr); 1278109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (offset >= 0) { 1279c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Compute the stack pointer from the frame pointer. This ensures that 1280c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // argument slots on the stack are dropped as returning would. 1281c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Note: This is only needed for interpreted frames that have been 1282c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // materialized by the deoptimizer. If there is a handler frame 1283c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // in between then {frame->sp()} would already be correct. 1284c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Address return_sp = frame->fp() - 1285c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch InterpreterFrameConstants::kFixedFrameSizeFromFp - 1286c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch register_slots * kPointerSize; 1287c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1288109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Patch the bytecode offset in the interpreted frame to reflect the 1289109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // position of the exception handler. The special builtin below will 1290109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // take care of continuing to dispatch at that position. Also restore 1291109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // the correct context for the handler from the interpreter register. 1292bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch context = Context::cast(js_frame->ReadInterpreterRegister(context_reg)); 1293109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch js_frame->PatchBytecodeOffset(static_cast<int>(offset)); 1294109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch offset = 0; 1295109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 1296109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Gather information from the frame. 1297109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch code = *builtins()->InterpreterEnterBytecodeDispatch(); 1298c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch handler_sp = return_sp; 1299109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch handler_fp = frame->fp(); 1300109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch break; 1301109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 1302109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 1303109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 130462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // For JavaScript frames we are guaranteed not to find a handler. 1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (frame->is_java_script() && catchable_by_js) { 1306014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame); 130762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch offset = js_frame->LookupExceptionHandlerInTable(nullptr, nullptr); 130862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CHECK_EQ(-1, offset); 1309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1310014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 131162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(clemensh): Handle unwinding interpreted wasm frames (stored in the 131262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // WasmInterpreter C++ object). 131362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RemoveMaterializedObjectsOnUnwind(frame); 1315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1316014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1317014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Handler must exist. 1318014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK(code != nullptr); 1319014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Store information to be consumed by the CEntryStub. 1321014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->pending_handler_context_ = context; 1322014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->pending_handler_code_ = code; 1323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->pending_handler_offset_ = offset; 1324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->pending_handler_fp_ = handler_fp; 1325014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch thread_local_top()->pending_handler_sp_ = handler_sp; 1326014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1327014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Return and clear pending exception. 1328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch clear_pending_exception(); 1329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return exception; 1330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace { 1333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandlerTable::CatchPrediction PredictException(JavaScriptFrame* frame) { 1334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch HandlerTable::CatchPrediction prediction; 1335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (frame->is_optimized()) { 1336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (frame->LookupExceptionHandlerInTable(nullptr, nullptr) > 0) { 1337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // This optimized frame will catch. It's handler table does not include 1338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // exception prediction, and we need to use the corresponding handler 1339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // tables on the unoptimized code objects. 1340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch List<FrameSummary> summaries; 1341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch frame->Summarize(&summaries); 1342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch for (const FrameSummary& summary : summaries) { 134362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<AbstractCode> code = summary.AsJavaScript().abstract_code(); 134462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (code->IsCode() && code->kind() == AbstractCode::BUILTIN) { 134562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (code->GetCode()->is_promise_rejection()) { 134662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return HandlerTable::PROMISE; 134762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 134862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 134962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // This the exception throw in PromiseHandle which doesn't 135062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // cause a promise rejection. 135162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (code->GetCode()->is_exception_caught()) { 135262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return HandlerTable::CAUGHT; 135362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 135462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 135562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (code->kind() == AbstractCode::OPTIMIZED_FUNCTION) { 135762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(summary.AsJavaScript().function()->shared()->asm_function()); 1358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // asm code cannot contain try-catch. 1359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch continue; 1360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 136162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Must have been constructed from a bytecode array. 136262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CHECK_EQ(AbstractCode::INTERPRETED_FUNCTION, code->kind()); 1363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int code_offset = summary.code_offset(); 136462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch BytecodeArray* bytecode = code->GetBytecodeArray(); 136562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch HandlerTable* table = HandlerTable::cast(bytecode->handler_table()); 136662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int index = table->LookupRange(code_offset, nullptr, &prediction); 1367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (index <= 0) continue; 1368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (prediction == HandlerTable::UNCAUGHT) continue; 1369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return prediction; 1370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 1371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 1372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } else if (frame->LookupExceptionHandlerInTable(nullptr, &prediction) > 0) { 1373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return prediction; 1374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 1375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return HandlerTable::UNCAUGHT; 1376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 1377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} // anonymous namespace 1378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochIsolate::CatchType Isolate::PredictExceptionCatcher() { 1380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address external_handler = thread_local_top()->try_catch_handler_address(); 1381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address entry_handler = Isolate::handler(thread_local_top()); 1382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (IsExternalHandlerOnTop(nullptr)) return CAUGHT_BY_EXTERNAL; 1383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Search for an exception handler by performing a full walk over the stack. 1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (StackFrameIterator iter(this); !iter.done(); iter.Advance()) { 1386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StackFrame* frame = iter.frame(); 1387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For JSEntryStub frames we update the JS_ENTRY handler. 1389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (frame->is_entry() || frame->is_entry_construct()) { 1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch entry_handler = frame->top_handler()->next()->address(); 1391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For JavaScript frames we perform a lookup in the handler table. 1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (frame->is_java_script()) { 1395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JavaScriptFrame* js_frame = static_cast<JavaScriptFrame*>(frame); 1396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch HandlerTable::CatchPrediction prediction = PredictException(js_frame); 1397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (prediction == HandlerTable::DESUGARING) return CAUGHT_BY_DESUGARING; 1398f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (prediction == HandlerTable::ASYNC_AWAIT) return CAUGHT_BY_ASYNC_AWAIT; 1399f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (prediction == HandlerTable::PROMISE) return CAUGHT_BY_PROMISE; 1400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (prediction != HandlerTable::UNCAUGHT) return CAUGHT_BY_JAVASCRIPT; 1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The exception has been externally caught if and only if there is an 1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // external handler which is on top of the top-most JS_ENTRY handler. 1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (external_handler != nullptr && !try_catch_handler()->is_verbose_) { 1406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry_handler == nullptr || entry_handler > external_handler) { 1407014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return CAUGHT_BY_EXTERNAL; 1408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Handler not found. 1413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NOT_CAUGHT; 1414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::RemoveMaterializedObjectsOnUnwind(StackFrame* frame) { 1418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (frame->is_optimized()) { 1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool removed = materialized_object_store_->Remove(frame->fp()); 1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch USE(removed); 1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // If there were any materialized objects, the code should be 1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // marked for deopt. 1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(!removed || frame->LookupCode()->marked_for_deoptimization()); 1424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Isolate::ThrowIllegalOperation() { 1429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_stack_trace_on_illegal) PrintStack(stdout); 1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Throw(heap()->illegal_access_string()); 1431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1432257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::ScheduleThrow(Object* exception) { 1435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // When scheduling a throw we first throw the exception to get the 1436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // error reporting if it is uncaught before rescheduling it. 1437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Throw(exception); 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropagatePendingExceptionToExternalTryCatch(); 1439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_pending_exception()) { 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->scheduled_exception_ = pending_exception(); 1441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->external_caught_exception_ = false; 1442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_pending_exception(); 1443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::RestorePendingMessageFromTryCatch(v8::TryCatch* handler) { 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handler == try_catch_handler()); 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handler->HasCaught()); 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handler->rethrow_); 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(handler->capture_message_); 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* message = reinterpret_cast<Object*>(handler->message_obj_); 145313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(message->IsJSMessageObject() || message->IsTheHole(this)); 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->pending_message_obj_ = message; 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler) { 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_scheduled_exception()); 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (scheduled_exception() == handler->exception_) { 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(scheduled_exception() != heap()->termination_exception()); 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_scheduled_exception(); 1463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 146462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (thread_local_top_.pending_message_obj_ == handler->message_obj_) { 146562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch clear_pending_message(); 146662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 1467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochObject* Isolate::PromoteScheduledException() { 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* thrown = scheduled_exception(); 1472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch clear_scheduled_exception(); 1473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Re-throw the exception to avoid getting repeated error reporting. 1474257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return ReThrow(thrown); 1475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::PrintCurrentStackTrace(FILE* out) { 1479f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (StackTraceFrameIterator it(this); !it.done(); it.Advance()) { 1480f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!it.is_javascript()) continue; 1481f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(this); 1483f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch JavaScriptFrame* frame = it.javascript_frame(); 1484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> receiver(frame->receiver(), this); 1486f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction> function(frame->function(), this); 1487f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<AbstractCode> code(AbstractCode::cast(frame->LookupCode()), this); 1488f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int offset = 1489f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static_cast<int>(frame->pc() - code->instruction_start()); 1490f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1491f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch JSStackFrame site(this, receiver, function, code, offset); 1492f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<String> line = site.ToString().ToHandleChecked(); 1493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (line->length() > 0) { 1494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch line->PrintOn(out); 1495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF(out, "\n"); 1496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1500014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Isolate::ComputeLocation(MessageLocation* target) { 1501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch StackTraceFrameIterator it(this); 1502bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (it.done()) return false; 1503bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch StandardFrame* frame = it.frame(); 1504bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Compute the location from the function and the relocation info of the 1505bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // baseline code. For optimized code this will use the deoptimization 1506bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // information to get canonical location information. 1507bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch List<FrameSummary> frames(FLAG_max_inlining_levels + 1); 150862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch frame->Summarize(&frames); 1509bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FrameSummary& summary = frames.last(); 151062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int pos = summary.SourcePosition(); 151162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<SharedFunctionInfo> shared; 151262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> script = summary.script(); 151362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (!script->IsScript() || 151462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch (Script::cast(*script)->source()->IsUndefined(this))) { 151562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return false; 151662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 151762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 151862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(wasm): Remove this once trap-if is always on. 151962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Background: Without trap-if, the information on the stack trace is 152062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // incomplete (see bug v8:5007). 152162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (summary.IsWasmCompiled() && !FLAG_wasm_trap_if) return false; 152262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 152362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (summary.IsJavaScript()) { 152462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch shared = handle(summary.AsJavaScript().function()->shared()); 152562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 152662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *target = MessageLocation(Handle<Script>::cast(script), pos, pos + 1, shared); 1527bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return true; 1528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Isolate::ComputeLocationFromException(MessageLocation* target, 1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> exception) { 1532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!exception->IsJSObject()) return false; 1533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> start_pos_symbol = factory()->error_start_pos_symbol(); 1535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> start_pos = JSReceiver::GetDataProperty( 1536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject>::cast(exception), start_pos_symbol); 1537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!start_pos->IsSmi()) return false; 1538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int start_pos_value = Handle<Smi>::cast(start_pos)->value(); 1539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> end_pos_symbol = factory()->error_end_pos_symbol(); 1541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> end_pos = JSReceiver::GetDataProperty( 1542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject>::cast(exception), end_pos_symbol); 1543014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!end_pos->IsSmi()) return false; 1544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_pos_value = Handle<Smi>::cast(end_pos)->value(); 1545014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> script_symbol = factory()->error_script_symbol(); 1547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> script = JSReceiver::GetDataProperty( 1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject>::cast(exception), script_symbol); 1549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!script->IsScript()) return false; 1550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Script> cast_script(Script::cast(*script)); 1552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *target = MessageLocation(cast_script, start_pos_value, end_pos_value); 1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 1554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierbool Isolate::ComputeLocationFromStackTrace(MessageLocation* target, 1558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> exception) { 1559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!exception->IsJSObject()) return false; 1560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Name> key = factory()->stack_trace_symbol(); 1561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> property = 1562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSReceiver::GetDataProperty(Handle<JSObject>::cast(exception), key); 1563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!property->IsJSArray()) return false; 1564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> simple_stack_trace = Handle<JSArray>::cast(property); 1565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1566f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<FrameArray> elements(FrameArray::cast(simple_stack_trace->elements())); 1567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1568f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int frame_count = elements->FrameCount(); 1569f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch for (int i = 0; i < frame_count; i++) { 157062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (elements->IsWasmFrame(i) || elements->IsAsmJsWasmFrame(i)) { 157162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<WasmCompiledModule> compiled_module( 157262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch WasmInstanceObject::cast(elements->WasmInstance(i)) 157362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ->compiled_module()); 157462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int func_index = elements->WasmFunctionIndex(i)->value(); 157562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int code_offset = elements->Offset(i)->value(); 157662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // TODO(wasm): Clean this up (bug 5007). 157762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int pos = code_offset < 0 157862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ? (-1 - code_offset) 157962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch : elements->Code(i)->SourcePosition(code_offset); 158062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (elements->IsAsmJsWasmFrame(i)) { 158162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // For asm.js frames, make an additional translation step to get the 158262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // asm.js source position. 158362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool at_to_number_conversion = 158462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch elements->Flags(i)->value() & FrameArray::kAsmJsAtNumberConversion; 158562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch pos = WasmCompiledModule::GetAsmJsSourcePosition( 158662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch compiled_module, func_index, pos, at_to_number_conversion); 158762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 158862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // For pure wasm, make the function-local position module-relative by 158962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // adding the function offset. 159062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch pos += compiled_module->GetFunctionOffset(func_index); 159162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 159262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Script> script(compiled_module->script()); 159362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 159462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *target = MessageLocation(script, pos, pos + 1); 159562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return true; 1596bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 1597f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1598f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction> fun = handle(elements->Function(i), this); 1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!fun->shared()->IsSubjectToDebugging()) continue; 1600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object* script = fun->shared()->script(); 1602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (script->IsScript() && 160313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch !(Script::cast(script)->source()->IsUndefined(this))) { 1604f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AbstractCode* abstract_code = elements->Code(i); 1605f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int code_offset = elements->Offset(i)->value(); 1606f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch const int pos = abstract_code->SourcePosition(code_offset); 1607f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Script> casted_script(Script::cast(script)); 1609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier *target = MessageLocation(casted_script, pos, pos + 1); 1610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return true; 1611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; 1614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSMessageObject> Isolate::CreateMessage(Handle<Object> exception, 1618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MessageLocation* location) { 1619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> stack_trace_object; 1620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (capture_stack_trace_for_uncaught_exceptions_) { 162113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (exception->IsJSError()) { 1622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // We fetch the stack trace that corresponds to this error object. 1623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // If the lookup fails, the exception is probably not a valid Error 1624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // object. In that case, we fall through and capture the stack trace 1625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // at this throw site. 1626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_trace_object = 1627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier GetDetailedStackTrace(Handle<JSObject>::cast(exception)); 1628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (stack_trace_object.is_null()) { 1630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Not an error object, we capture stack and location at throw site. 1631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_trace_object = CaptureCurrentStackTrace( 1632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_trace_for_uncaught_exceptions_frame_limit_, 1633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_trace_for_uncaught_exceptions_options_); 1634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageLocation computed_location; 1637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (location == NULL && 1638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (ComputeLocationFromException(&computed_location, exception) || 1639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ComputeLocationFromStackTrace(&computed_location, exception) || 1640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ComputeLocation(&computed_location))) { 1641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch location = &computed_location; 1642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1644014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return MessageHandler::MakeMessageObject( 1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch this, MessageTemplate::kUncaughtException, location, exception, 1646014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch stack_trace_object); 1647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1650014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Isolate::IsJavaScriptHandlerOnTop(Object* exception) { 1651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_NE(heap()->the_hole_value(), exception); 1652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For uncatchable exceptions, the JavaScript handler cannot be on top. 1654014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!is_catchable_by_javascript(exception)) return false; 1655257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1656014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Get the top-most JS_ENTRY handler, cannot be on top if it doesn't exist. 1657014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address entry_handler = Isolate::handler(thread_local_top()); 1658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry_handler == nullptr) return false; 1659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1660014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Get the address of the external handler so we can compare the address to 1661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // determine which one is closer to the top of the stack. 1662014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address external_handler = thread_local_top()->try_catch_handler_address(); 1663014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (external_handler == nullptr) return true; 1664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1665014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The exception has been externally caught if and only if there is an 1666014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // external handler which is on top of the top-most JS_ENTRY handler. 1667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note, that finally clauses would re-throw an exception unless it's aborted 1669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // by jumps in control flow (like return, break, etc.) and we'll have another 1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // chance to set proper v8::TryCatch later. 1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (entry_handler < external_handler); 1672014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1675014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Isolate::IsExternalHandlerOnTop(Object* exception) { 1676014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_NE(heap()->the_hole_value(), exception); 1677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Get the address of the external handler so we can compare the address to 1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // determine which one is closer to the top of the stack. 1680014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address external_handler = thread_local_top()->try_catch_handler_address(); 1681014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (external_handler == nullptr) return false; 1682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1683014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For uncatchable exceptions, the external handler is always on top. 1684014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!is_catchable_by_javascript(exception)) return true; 1685257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Get the top-most JS_ENTRY handler, cannot be on top if it doesn't exist. 1687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Address entry_handler = Isolate::handler(thread_local_top()); 1688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (entry_handler == nullptr) return true; 1689257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The exception has been externally caught if and only if there is an 1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // external handler which is on top of the top-most JS_ENTRY handler. 1692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // 1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Note, that finally clauses would re-throw an exception unless it's aborted 1694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // by jumps in control flow (like return, break, etc.) and we'll have another 1695014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // chance to set proper v8::TryCatch later. 1696014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return (entry_handler > external_handler); 1697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::ReportPendingMessages() { 170162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(AllowExceptions::IsAllowed(this)); 170262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1703014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* exception = pending_exception(); 1704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Try to propagate the exception to an external v8::TryCatch handler. If 1706014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // propagation was unsuccessful, then we will get another chance at reporting 1707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // the pending message if the exception is re-thrown. 1708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool has_been_propagated = PropagatePendingExceptionToExternalTryCatch(); 1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!has_been_propagated) return; 1710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Clear the pending message object early to avoid endless recursion. 1712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* message_obj = thread_local_top_.pending_message_obj_; 1713014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch clear_pending_message(); 1714257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // For uncatchable exceptions we do nothing. If needed, the exception and the 1716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // message have already been propagated to v8::TryCatch. 1717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!is_catchable_by_javascript(exception)) return; 1718257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1719014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Determine whether the message needs to be reported to all message handlers 1720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // depending on whether and external v8::TryCatch or an internal JavaScript 1721014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // handler is on top. 1722014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool should_report_exception; 1723014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (IsExternalHandlerOnTop(exception)) { 1724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Only report the exception if the external handler is verbose. 1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch should_report_exception = try_catch_handler()->is_verbose_; 1726014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 1727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Report the exception if it isn't caught by JavaScript code. 1728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch should_report_exception = !IsJavaScriptHandlerOnTop(exception); 1729257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1730257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1731014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Actually report the pending message to all message handlers. 173213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!message_obj->IsTheHole(this) && should_report_exception) { 1733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(this); 1734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSMessageObject> message(JSMessageObject::cast(message_obj), this); 1735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSValue> script_wrapper(JSValue::cast(message->script()), this); 1736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Script> script(Script::cast(script_wrapper->value()), this); 1737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int start_pos = message->start_position(); 1738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_pos = message->end_position(); 1739014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageLocation location(script, start_pos, end_pos); 1740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageHandler::ReportMessage(this, &location, message); 1741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1742257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1743257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1744257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMessageLocation Isolate::GetMessageLocation() { 1746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_pending_exception()); 1747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (thread_local_top_.pending_exception_ != heap()->termination_exception() && 174913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch !thread_local_top_.pending_message_obj_->IsTheHole(this)) { 1750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSMessageObject> message_obj( 1751f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch JSMessageObject::cast(thread_local_top_.pending_message_obj_), this); 1752f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<JSValue> script_wrapper(JSValue::cast(message_obj->script()), this); 1753f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Script> script(Script::cast(script_wrapper->value()), this); 1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int start_pos = message_obj->start_position(); 1755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int end_pos = message_obj->end_position(); 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MessageLocation(script, start_pos, end_pos); 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MessageLocation(); 1760257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1761257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1762257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1763257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbool Isolate::OptionalRescheduleException(bool is_bottom_call) { 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_pending_exception()); 1765257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch PropagatePendingExceptionToExternalTryCatch(); 1766257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_termination_exception = 1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pending_exception() == heap_.termination_exception(); 1769257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Do not reschedule the exception if this is the bottom call. 1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool clear_exception = is_bottom_call; 1772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_termination_exception) { 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_bottom_call) { 1775257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_local_top()->external_caught_exception_ = false; 1776257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch clear_pending_exception(); 1777257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return false; 1778257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (thread_local_top()->external_caught_exception_) { 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the exception is externally caught, clear it if there are no 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // JavaScript frames on the way to the C++ frame that has the 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // external handler. 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(thread_local_top()->try_catch_handler_address() != NULL); 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address external_handler_address = 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->try_catch_handler_address(); 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JavaScriptFrameIterator it(this); 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (it.done() || (it.frame()->sp() > external_handler_address)) { 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_exception = true; 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear the exception if needed. 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (clear_exception) { 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top()->external_caught_exception_ = false; 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch clear_pending_exception(); 1796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 1797257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1798257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Reschedule the exception. 1800257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_local_top()->scheduled_exception_ = pending_exception(); 1801257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch clear_pending_exception(); 1802257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return true; 1803257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1805f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Isolate::PushPromise(Handle<JSObject> promise) { 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadLocalTop* tltop = thread_local_top(); 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev = tltop->promise_on_stack_; 1808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> global_promise = 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject>::cast(global_handles()->Create(*promise)); 1810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch tltop->promise_on_stack_ = new PromiseOnStack(global_promise, prev); 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::PopPromise() { 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadLocalTop* tltop = thread_local_top(); 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (tltop->promise_on_stack_ == NULL) return; 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PromiseOnStack* prev = tltop->promise_on_stack_->prev(); 1818014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> global_promise = tltop->promise_on_stack_->promise(); 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete tltop->promise_on_stack_; 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch tltop->promise_on_stack_ = prev; 1821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch global_handles()->Destroy(global_promise.location()); 1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 182462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace { 182562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool InternalPromiseHasUserDefinedRejectHandler(Isolate* isolate, 182662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSPromise> promise); 182762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 182862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool PromiseHandlerCheck(Isolate* isolate, Handle<JSReceiver> handler, 182962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSReceiver> deferred_promise) { 183062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Recurse to the forwarding Promise, if any. This may be due to 183162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // - await reaction forwarding to the throwaway Promise, which has 183262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // a dependency edge to the outer Promise. 183362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // - PromiseIdResolveHandler forwarding to the output of .then 183462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // - Promise.all/Promise.race forwarding to a throwaway Promise, which 183562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // has a dependency edge to the generated outer Promise. 183662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Otherwise, this is a real reject handler for the Promise. 183762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Symbol> key = isolate->factory()->promise_forwarding_handler_symbol(); 183862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> forwarding_handler = JSReceiver::GetDataProperty(handler, key); 183962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (forwarding_handler->IsUndefined(isolate)) { 184062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return true; 184162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 184262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 184362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (!deferred_promise->IsJSPromise()) { 184462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return true; 184562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 184662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 184762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return InternalPromiseHasUserDefinedRejectHandler( 184862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate, Handle<JSPromise>::cast(deferred_promise)); 184962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 185062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 185162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool InternalPromiseHasUserDefinedRejectHandler(Isolate* isolate, 185262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSPromise> promise) { 185362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // If this promise was marked as being handled by a catch block 185462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // in an async function, then it has a user-defined reject handler. 185562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (promise->handled_hint()) return true; 185662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 185762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // If this Promise is subsumed by another Promise (a Promise resolved 185862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // with another Promise, or an intermediate, hidden, throwaway Promise 185962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // within async/await), then recurse on the outer Promise. 186062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // In this case, the dependency is one possible way that the Promise 186162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // could be resolved, so it does not subsume the other following cases. 186262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Symbol> key = isolate->factory()->promise_handled_by_symbol(); 186362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> outer_promise_obj = JSObject::GetDataProperty(promise, key); 186462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (outer_promise_obj->IsJSPromise() && 186562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch InternalPromiseHasUserDefinedRejectHandler( 186662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate, Handle<JSPromise>::cast(outer_promise_obj))) { 186762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return true; 186862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 186962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 187062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> queue(promise->reject_reactions(), isolate); 187162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> deferred_promise(promise->deferred_promise(), isolate); 187262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 187362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (queue->IsUndefined(isolate)) { 187462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return false; 187562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 187662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 187762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (queue->IsCallable()) { 187862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return PromiseHandlerCheck(isolate, Handle<JSReceiver>::cast(queue), 187962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSReceiver>::cast(deferred_promise)); 188062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 188162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 188262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (queue->IsSymbol()) { 188362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return InternalPromiseHasUserDefinedRejectHandler( 188462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate, Handle<JSPromise>::cast(deferred_promise)); 188562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 188662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 188762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> queue_arr = Handle<FixedArray>::cast(queue); 188862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> deferred_promise_arr = 188962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray>::cast(deferred_promise); 189062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for (int i = 0; i < deferred_promise_arr->length(); i++) { 189162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSReceiver> queue_item(JSReceiver::cast(queue_arr->get(i))); 189262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSReceiver> deferred_promise_item( 189362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch JSReceiver::cast(deferred_promise_arr->get(i))); 189462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (PromiseHandlerCheck(isolate, queue_item, deferred_promise_item)) { 189562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return true; 189662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 189762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 189862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1899f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return false; 1900f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 190262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace 190362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 190462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Isolate::PromiseHasUserDefinedRejectHandler(Handle<Object> promise) { 190562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (!promise->IsJSPromise()) return false; 190662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return InternalPromiseHasUserDefinedRejectHandler( 190762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch this, Handle<JSPromise>::cast(promise)); 190862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 190962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Isolate::GetPromiseOnStackOnThrow() { 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> undefined = factory()->undefined_value(); 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ThreadLocalTop* tltop = thread_local_top(); 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (tltop->promise_on_stack_ == NULL) return undefined; 1914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Find the top-most try-catch or try-finally handler. 1915f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch CatchType prediction = PredictExceptionCatcher(); 1916f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (prediction == NOT_CAUGHT || prediction == CAUGHT_BY_EXTERNAL) { 1917f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return undefined; 1918f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 1919f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> retval = undefined; 1920f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PromiseOnStack* promise_on_stack = tltop->promise_on_stack_; 1921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (JavaScriptFrameIterator it(this); !it.done(); it.Advance()) { 1922f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (PredictException(it.frame())) { 1923f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case HandlerTable::UNCAUGHT: 1924f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch continue; 1925f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case HandlerTable::CAUGHT: 1926f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case HandlerTable::DESUGARING: 192762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (retval->IsJSPromise()) { 1928f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Caught the result of an inner async/await invocation. 1929f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Mark the inner promise as caught in the "synchronous case" so 1930f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // that Debug::OnException will see. In the synchronous case, 1931f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // namely in the code in an async function before the first 1932f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // await, the function which has this exception event has not yet 1933f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // returned, so the generated Promise has not yet been marked 1934f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // by AsyncFunctionAwaitCaught with promiseHandledHintSymbol. 193562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSPromise>::cast(retval)->set_handled_hint(true); 1936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1937f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return retval; 1938f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case HandlerTable::PROMISE: 1939f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return promise_on_stack 1940f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch ? Handle<Object>::cast(promise_on_stack->promise()) 1941f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : undefined; 1942f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch case HandlerTable::ASYNC_AWAIT: { 1943f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // If in the initial portion of async/await, continue the loop to pop up 1944f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // successive async/await stack frames until an asynchronous one with 1945f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // dependents is found, or a non-async stack frame is encountered, in 1946f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // order to handle the synchronous async/await catch prediction case: 1947f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // assume that async function calls are awaited. 1948f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!promise_on_stack) return retval; 1949f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch retval = promise_on_stack->promise(); 1950f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (PromiseHasUserDefinedRejectHandler(retval)) { 1951f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return retval; 1952f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1953f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch promise_on_stack = promise_on_stack->prev(); 1954f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch continue; 1955f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1958f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return retval; 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Isolate::SetCaptureStackTraceForUncaughtExceptions( 1963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool capture, 1964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int frame_limit, 1965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch StackTrace::StackTraceOptions options) { 1966257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch capture_stack_trace_for_uncaught_exceptions_ = capture; 1967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_for_uncaught_exceptions_frame_limit_ = frame_limit; 1968257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch stack_trace_for_uncaught_exceptions_options_ = options; 1969257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1970257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1971257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::SetAbortOnUncaughtExceptionCallback( 1973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::Isolate::AbortOnUncaughtExceptionCallback callback) { 1974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch abort_on_uncaught_exception_callback_ = callback; 1975014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1977014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Context> Isolate::GetCallingNativeContext() { 1979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JavaScriptFrameIterator it(this); 1980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (debug_->in_debug_scope()) { 1981257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch while (!it.done()) { 1982257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch JavaScriptFrame* frame = it.frame(); 1983257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Context* context = Context::cast(frame->context()); 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (context->native_context() == *debug_->debug_context()) { 1985257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch it.Advance(); 1986257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 1987257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch break; 1988257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1989257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1990257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (it.done()) return Handle<Context>::null(); 1992257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch JavaScriptFrame* frame = it.frame(); 1993257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Context* context = Context::cast(frame->context()); 1994f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Handle<Context>(context->native_context(), this); 1995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1996257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1998257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochchar* Isolate::ArchiveThread(char* to) { 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(to, reinterpret_cast<char*>(thread_local_top()), 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sizeof(ThreadLocalTop)); 2001257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch InitializeThreadLocal(); 20023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch clear_pending_exception(); 20033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch clear_pending_message(); 20043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch clear_scheduled_exception(); 2005257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return to + sizeof(ThreadLocalTop); 2006257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2007257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochchar* Isolate::RestoreThread(char* from) { 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(reinterpret_cast<char*>(thread_local_top()), from, 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch sizeof(ThreadLocalTop)); 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This might be just paranoia, but it seems to be needed in case a 2013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// thread_local_top_ is restored on a separate OS thread. 2014257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef USE_SIMULATOR 2015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_local_top()->simulator_ = Simulator::current(this); 2016257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(context() == NULL || context()->IsContext()); 2018257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return from + sizeof(ThreadLocalTop); 2019257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2020257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2021257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 202244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIsolate::ThreadDataTable::ThreadDataTable() 202344f0eee88ff00398ff7f715fab053374d808c90dSteve Block : list_(NULL) { 202444f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 202544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 202644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochIsolate::ThreadDataTable::~ThreadDataTable() { 2028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(svenpanne) The assertion below would fire if an embedder does not 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // cleanly dispose all Isolates before disposing v8, so we are conservative 2030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and leave it out for now. 2031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // DCHECK_NULL(list_); 2032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 203462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::ReleaseManagedObjects() { 203562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate::ManagedObjectFinalizer* current = 203662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch managed_object_finalizers_list_.next_; 203762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch while (current != nullptr) { 203862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate::ManagedObjectFinalizer* next = current->next_; 203962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch current->Dispose(); 204062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch delete current; 204162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch current = next; 204262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 204362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 204462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 204562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochIsolate::ManagedObjectFinalizer* Isolate::RegisterForReleaseAtTeardown( 204662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch void* value, Isolate::ManagedObjectFinalizer::Deleter deleter) { 204762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_NOT_NULL(value); 204862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_NOT_NULL(deleter); 204962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 205062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate::ManagedObjectFinalizer* ret = new Isolate::ManagedObjectFinalizer(); 205162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret->value_ = value; 205262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret->deleter_ = deleter; 205362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Insert at head. We keep the head alive for the lifetime of the Isolate 205462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // because otherwise we can't reset the head, should we delete it before 205562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // the isolate expires 205662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate::ManagedObjectFinalizer* next = managed_object_finalizers_list_.next_; 205762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch managed_object_finalizers_list_.next_ = ret; 205862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret->prev_ = &managed_object_finalizers_list_; 205962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ret->next_ = next; 206062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (next != nullptr) next->prev_ = ret; 206162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return ret; 206262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 206362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 206462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::UnregisterFromReleaseAtTeardown( 206562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate::ManagedObjectFinalizer** finalizer_ptr) { 206662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_NOT_NULL(finalizer_ptr); 206762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Isolate::ManagedObjectFinalizer* finalizer = *finalizer_ptr; 206862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_NOT_NULL(finalizer->prev_); 206962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 207062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch finalizer->prev_->next_ = finalizer->next_; 207162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (finalizer->next_ != nullptr) finalizer->next_->prev_ = finalizer->prev_; 207262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch delete finalizer; 207362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *finalizer_ptr = nullptr; 207462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 2075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochIsolate::PerIsolateThreadData::~PerIsolateThreadData() { 2077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if defined(USE_SIMULATOR) 2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete simulator_; 2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 208344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIsolate::PerIsolateThreadData* 20848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Isolate::ThreadDataTable::Lookup(Isolate* isolate, 20858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId thread_id) { 208644f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (PerIsolateThreadData* data = list_; data != NULL; data = data->next_) { 208744f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (data->Matches(isolate, thread_id)) return data; 208844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 208944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return NULL; 209044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 209144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 209244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 209344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::ThreadDataTable::Insert(Isolate::PerIsolateThreadData* data) { 209444f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (list_ != NULL) list_->prev_ = data; 209544f0eee88ff00398ff7f715fab053374d808c90dSteve Block data->next_ = list_; 209644f0eee88ff00398ff7f715fab053374d808c90dSteve Block list_ = data; 209744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 209844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 209944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 210044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::ThreadDataTable::Remove(PerIsolateThreadData* data) { 210144f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (list_ == data) list_ = data->next_; 210244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (data->next_ != NULL) data->next_->prev_ = data->prev_; 210344f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (data->prev_ != NULL) data->prev_->next_ = data->next_; 210469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch delete data; 210544f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 210644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 210744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 21083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid Isolate::ThreadDataTable::RemoveAllThreads(Isolate* isolate) { 21093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch PerIsolateThreadData* data = list_; 21103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch while (data != NULL) { 21113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch PerIsolateThreadData* next = data->next_; 21123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (data->isolate() == isolate) Remove(data); 21133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch data = next; 21143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 21153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 21163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 21173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 211844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 211944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define TRACE_ISOLATE(tag) \ 212044f0eee88ff00398ff7f715fab053374d808c90dSteve Block do { \ 212144f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (FLAG_trace_isolates) { \ 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("Isolate %p (id %d)" #tag "\n", \ 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<void*>(this), id()); \ 212444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } \ 212544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } while (false) 212644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else 212744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define TRACE_ISOLATE(tag) 212844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 212944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2130f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass VerboseAccountingAllocator : public AccountingAllocator { 2131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public: 2132c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch VerboseAccountingAllocator(Heap* heap, size_t allocation_sample_bytes, 2133c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t pool_sample_bytes) 2134c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch : heap_(heap), 2135c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_memory_usage_(0), 2136c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_pool_size_(0), 2137c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch nesting_deepth_(0), 2138c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch allocation_sample_bytes_(allocation_sample_bytes), 2139c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch pool_sample_bytes_(pool_sample_bytes) {} 2140c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2141c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::internal::Segment* GetSegment(size_t size) override { 2142c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::internal::Segment* memory = AccountingAllocator::GetSegment(size); 2143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (memory) { 2144c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t malloced_current = GetCurrentMemoryUsage(); 2145c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t pooled_current = GetCurrentPoolSize(); 2146c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2147c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (last_memory_usage_.Value() + allocation_sample_bytes_ < 2148c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch malloced_current || 2149c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_pool_size_.Value() + pool_sample_bytes_ < pooled_current) { 2150c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PrintMemoryJSON(malloced_current, pooled_current); 2151c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_memory_usage_.SetValue(malloced_current); 2152c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_pool_size_.SetValue(pooled_current); 2153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return memory; 2156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void ReturnSegment(v8::internal::Segment* memory) override { 2159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch AccountingAllocator::ReturnSegment(memory); 2160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t malloced_current = GetCurrentMemoryUsage(); 2161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t pooled_current = GetCurrentPoolSize(); 2162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2163c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (malloced_current + allocation_sample_bytes_ < 2164c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_memory_usage_.Value() || 2165c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch pooled_current + pool_sample_bytes_ < last_pool_size_.Value()) { 2166c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PrintMemoryJSON(malloced_current, pooled_current); 2167c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_memory_usage_.SetValue(malloced_current); 2168c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch last_pool_size_.SetValue(pooled_current); 2169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2172c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void ZoneCreation(const Zone* zone) override { 2173c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch double time = heap_->isolate()->time_millis_since_init(); 2174c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PrintF( 2175c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "{" 2176c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"type\": \"zonecreation\", " 2177c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"isolate\": \"%p\", " 2178c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"time\": %f, " 2179c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"ptr\": \"%p\", " 2180c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"name\": \"%s\"," 218162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "\"nesting\": %" PRIuS "}\n", 2182c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<void*>(heap_->isolate()), time, 2183c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<const void*>(zone), zone->name(), 2184c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch nesting_deepth_.Value()); 2185c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch nesting_deepth_.Increment(1); 2186c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 2187c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2188c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void ZoneDestruction(const Zone* zone) override { 2189c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch nesting_deepth_.Decrement(1); 2190c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch double time = heap_->isolate()->time_millis_since_init(); 2191c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PrintF( 2192c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "{" 2193c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"type\": \"zonedestruction\", " 2194c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"isolate\": \"%p\", " 2195c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"time\": %f, " 2196c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"ptr\": \"%p\", " 2197c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"name\": \"%s\", " 219862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "\"size\": %" PRIuS 219962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "," 220062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "\"nesting\": %" PRIuS "}\n", 2201c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<void*>(heap_->isolate()), time, 2202c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<const void*>(zone), zone->name(), 2203c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch zone->allocation_size(), nesting_deepth_.Value()); 2204c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 2205c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private: 2207c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch void PrintMemoryJSON(size_t malloced, size_t pooled) { 2208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Note: Neither isolate, nor heap is locked, so be careful with accesses 2209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // as the allocator is potentially used on a concurrent thread. 2210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch double time = heap_->isolate()->time_millis_since_init(); 2211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PrintF( 2212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "{" 2213c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch "\"type\": \"zone\", " 2214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "\"isolate\": \"%p\", " 2215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch "\"time\": %f, " 221662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "\"allocated\": %" PRIuS 221762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "," 221862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch "\"pooled\": %" PRIuS "}\n", 2219c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<void*>(heap_->isolate()), time, malloced, pooled); 2220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Heap* heap_; 2223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch base::AtomicNumber<size_t> last_memory_usage_; 2224c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch base::AtomicNumber<size_t> last_pool_size_; 2225c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch base::AtomicNumber<size_t> nesting_deepth_; 2226c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch size_t allocation_sample_bytes_, pool_sample_bytes_; 2227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}; 2228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierIsolate::Isolate(bool enable_serializer) 2230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : embedder_data_(), 223144f0eee88ff00398ff7f715fab053374d808c90dSteve Block entry_stack_(NULL), 223244f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_trace_nesting_level_(0), 223344f0eee88ff00398ff7f715fab053374d808c90dSteve Block incomplete_message_(NULL), 223444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bootstrapper_(NULL), 223544f0eee88ff00398ff7f715fab053374d808c90dSteve Block runtime_profiler_(NULL), 223644f0eee88ff00398ff7f715fab053374d808c90dSteve Block compilation_cache_(NULL), 223769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch counters_(NULL), 223869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch logger_(NULL), 223969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stats_table_(NULL), 2240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch load_stub_cache_(NULL), 2241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch store_stub_cache_(NULL), 2242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_aging_helper_(NULL), 224344f0eee88ff00398ff7f715fab053374d808c90dSteve Block deoptimizer_data_(NULL), 2244109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch deoptimizer_lazy_throw_(false), 2245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch materialized_object_store_(NULL), 224644f0eee88ff00398ff7f715fab053374d808c90dSteve Block capture_stack_trace_for_uncaught_exceptions_(false), 224744f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_trace_for_uncaught_exceptions_frame_limit_(0), 224844f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_trace_for_uncaught_exceptions_options_(StackTrace::kOverview), 224944f0eee88ff00398ff7f715fab053374d808c90dSteve Block context_slot_cache_(NULL), 225044f0eee88ff00398ff7f715fab053374d808c90dSteve Block descriptor_lookup_cache_(NULL), 225144f0eee88ff00398ff7f715fab053374d808c90dSteve Block handle_scope_implementer_(NULL), 22528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch unicode_cache_(NULL), 2253c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch allocator_(FLAG_trace_gc_object_stats ? new VerboseAccountingAllocator( 2254c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch &heap_, 256 * KB, 128 * KB) 2255c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch : new AccountingAllocator()), 22563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inner_pointer_to_code_cache_(NULL), 225744f0eee88ff00398ff7f715fab053374d808c90dSteve Block global_handles_(NULL), 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch eternal_handles_(NULL), 225944f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_manager_(NULL), 226044f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_stack_(NULL), 22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch date_cache_(NULL), 2262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_descriptor_data_(NULL), 2263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(bmeurer) Initialized lazily because it depends on flags; can 2264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // be fixed once the default isolate cleanup is done. 2265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch random_number_generator_(NULL), 2266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch rail_mode_(PERFORMANCE_ANIMATION), 226762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_hook_or_debug_is_active_(false), 226862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_hook_(NULL), 226962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch load_start_time_ms_(0), 2270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier serializer_enabled_(enable_serializer), 2271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_fatal_error_(false), 2272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch initialized_from_snapshot_(false), 22733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch is_tail_call_elimination_enabled_(true), 2274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch is_isolate_in_background_(false), 2275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cpu_profiler_(NULL), 2276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap_profiler_(NULL), 227713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch code_event_dispatcher_(new CodeEventDispatcher()), 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function_entry_hook_(NULL), 2279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred_handles_head_(NULL), 2280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch optimizing_compile_dispatcher_(NULL), 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stress_deopt_count_(0), 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_optimization_id_(0), 2283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 2284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next_unique_sfi_id_(0), 2285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 2286bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch is_running_microtasks_(false), 2287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier use_counter_callback_(NULL), 2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch basic_block_profiler_(NULL), 2289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch cancelable_task_manager_(new CancelableTaskManager()), 229062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch abort_on_uncaught_exception_callback_(NULL), 229162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch total_regexp_code_generated_(0) { 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 2294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK(thread_data_table_); 2295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch id_ = base::NoBarrier_AtomicIncrement(&isolate_counter_, 1); 229744f0eee88ff00398ff7f715fab053374d808c90dSteve Block TRACE_ISOLATE(constructor); 229844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 229944f0eee88ff00398ff7f715fab053374d808c90dSteve Block memset(isolate_addresses_, 0, 2300589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch sizeof(isolate_addresses_[0]) * (kIsolateAddressCount + 1)); 230144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 230244f0eee88ff00398ff7f715fab053374d808c90dSteve Block heap_.isolate_ = this; 230344f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_guard_.isolate_ = this; 230444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // ThreadManager is initialized early to support locking an isolate 2306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // before it is entered. 2307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_manager_ = new ThreadManager(); 2308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_manager_->isolate_ = this; 2309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 231044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 231144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // heap_histograms_ initializes itself. 231244f0eee88ff00398ff7f715fab053374d808c90dSteve Block memset(&js_spill_information_, 0, sizeof(js_spill_information_)); 231344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 231444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 231544f0eee88ff00398ff7f715fab053374d808c90dSteve Block handle_scope_data_.Initialize(); 231644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 231744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_EXECUTE(type, name, initial_value) \ 231844f0eee88ff00398ff7f715fab053374d808c90dSteve Block name##_ = (initial_value); 231944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_LIST(ISOLATE_INIT_EXECUTE) 232044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_INIT_EXECUTE 232144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 232244f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_INIT_ARRAY_EXECUTE(type, name, length) \ 232344f0eee88ff00398ff7f715fab053374d808c90dSteve Block memset(name##_, 0, sizeof(type) * length); 232444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ISOLATE_INIT_ARRAY_LIST(ISOLATE_INIT_ARRAY_EXECUTE) 232544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_INIT_ARRAY_EXECUTE 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InitializeLoggingAndCounters(); 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch debug_ = new Debug(this); 2329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch init_memcopy_functions(this); 233144f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 233244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 233444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::TearDown() { 233544f0eee88ff00398ff7f715fab053374d808c90dSteve Block TRACE_ISOLATE(tear_down); 233644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 233744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Temporarily set this isolate as current so that various parts of 233844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // the isolate can access it in their destructors without having a 233944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // direct pointer. We don't use Enter/Exit here to avoid 234044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // initializing the thread data. 234144f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData(); 2342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(base::NoBarrier_Load(&isolate_key_created_) == 1); 2343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* saved_isolate = 2344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch reinterpret_cast<Isolate*>(base::Thread::GetThreadLocal(isolate_key_)); 234544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetIsolateThreadLocals(this, NULL); 234644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 234744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Deinit(); 234844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 235185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch thread_data_table_->RemoveAllThreads(this); 23523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 23533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete this; 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 235644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Restore the previous current isolate. 235744f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetIsolateThreadLocals(saved_isolate, saved_data); 235844f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 235944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 236044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::GlobalTearDown() { 2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete thread_data_table_; 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_data_table_ = NULL; 2364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::ClearSerializerData() { 2368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch delete external_reference_table_; 2369014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch external_reference_table_ = NULL; 2370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch delete external_reference_map_; 2371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch external_reference_map_ = NULL; 2372014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 237544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::Deinit() { 2376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TRACE_ISOLATE(deinit); 237744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier debug()->Unload(); 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FreeThreadResources(); 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (concurrent_recompilation_enabled()) { 2383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch optimizing_compile_dispatcher_->Stop(); 2384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch delete optimizing_compile_dispatcher_; 2385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch optimizing_compile_dispatcher_ = NULL; 2386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 238862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap_.mark_compact_collector()->EnsureSweepingCompleted(); 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DumpAndResetCompilationStats(); 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FLAG_print_deopt_stress) { 2393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier PrintF(stdout, "=== Stress deopt counter: %u\n", stress_deopt_count_); 2394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (cpu_profiler_) { 2397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch cpu_profiler_->DeleteAllProfiles(); 2398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // We must stop the logger before we tear down other components. 240113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch sampler::Sampler* sampler = logger_->sampler(); 2402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (sampler && sampler->IsActive()) sampler->Stop(); 240344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete deoptimizer_data_; 2405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier deoptimizer_data_ = NULL; 2406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier builtins_.TearDown(); 2407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bootstrapper_->TearDown(); 240844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (runtime_profiler_ != NULL) { 2410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete runtime_profiler_; 2411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier runtime_profiler_ = NULL; 2412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 241344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete basic_block_profiler_; 2415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier basic_block_profiler_ = NULL; 241644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2417109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch delete heap_profiler_; 2418109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch heap_profiler_ = NULL; 2419109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 242062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch compiler_dispatcher_->AbortAll(CompilerDispatcher::BlockingBehavior::kBlock); 242162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch delete compiler_dispatcher_; 242262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch compiler_dispatcher_ = nullptr; 242362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2424c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch cancelable_task_manager()->CancelAndWait(); 2425c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier heap_.TearDown(); 2427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier logger_->TearDown(); 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2429109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch delete interpreter_; 2430109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch interpreter_ = NULL; 2431109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 243262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch delete ast_string_constants_; 243362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ast_string_constants_ = nullptr; 2434014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete cpu_profiler_; 2436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier cpu_profiler_ = NULL; 243744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 243813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch code_event_dispatcher_.reset(); 243913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 2440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch delete root_index_map_; 2441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch root_index_map_ = NULL; 244244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ClearSerializerData(); 244462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ReleaseManagedObjects(); 2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 244844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::SetIsolateThreadLocals(Isolate* isolate, 244944f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* data) { 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::SetThreadLocal(isolate_key_, isolate); 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::Thread::SetThreadLocal(per_isolate_thread_data_key_, data); 245244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 245344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 245444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 245544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIsolate::~Isolate() { 245644f0eee88ff00398ff7f715fab053374d808c90dSteve Block TRACE_ISOLATE(destructor); 245744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The entry stack must be empty when we get here. 2459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entry_stack_ == NULL || entry_stack_->previous_item == NULL); 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete entry_stack_; 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch entry_stack_ = NULL; 246369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 24648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch delete unicode_cache_; 24658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch unicode_cache_ = NULL; 246644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 24673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch delete date_cache_; 24683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch date_cache_ = NULL; 24693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete[] call_descriptor_data_; 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_descriptor_data_ = NULL; 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2473c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch delete access_compiler_data_; 2474c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch access_compiler_data_ = NULL; 2475c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 247644f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete regexp_stack_; 247744f0eee88ff00398ff7f715fab053374d808c90dSteve Block regexp_stack_ = NULL; 247844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 247944f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete descriptor_lookup_cache_; 248044f0eee88ff00398ff7f715fab053374d808c90dSteve Block descriptor_lookup_cache_ = NULL; 248144f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete context_slot_cache_; 248244f0eee88ff00398ff7f715fab053374d808c90dSteve Block context_slot_cache_ = NULL; 248344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2484f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch delete load_stub_cache_; 2485f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch load_stub_cache_ = NULL; 2486f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch delete store_stub_cache_; 2487f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch store_stub_cache_ = NULL; 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete code_aging_helper_; 2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code_aging_helper_ = NULL; 249044f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete stats_table_; 249144f0eee88ff00398ff7f715fab053374d808c90dSteve Block stats_table_ = NULL; 249244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete materialized_object_store_; 2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch materialized_object_store_ = NULL; 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 249644f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete logger_; 249744f0eee88ff00398ff7f715fab053374d808c90dSteve Block logger_ = NULL; 249844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 249944f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete counters_; 250044f0eee88ff00398ff7f715fab053374d808c90dSteve Block counters_ = NULL; 250144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 250244f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete handle_scope_implementer_; 250344f0eee88ff00398ff7f715fab053374d808c90dSteve Block handle_scope_implementer_ = NULL; 250444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2505014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch delete code_tracer(); 2506014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch set_code_tracer(NULL); 2507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 250844f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete compilation_cache_; 250944f0eee88ff00398ff7f715fab053374d808c90dSteve Block compilation_cache_ = NULL; 251044f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete bootstrapper_; 251144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bootstrapper_ = NULL; 25123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch delete inner_pointer_to_code_cache_; 25133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inner_pointer_to_code_cache_ = NULL; 251444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 251544f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete thread_manager_; 251644f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_manager_ = NULL; 251744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 251844f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete global_handles_; 251944f0eee88ff00398ff7f715fab053374d808c90dSteve Block global_handles_ = NULL; 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete eternal_handles_; 2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch eternal_handles_ = NULL; 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete string_stream_debug_object_cache_; 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch string_stream_debug_object_cache_ = NULL; 252544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete random_number_generator_; 2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch random_number_generator_ = NULL; 2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252944f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete debug_; 253044f0eee88ff00398ff7f715fab053374d808c90dSteve Block debug_ = NULL; 2531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch delete cancelable_task_manager_; 2533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch cancelable_task_manager_ = nullptr; 2534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2535f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch delete allocator_; 2536f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch allocator_ = nullptr; 2537f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if USE_SIMULATOR 2539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Simulator::TearDown(simulator_i_cache_, simulator_redirection_); 2540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch simulator_i_cache_ = nullptr; 2541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch simulator_redirection_ = nullptr; 2542014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 254344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 254444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 254544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 254644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::InitializeThreadLocal() { 2547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch thread_local_top_.isolate_ = this; 254844f0eee88ff00398ff7f715fab053374d808c90dSteve Block thread_local_top_.Initialize(); 254944f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 255044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 255144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Isolate::PropagatePendingExceptionToExternalTryCatch() { 2553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* exception = pending_exception(); 25548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (IsJavaScriptHandlerOnTop(exception)) { 2556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top_.external_caught_exception_ = false; 2557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return false; 2558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 25598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2560014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!IsExternalHandlerOnTop(exception)) { 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top_.external_caught_exception_ = false; 2562014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return true; 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 25648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch thread_local_top_.external_caught_exception_ = true; 2566014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!is_catchable_by_javascript(exception)) { 25678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch try_catch_handler()->can_continue_ = false; 2568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch try_catch_handler()->has_terminated_ = true; 25698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch try_catch_handler()->exception_ = heap()->null_value(); 25708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } else { 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::TryCatch* handler = try_catch_handler(); 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(thread_local_top_.pending_message_obj_->IsJSMessageObject() || 257313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch thread_local_top_.pending_message_obj_->IsTheHole(this)); 2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch handler->can_continue_ = true; 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch handler->has_terminated_ = false; 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch handler->exception_ = pending_exception(); 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Propagate to the external try-catch only if we got an actual message. 257813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (thread_local_top_.pending_message_obj_->IsTheHole(this)) return true; 2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch handler->message_obj_ = thread_local_top_.pending_message_obj_; 25818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 25838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 25848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 25858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 258669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Isolate::InitializeLoggingAndCounters() { 258769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (logger_ == NULL) { 2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch logger_ = new Logger(this); 258969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 259069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (counters_ == NULL) { 2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch counters_ = new Counters(this); 259269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 259369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 259469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 259569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 259644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool Isolate::Init(Deserializer* des) { 259744f0eee88ff00398ff7f715fab053374d808c90dSteve Block TRACE_ISOLATE(init); 259844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch stress_deopt_count_ = FLAG_deopt_every_n_times; 260044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_fatal_error_ = false; 260269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (function_entry_hook() != NULL) { 2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When function entry hooking is in effect, we have to create the code 2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // stubs from scratch to get entry hooks, rather than loading the previously 2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // generated stubs from disk. 2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If this assert fires, the initialization path has regressed. 2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(des == NULL); 2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The initialization process does not handle memory exhaustion. 2612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AlwaysAllocateScope always_allocate(this); 261369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Safe after setting Heap::isolate_, and initializing StackGuard 261569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch heap_.SetStackLimits(); 261669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2617589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define ASSIGN_ELEMENT(CamelName, hacker_name) \ 2618589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch isolate_addresses_[Isolate::k##CamelName##Address] = \ 2619589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch reinterpret_cast<Address>(hacker_name##_address()); 2620589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch FOR_EACH_ISOLATE_ADDRESS_NAME(ASSIGN_ELEMENT) 2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef ASSIGN_ELEMENT 262269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 262369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch compilation_cache_ = new CompilationCache(this); 262469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch context_slot_cache_ = new ContextSlotCache(); 262569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch descriptor_lookup_cache_ = new DescriptorLookupCache(); 262669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch unicode_cache_ = new UnicodeCache(); 26273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch inner_pointer_to_code_cache_ = new InnerPointerToCodeCache(this); 262869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch global_handles_ = new GlobalHandles(this); 2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch eternal_handles_ = new EternalHandles(); 2630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bootstrapper_ = new Bootstrapper(this); 263169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch handle_scope_implementer_ = new HandleScopeImplementer(this); 2632f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch load_stub_cache_ = new StubCache(this, Code::LOAD_IC); 2633f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch store_stub_cache_ = new StubCache(this, Code::STORE_IC); 2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch materialized_object_store_ = new MaterializedObjectStore(this); 263569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch regexp_stack_ = new RegExpStack(); 263669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch regexp_stack_->isolate_ = this; 26373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch date_cache_ = new DateCache(); 2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_descriptor_data_ = 2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new CallInterfaceDescriptorData[CallDescriptors::NUMBER_OF_DESCRIPTORS]; 2640c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch access_compiler_data_ = new AccessCompilerData(); 2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cpu_profiler_ = new CpuProfiler(this); 2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap_profiler_ = new HeapProfiler(heap()); 2643014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch interpreter_ = new interpreter::Interpreter(this); 264462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch compiler_dispatcher_ = 264562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch new CompilerDispatcher(this, V8::GetCurrentPlatform(), FLAG_stack_size); 264644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 264744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Enable logging before setting up the heap 2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch logger_->SetUp(this); 264944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 265044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Initialize other runtime facilities 265144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#if defined(USE_SIMULATOR) 2652014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS || \ 26533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch V8_TARGET_ARCH_MIPS64 || V8_TARGET_ARCH_PPC || V8_TARGET_ARCH_S390 2654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Simulator::Initialize(this); 265544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 265644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 265744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch code_aging_helper_ = new CodeAgingHelper(this); 2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 266044f0eee88ff00398ff7f715fab053374d808c90dSteve Block { // NOLINT 266144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Ensure that the thread has a valid stack guard. The v8::Locker object 266244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // will ensure this too, but we don't have to use lockers if we are only 266344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // using one thread. 266444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExecutionAccess lock(this); 266544f0eee88ff00398ff7f715fab053374d808c90dSteve Block stack_guard_.InitThread(lock); 266644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 266744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 26683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // SetUp the object heap. 2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!heap_.HasBeenSetUp()); 2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!heap_.SetUp()) { 2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::FatalProcessOutOfMemory("heap setup"); 2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 2673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2675f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Initialize the interface descriptors ahead of time. 2676f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define INTERFACE_DESCRIPTOR(V) \ 2677f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch { V##Descriptor(this); } 2678f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch INTERFACE_DESCRIPTOR_LIST(INTERFACE_DESCRIPTOR) 2679f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef INTERFACE_DESCRIPTOR 2680f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2681bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch deoptimizer_data_ = new DeoptimizerData(heap()->memory_allocator()); 2682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 268369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch const bool create_heap_objects = (des == NULL); 2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (create_heap_objects && !heap_.CreateHeapObjects()) { 2685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V8::FatalProcessOutOfMemory("heap object creation"); 268644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 268744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 268844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (create_heap_objects) { 26903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // Terminate the partial snapshot cache so we can iterate. 2691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch partial_snapshot_cache_.Add(heap_.undefined_value()); 2692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 26943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch InitializeThreadLocal(); 26953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 269644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bootstrapper_->Initialize(create_heap_objects); 2697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch builtins_.SetUp(this, create_heap_objects); 269862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (create_heap_objects) heap_.CreateFixedStubs(); 269944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_log_internal_timer_events) { 2701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier set_event_logger(Logger::DefaultEventLoggerSentinel); 270244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 270344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2704bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (FLAG_trace_hydrogen || FLAG_trace_hydrogen_stubs || FLAG_trace_turbo || 2705bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch FLAG_trace_turbo_graph) { 2706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("Concurrent recompilation has been disabled for tracing.\n"); 2707014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (OptimizingCompileDispatcher::Enabled()) { 2708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch optimizing_compile_dispatcher_ = new OptimizingCompileDispatcher(this); 2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Initialize runtime profiler before deserialization, because collections may 2712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // occur, clearing/updating ICs. 2713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier runtime_profiler_ = new RuntimeProfiler(this); 271444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 271544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // If we are deserializing, read the state into the now-empty heap. 2716f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch { 2717f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch AlwaysAllocateScope always_allocate(this); 2718f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2719f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!create_heap_objects) { 2720f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch des->Deserialize(this); 2721f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 2722f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch load_stub_cache_->Initialize(); 2723f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch store_stub_cache_->Initialize(); 2724c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch interpreter_->Initialize(); 2725f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 2726f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch heap_.NotifyDeserializationComplete(); 2727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 27293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Finish initialization of ThreadLocal after deserialization is done. 27303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch clear_pending_exception(); 27313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch clear_pending_message(); 27323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch clear_scheduled_exception(); 2733592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 273444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Deserializing may put strange things in the root array's copy of the 273544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // stack guard. 273644f0eee88ff00398ff7f715fab053374d808c90dSteve Block heap_.SetStackLimits(); 273744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2738db1b4389239a7132c9cde0915dbd3f775dc1027aBen Murdoch // Quiet the heap NaN if needed on target platform. 2739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!create_heap_objects) Assembler::QuietNaN(heap_.nan_value()); 2740db1b4389239a7132c9cde0915dbd3f775dc1027aBen Murdoch 2741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FLAG_trace_turbo) { 2742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Create an empty file. 2743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::ofstream(GetTurboCfgFileName().c_str(), std::ios_base::trunc); 2744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 274544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, embedder_data_)), 2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Internals::kIsolateEmbedderDataOffset); 2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, heap_.roots_)), 2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Internals::kIsolateRootsOffset); 275013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, heap_.external_memory_)), 275113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Internals::kExternalMemoryOffset); 275213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, heap_.external_memory_limit_)), 275313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Internals::kExternalMemoryLimitOffset); 2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch time_millis_at_init_ = heap_.MonotonicallyIncreasingTimeInMs(); 2756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 275762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch { 275862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch HandleScope scope(this); 275962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ast_string_constants_ = new AstStringConstants(this, heap()->HashSeed()); 276062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 276162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!create_heap_objects) { 2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Now that the heap is consistent, it's OK to generate the code for the 2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // deopt entry table that might have been referred to by optimized code in 2765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the snapshot. 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(this); 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Deoptimizer::EnsureCodeForDeoptimizationEntry( 27683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch this, Deoptimizer::LAZY, 27693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch ExternalReferenceTable::kDeoptTableSerializeEntryCount - 1); 2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!serializer_enabled()) { 2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ensure that all stubs which need to be generated ahead of time, but 2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // cannot be serialized into the snapshot have been generated. 2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(this); 2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeStub::GenerateFPStubs(this); 2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(this); 2778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StubFailureTrampolineStub::GenerateAheadOfTime(this); 2779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch initialized_from_snapshot_ = (des != NULL); 2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!FLAG_inline_new) heap_.DisableInlineAllocation(); 2784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 278544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return true; 278644f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 278744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 278844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 278969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// Initialized lazily to allow early 279069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch// v8::V8::SetAddHistogramSampleFunction calls. 279169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochStatsTable* Isolate::stats_table() { 279269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (stats_table_ == NULL) { 279369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch stats_table_ = new StatsTable; 279469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 279569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return stats_table_; 279669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 279769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 279869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 279944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::Enter() { 280044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* current_isolate = NULL; 280144f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* current_data = CurrentPerIsolateThreadData(); 280244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (current_data != NULL) { 280344f0eee88ff00398ff7f715fab053374d808c90dSteve Block current_isolate = current_data->isolate_; 2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(current_isolate != NULL); 280544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (current_isolate == this) { 2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Current() == this); 2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entry_stack_ != NULL); 2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entry_stack_->previous_thread_data == NULL || 28098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch entry_stack_->previous_thread_data->thread_id().Equals( 28108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId::Current())); 281144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Same thread re-enters the isolate, no need to re-init anything. 281244f0eee88ff00398ff7f715fab053374d808c90dSteve Block entry_stack_->entry_count++; 281344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return; 281444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 281544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 281644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 281744f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* data = FindOrAllocatePerThreadDataForThisThread(); 2818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(data != NULL); 2819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(data->isolate_ == this); 282044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 282144f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* item = new EntryStackItem(current_data, 282244f0eee88ff00398ff7f715fab053374d808c90dSteve Block current_isolate, 282344f0eee88ff00398ff7f715fab053374d808c90dSteve Block entry_stack_); 282444f0eee88ff00398ff7f715fab053374d808c90dSteve Block entry_stack_ = item; 282544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 282644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetIsolateThreadLocals(this, data); 282744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 282844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // In case it's the first time some thread enters the isolate. 282944f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_thread_id(data->thread_id()); 283044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 283144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 283244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 283344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Isolate::Exit() { 2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entry_stack_ != NULL); 2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(entry_stack_->previous_thread_data == NULL || 28368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch entry_stack_->previous_thread_data->thread_id().Equals( 28378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch ThreadId::Current())); 283844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 283944f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (--entry_stack_->entry_count > 0) return; 284044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(CurrentPerIsolateThreadData() != NULL); 2842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(CurrentPerIsolateThreadData()->isolate_ == this); 284344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 284444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Pop the stack. 284544f0eee88ff00398ff7f715fab053374d808c90dSteve Block EntryStackItem* item = entry_stack_; 284644f0eee88ff00398ff7f715fab053374d808c90dSteve Block entry_stack_ = item->previous_item; 284744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 284844f0eee88ff00398ff7f715fab053374d808c90dSteve Block PerIsolateThreadData* previous_thread_data = item->previous_thread_data; 284944f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* previous_isolate = item->previous_isolate; 285044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 285144f0eee88ff00398ff7f715fab053374d808c90dSteve Block delete item; 285244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 285344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Reinit the current thread for the isolate it was running before this one. 285444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetIsolateThreadLocals(previous_isolate, previous_thread_data); 285544f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 285644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 285744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::LinkDeferredHandles(DeferredHandles* deferred) { 2859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred->next_ = deferred_handles_head_; 2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (deferred_handles_head_ != NULL) { 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred_handles_head_->previous_ = deferred; 2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred_handles_head_ = deferred; 2864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::UnlinkDeferredHandles(DeferredHandles* deferred) { 2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In debug mode assert that the linked list is well-formed. 2870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeferredHandles* deferred_iterator = deferred; 2871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (deferred_iterator->previous_ != NULL) { 2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred_iterator = deferred_iterator->previous_; 2873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(deferred_handles_head_ == deferred_iterator); 2875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 2876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (deferred_handles_head_ == deferred) { 2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred_handles_head_ = deferred_handles_head_->next_; 2878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (deferred->next_ != NULL) { 2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred->next_->previous_ = deferred->previous_; 2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (deferred->previous_ != NULL) { 2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch deferred->previous_->next_ = deferred->next_; 2884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Isolate::DumpAndResetCompilationStats() { 2889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (turbo_statistics() != nullptr) { 289013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(FLAG_turbo_stats || FLAG_turbo_stats_nvp); 289113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 2892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier OFStream os(stdout); 289313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (FLAG_turbo_stats) { 289413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch AsPrintableStatistics ps = {*turbo_statistics(), false}; 289513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch os << ps << std::endl; 289613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 289713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (FLAG_turbo_stats_nvp) { 289813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch AsPrintableStatistics ps = {*turbo_statistics(), true}; 289913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch os << ps << std::endl; 290013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 2901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (hstatistics() != nullptr) hstatistics()->Print(); 2903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete turbo_statistics_; 2904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier turbo_statistics_ = nullptr; 2905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier delete hstatistics_; 2906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier hstatistics_ = nullptr; 2907c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (V8_UNLIKELY(FLAG_runtime_stats == 2908c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE)) { 2909109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch OFStream os(stdout); 2910109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch counters()->runtime_call_stats()->Print(os); 2911109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch counters()->runtime_call_stats()->Reset(); 2912109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 2913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHStatistics* Isolate::GetHStatistics() { 2917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (hstatistics() == NULL) set_hstatistics(new HStatistics()); 2918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return hstatistics(); 2919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierCompilationStatistics* Isolate::GetTurboStatistics() { 2923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (turbo_statistics() == NULL) 2924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier set_turbo_statistics(new CompilationStatistics()); 2925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return turbo_statistics(); 2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHTracer* Isolate::GetHTracer() { 2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (htracer() == NULL) set_htracer(new HTracer(id())); 2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return htracer(); 2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCodeTracer* Isolate::GetCodeTracer() { 2936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (code_tracer() == NULL) set_code_tracer(new CodeTracer(id())); 2937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return code_tracer(); 2938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochMap* Isolate::get_initial_js_array_map(ElementsKind kind) { 2941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (IsFastElementsKind(kind)) { 2942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DisallowHeapAllocation no_gc; 29433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Object* const initial_js_array_map = 29443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch context()->native_context()->get(Context::ArrayMapIndex(kind)); 294513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!initial_js_array_map->IsUndefined(this)) { 2946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Map::cast(initial_js_array_map); 2947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return nullptr; 2950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 295262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Isolate::use_crankshaft() { 295362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return FLAG_opt && FLAG_crankshaft && !serializer_enabled_ && 295462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CpuFeatures::SupportsCrankshaft() && !IsCodeCoverageEnabled(); 295562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 295662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 295762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Isolate::NeedsSourcePositionsForProfiling() const { 295862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return FLAG_trace_deopt || FLAG_trace_turbo || FLAG_trace_turbo_graph || 295962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FLAG_turbo_profiling || FLAG_perf_prof || is_profiling() || 296062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch debug_->is_active() || logger_->is_logging(); 296162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 296262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 296362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochbool Isolate::IsCodeCoverageEnabled() { 296462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return heap()->code_coverage_list()->IsArrayList(); 296562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 2966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 296762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::SetCodeCoverageList(Object* value) { 296862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(value->IsUndefined(this) || value->IsArrayList()); 296962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()->set_code_coverage_list(value); 2970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2972bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool Isolate::IsArrayOrObjectPrototype(Object* object) { 2973bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Object* context = heap()->native_contexts_list(); 297413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch while (!context->IsUndefined(this)) { 2975bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Context* current_context = Context::cast(context); 2976bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (current_context->initial_object_prototype() == object || 2977bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch current_context->initial_array_prototype() == object) { 2978bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return true; 2979bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 2980bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch context = current_context->next_context_link(); 2981bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 2982bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return false; 2983bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 2984bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 298562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::ClearOSROptimizedCode() { 298662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DisallowHeapAllocation no_gc; 298762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Object* context = heap()->native_contexts_list(); 298862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch while (!context->IsUndefined(this)) { 298962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Context* current_context = Context::cast(context); 299062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch current_context->ClearOptimizedCodeMap(); 299162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch context = current_context->next_context_link(); 299262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 299362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 299462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 299562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::EvictOSROptimizedCode(Code* code, const char* reason) { 299662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DisallowHeapAllocation no_gc; 299762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Object* context = heap()->native_contexts_list(); 299862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch while (!context->IsUndefined(this)) { 299962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Context* current_context = Context::cast(context); 300062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch current_context->EvictFromOptimizedCodeMap(code, reason); 300162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch context = current_context->next_context_link(); 300262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 300362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 300462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3005bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool Isolate::IsInAnyContext(Object* object, uint32_t index) { 3006bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DisallowHeapAllocation no_gc; 3007bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Object* context = heap()->native_contexts_list(); 300813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch while (!context->IsUndefined(this)) { 3009bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Context* current_context = Context::cast(context); 3010bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (current_context->get(index) == object) { 3011bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return true; 3012bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 3013bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch context = current_context->next_context_link(); 3014bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 3015bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return false; 3016bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Isolate::IsFastArrayConstructorPrototypeChainIntact() { 3019014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyCell* no_elements_cell = heap()->array_protector(); 3020014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool cell_reports_intact = 3021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch no_elements_cell->value()->IsSmi() && 3022c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Smi::cast(no_elements_cell->value())->value() == kProtectorValid; 3023014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3024014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG 3025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map* root_array_map = 3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch get_initial_js_array_map(GetInitialFastElementsKind()); 3027014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* native_context = context()->native_context(); 3028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSObject* initial_array_proto = JSObject::cast( 3029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch native_context->get(Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); 3030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSObject* initial_object_proto = JSObject::cast( 3031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch native_context->get(Context::INITIAL_OBJECT_PROTOTYPE_INDEX)); 3032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (root_array_map == NULL || initial_array_proto == initial_object_proto) { 3034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We are in the bootstrapping process, and the entire check sequence 3035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // shouldn't be performed. 3036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the array prototype hasn't been altered WRT empty elements. 3040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (root_array_map->prototype() != initial_array_proto) { 3041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(false, cell_reports_intact); 3042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FixedArrayBase* elements = initial_array_proto->elements(); 3046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (elements != heap()->empty_fixed_array() && 3047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch elements != heap()->empty_slow_element_dictionary()) { 3048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(false, cell_reports_intact); 3049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the object prototype hasn't been altered WRT empty elements. 3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrototypeIterator iter(this, initial_array_proto); 3054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (iter.IsAtEnd() || iter.GetCurrent() != initial_object_proto) { 3055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(false, cell_reports_intact); 3056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch elements = initial_object_proto->elements(); 3060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (elements != heap()->empty_fixed_array() && 3061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch elements != heap()->empty_slow_element_dictionary()) { 3062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(false, cell_reports_intact); 3063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch iter.Advance(); 3067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!iter.IsAtEnd()) { 3068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(false, cell_reports_intact); 3069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3072014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif 3073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3074014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return cell_reports_intact; 3075014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3076014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3077bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochbool Isolate::IsIsConcatSpreadableLookupChainIntact() { 3078bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Cell* is_concat_spreadable_cell = heap()->is_concat_spreadable_protector(); 3079bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch bool is_is_concat_spreadable_set = 3080bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Smi::cast(is_concat_spreadable_cell->value())->value() == 3081c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch kProtectorInvalid; 3082bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#ifdef DEBUG 3083bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Map* root_array_map = get_initial_js_array_map(GetInitialFastElementsKind()); 3084bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (root_array_map == NULL) { 3085bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Ignore the value of is_concat_spreadable during bootstrap. 3086bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return !is_is_concat_spreadable_set; 3087bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 3088bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Object> array_prototype(array_function()->prototype(), this); 3089bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Symbol> key = factory()->is_concat_spreadable_symbol(); 3090bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Object> value; 3091bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LookupIterator it(array_prototype, key); 309213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (it.IsFound() && !JSReceiver::GetDataProperty(&it)->IsUndefined(this)) { 3093bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // TODO(cbruni): Currently we do not revert if we unset the 3094bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // @@isConcatSpreadable property on Array.prototype or Object.prototype 3095bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // hence the reverse implication doesn't hold. 3096bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(is_is_concat_spreadable_set); 3097bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return false; 3098bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 3099bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#endif // DEBUG 3100bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 3101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return !is_is_concat_spreadable_set; 3102109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 3103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochbool Isolate::IsIsConcatSpreadableLookupChainIntact(JSReceiver* receiver) { 3105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!IsIsConcatSpreadableLookupChainIntact()) return false; 3106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return !receiver->HasProxyInPrototype(this); 3107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 3108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::UpdateArrayProtectorOnSetElement(Handle<JSObject> object) { 3110109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch DisallowHeapAllocation no_gc; 3111bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!object->map()->is_prototype_map()) return; 3112bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!IsFastArrayConstructorPrototypeChainIntact()) return; 3113bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch if (!IsArrayOrObjectPrototype(*object)) return; 3114bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch PropertyCell::SetValueWithInvalidation( 3115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch factory()->array_protector(), 3116c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch handle(Smi::FromInt(kProtectorInvalid), this)); 3117bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 3118bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 3119bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Isolate::InvalidateIsConcatSpreadableProtector() { 3120bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(factory()->is_concat_spreadable_protector()->value()->IsSmi()); 3121bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(IsIsConcatSpreadableLookupChainIntact()); 3122bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch factory()->is_concat_spreadable_protector()->set_value( 3123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Smi::FromInt(kProtectorInvalid)); 3124bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(!IsIsConcatSpreadableLookupChainIntact()); 3125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3127bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochvoid Isolate::InvalidateArraySpeciesProtector() { 3128bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(factory()->species_protector()->value()->IsSmi()); 3129bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(IsArraySpeciesLookupChainIntact()); 3130c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch factory()->species_protector()->set_value(Smi::FromInt(kProtectorInvalid)); 3131bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DCHECK(!IsArraySpeciesLookupChainIntact()); 3132bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch} 3133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid Isolate::InvalidateStringLengthOverflowProtector() { 3135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(factory()->string_length_protector()->value()->IsSmi()); 3136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(IsStringLengthOverflowIntact()); 3137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PropertyCell::SetValueWithInvalidation( 3138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch factory()->string_length_protector(), 3139c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch handle(Smi::FromInt(kProtectorInvalid), this)); 3140f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(!IsStringLengthOverflowIntact()); 3141f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 3142f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3143c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid Isolate::InvalidateArrayIteratorProtector() { 3144c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(factory()->array_iterator_protector()->value()->IsSmi()); 3145c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(IsArrayIteratorLookupChainIntact()); 314662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyCell::SetValueWithInvalidation( 314762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch factory()->array_iterator_protector(), 314862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(Smi::FromInt(kProtectorInvalid), this)); 3149c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(!IsArrayIteratorLookupChainIntact()); 3150c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 3151c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 315262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::InvalidateArrayBufferNeuteringProtector() { 315362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(factory()->array_buffer_neutering_protector()->value()->IsSmi()); 315462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(IsArrayBufferNeuteringIntact()); 315562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyCell::SetValueWithInvalidation( 315662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch factory()->array_buffer_neutering_protector(), 315762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(Smi::FromInt(kProtectorInvalid), this)); 315862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(!IsArrayBufferNeuteringIntact()); 315962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 316062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 3161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool Isolate::IsAnyInitialArrayPrototype(Handle<JSArray> array) { 3162bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DisallowHeapAllocation no_gc; 3163bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch return IsInAnyContext(*array, Context::INITIAL_ARRAY_PROTOTYPE_INDEX); 3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochCallInterfaceDescriptorData* Isolate::call_descriptor_data(int index) { 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= index && index < CallDescriptors::NUMBER_OF_DESCRIPTORS); 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return &call_descriptor_data_[index]; 3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbase::RandomNumberGenerator* Isolate::random_number_generator() { 3174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (random_number_generator_ == NULL) { 3175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_random_seed != 0) { 3176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch random_number_generator_ = 3177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new base::RandomNumberGenerator(FLAG_random_seed); 3178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 3179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch random_number_generator_ = new base::RandomNumberGenerator(); 3180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return random_number_generator_; 3183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3185c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochint Isolate::GenerateIdentityHash(uint32_t mask) { 3186c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int hash; 3187c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int attempts = 0; 3188c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch do { 3189c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch hash = random_number_generator()->NextInt() & mask; 3190c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } while (hash == 0 && attempts++ < 30); 3191c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return hash != 0 ? hash : 1; 3192c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 3193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 319462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochCode* Isolate::FindCodeObject(Address a) { 3195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inner_pointer_to_code_cache()->GcSafeFindCodeForInnerPointer(a); 3196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 319944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifdef DEBUG 320044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 320144f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); 320244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 320344f0eee88ff00398ff7f715fab053374d808c90dSteve BlockISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 320444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#undef ISOLATE_FIELD_OFFSET 320544f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif 320644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 320762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Symbol> Isolate::SymbolFor(Heap::RootListIndex dictionary_index, 320862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> name, bool private_symbol) { 320962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> key = factory()->InternalizeString(name); 321062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<NameDictionary> dictionary = 321162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<NameDictionary>::cast(heap()->root_handle(dictionary_index)); 321262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int entry = dictionary->FindEntry(key); 321362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Symbol> symbol; 321462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (entry == NameDictionary::kNotFound) { 321562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch symbol = 321662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch private_symbol ? factory()->NewPrivateSymbol() : factory()->NewSymbol(); 321762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch symbol->set_name(*key); 321862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch dictionary = NameDictionary::Add(dictionary, key, symbol, 321962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyDetails::Empty(), &entry); 322062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch switch (dictionary_index) { 322162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Heap::kPublicSymbolTableRootIndex: 322262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch symbol->set_is_public(true); 322362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()->set_public_symbol_table(*dictionary); 322462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch break; 322562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Heap::kApiSymbolTableRootIndex: 322662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()->set_api_symbol_table(*dictionary); 322762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch break; 322862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case Heap::kApiPrivateSymbolTableRootIndex: 322962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()->set_api_private_symbol_table(*dictionary); 323062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch break; 323162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch default: 323262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch UNREACHABLE(); 323362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 323462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 323562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch symbol = Handle<Symbol>(Symbol::cast(dictionary->ValueAt(entry))); 3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 323762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return symbol; 3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3240109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Isolate::AddBeforeCallEnteredCallback(BeforeCallEnteredCallback callback) { 3241109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch for (int i = 0; i < before_call_entered_callbacks_.length(); i++) { 3242109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (callback == before_call_entered_callbacks_.at(i)) return; 3243109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 3244109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch before_call_entered_callbacks_.Add(callback); 3245109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 3246109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 3247109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 3248109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochvoid Isolate::RemoveBeforeCallEnteredCallback( 3249109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BeforeCallEnteredCallback callback) { 3250109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch for (int i = 0; i < before_call_entered_callbacks_.length(); i++) { 3251109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch if (callback == before_call_entered_callbacks_.at(i)) { 3252109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch before_call_entered_callbacks_.Remove(i); 3253109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 3254109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch } 3255109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 3256109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 3257109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 3258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::AddCallCompletedCallback(CallCompletedCallback callback) { 3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < call_completed_callbacks_.length(); i++) { 3260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (callback == call_completed_callbacks_.at(i)) return; 3261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_completed_callbacks_.Add(callback); 3263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::RemoveCallCompletedCallback(CallCompletedCallback callback) { 3267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < call_completed_callbacks_.length(); i++) { 3268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (callback == call_completed_callbacks_.at(i)) { 3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch call_completed_callbacks_.Remove(i); 3270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::FireCallCompletedCallback() { 327613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!handle_scope_implementer()->CallDepthIsZero()) return; 327713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 32783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool run_microtasks = 32793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch pending_microtask_count() && 32803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch !handle_scope_implementer()->HasMicrotasksSuppressions() && 32813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch handle_scope_implementer()->microtasks_policy() == 32823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch v8::MicrotasksPolicy::kAuto; 3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (run_microtasks) RunMicrotasks(); 328513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Prevent stepping from spilling into the next call made by the embedder. 328613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (debug()->is_active()) debug()->ClearStepping(); 328713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 328813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (call_completed_callbacks_.is_empty()) return; 3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fire callbacks. Increase call depth to prevent recursive callbacks. 3290109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(this); 3291109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch v8::Isolate::SuppressMicrotaskExecutionScope suppress(isolate); 3292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < call_completed_callbacks_.length(); i++) { 3293109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch call_completed_callbacks_.at(i)(isolate); 3294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 329762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::DebugStateUpdated() { 329862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_hook_or_debug_is_active_ = promise_hook_ || debug()->is_active(); 329962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 330062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 330162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::SetPromiseHook(PromiseHook hook) { 330262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_hook_ = hook; 330362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DebugStateUpdated(); 330462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 330562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 330662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Isolate::RunPromiseHook(PromiseHookType type, Handle<JSPromise> promise, 330762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> parent) { 330862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (debug()->is_active()) debug()->RunPromiseHook(type, promise, parent); 330962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (promise_hook_ == nullptr) return; 331062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch promise_hook_(type, v8::Utils::PromiseToLocal(promise), 331162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch v8::Utils::ToLocal(parent)); 331262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 3313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Isolate::SetPromiseRejectCallback(PromiseRejectCallback callback) { 3315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier promise_reject_callback_ = callback; 3316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 3317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Isolate::ReportPromiseReject(Handle<JSObject> promise, 3320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> value, 3321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::PromiseRejectEvent event) { 3322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (promise_reject_callback_ == NULL) return; 3323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArray> stack_trace; 3324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (event == v8::kPromiseRejectWithNoHandler && value->IsJSObject()) { 3325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier stack_trace = GetDetailedStackTrace(Handle<JSObject>::cast(value)); 3326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier promise_reject_callback_(v8::PromiseRejectMessage( 3328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::Utils::PromiseToLocal(promise), event, v8::Utils::ToLocal(value), 3329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier v8::Utils::StackTraceToLocal(stack_trace))); 3330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 3331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3332c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid Isolate::PromiseReactionJob(Handle<PromiseReactionJobInfo> info, 3333c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MaybeHandle<Object>* result, 3334c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MaybeHandle<Object>* maybe_exception) { 3335c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> value(info->value(), this); 3336c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> tasks(info->tasks(), this); 3337c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSFunction> promise_handle_fn = promise_handle(); 3338c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> undefined = factory()->undefined_value(); 333962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> deferred_promise(info->deferred_promise(), this); 334062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 334162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (deferred_promise->IsFixedArray()) { 334262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(tasks->IsFixedArray()); 334362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> deferred_promise_arr = 334462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray>::cast(deferred_promise); 334562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> deferred_on_resolve_arr( 334662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::cast(info->deferred_on_resolve()), this); 334762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> deferred_on_reject_arr( 334862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FixedArray::cast(info->deferred_on_reject()), this); 334962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedArray> tasks_arr = Handle<FixedArray>::cast(tasks); 335062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch for (int i = 0; i < deferred_promise_arr->length(); i++) { 335162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> argv[] = {value, handle(tasks_arr->get(i), this), 335262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(deferred_promise_arr->get(i), this), 335362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(deferred_on_resolve_arr->get(i), this), 335462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(deferred_on_reject_arr->get(i), this)}; 335562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *result = Execution::TryCall( 335662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch this, promise_handle_fn, undefined, arraysize(argv), argv, 335762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Execution::MessageHandling::kReport, maybe_exception); 3358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // If execution is terminating, just bail out. 3359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (result->is_null() && maybe_exception->is_null()) { 3360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return; 3361c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 3362c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 3363c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } else { 336462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> argv[] = {value, tasks, deferred_promise, 336562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(info->deferred_on_resolve(), this), 336662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(info->deferred_on_reject(), this)}; 336762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *result = Execution::TryCall( 336862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch this, promise_handle_fn, undefined, arraysize(argv), argv, 336962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Execution::MessageHandling::kReport, maybe_exception); 3370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 3371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 3372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3373c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochvoid Isolate::PromiseResolveThenableJob( 3374c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<PromiseResolveThenableJobInfo> info, MaybeHandle<Object>* result, 3375c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch MaybeHandle<Object>* maybe_exception) { 3376c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSReceiver> thenable(info->thenable(), this); 3377c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSFunction> resolve(info->resolve(), this); 3378c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSFunction> reject(info->reject(), this); 3379c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<JSReceiver> then(info->then(), this); 3380f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> argv[] = {resolve, reject}; 338162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *result = 338262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Execution::TryCall(this, then, thenable, arraysize(argv), argv, 338362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Execution::MessageHandling::kReport, maybe_exception); 3384f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> reason; 3386f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (maybe_exception->ToHandle(&reason)) { 3387f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(result->is_null()); 3388f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Object> reason_arg[] = {reason}; 338962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *result = Execution::TryCall( 339062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch this, reject, factory()->undefined_value(), arraysize(reason_arg), 339162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch reason_arg, Execution::MessageHandling::kReport, maybe_exception); 3392f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 3393f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 3394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::EnqueueMicrotask(Handle<Object> microtask) { 3396f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(microtask->IsJSFunction() || microtask->IsCallHandlerInfo() || 3397c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch microtask->IsPromiseResolveThenableJobInfo() || 3398c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch microtask->IsPromiseReactionJobInfo()); 3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> queue(heap()->microtask_queue(), this); 3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int num_tasks = pending_microtask_count(); 3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(num_tasks <= queue->length()); 3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (num_tasks == 0) { 3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue = factory()->NewFixedArray(8); 3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap()->set_microtask_queue(*queue); 3405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (num_tasks == queue->length()) { 3406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch queue = factory()->CopyFixedArrayAndGrow(queue, num_tasks); 3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap()->set_microtask_queue(*queue); 3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 340913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(queue->get(num_tasks)->IsUndefined(this)); 3410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch queue->set(num_tasks, *microtask); 3411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_pending_microtask_count(num_tasks + 1); 3412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::RunMicrotasks() { 3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Increase call depth to prevent recursive callbacks. 3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::Isolate::SuppressMicrotaskExecutionScope suppress( 3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<v8::Isolate*>(this)); 3419bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch is_running_microtasks_ = true; 34203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch RunMicrotasksInternal(); 3421bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch is_running_microtasks_ = false; 34223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch FireMicrotasksCompletedCallback(); 34233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 34243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Isolate::RunMicrotasksInternal() { 3427f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!pending_microtask_count()) return; 3428f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch TRACE_EVENT0("v8.execute", "RunMicrotasks"); 342962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch TRACE_EVENT_CALL_STATS_SCOPED(this, "v8", "V8.RunMicrotasks"); 3430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (pending_microtask_count() > 0) { 3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HandleScope scope(this); 3432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int num_tasks = pending_microtask_count(); 3433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> queue(heap()->microtask_queue(), this); 3434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(num_tasks <= queue->length()); 3435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_pending_microtask_count(0); 3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap()->set_microtask_queue(heap()->empty_fixed_array()); 3437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Isolate* isolate = this; 34393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch FOR_WITH_HANDLE_SCOPE(isolate, int, i = 0, i, i < num_tasks, i++, { 3440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> microtask(queue->get(i), this); 3441f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3442f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (microtask->IsCallHandlerInfo()) { 3443f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<CallHandlerInfo> callback_info = 3444f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<CallHandlerInfo>::cast(microtask); 3445f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::MicrotaskCallback callback = 3446f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch v8::ToCData<v8::MicrotaskCallback>(callback_info->callback()); 3447f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch void* data = v8::ToCData<void*>(callback_info->data()); 3448f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch callback(data); 3449f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } else { 3450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SaveContext save(this); 3451c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Context* context; 3452c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (microtask->IsJSFunction()) { 3453c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch context = Handle<JSFunction>::cast(microtask)->context(); 3454c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } else if (microtask->IsPromiseResolveThenableJobInfo()) { 3455c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch context = 3456c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<PromiseResolveThenableJobInfo>::cast(microtask)->context(); 3457c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } else { 3458c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch context = Handle<PromiseReactionJobInfo>::cast(microtask)->context(); 3459c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 3460c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 3461f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch set_context(context->native_context()); 3462f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch handle_scope_implementer_->EnterMicrotaskContext( 3463f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Context>(context, this)); 3464f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3465f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch MaybeHandle<Object> result; 3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaybeHandle<Object> maybe_exception; 3467f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3468f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (microtask->IsJSFunction()) { 3469f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction> microtask_function = 3470f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction>::cast(microtask); 347162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch result = Execution::TryCall( 347262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch this, microtask_function, factory()->undefined_value(), 0, 347362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch nullptr, Execution::MessageHandling::kReport, &maybe_exception); 3474c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } else if (microtask->IsPromiseResolveThenableJobInfo()) { 3475c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PromiseResolveThenableJob( 3476c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<PromiseResolveThenableJobInfo>::cast(microtask), &result, 3477c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch &maybe_exception); 3478f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } else { 3479c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PromiseReactionJob(Handle<PromiseReactionJobInfo>::cast(microtask), 3480c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch &result, &maybe_exception); 3481f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 3482f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3483f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch handle_scope_implementer_->LeaveMicrotaskContext(); 3484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If execution is terminating, just bail out. 3486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result.is_null() && maybe_exception.is_null()) { 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Clear out any remaining callbacks in the queue. 3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap()->set_microtask_queue(heap()->empty_fixed_array()); 3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_pending_microtask_count(0); 3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 34933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch }); 34943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 34953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 34963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 34973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 34983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Isolate::AddMicrotasksCompletedCallback( 34993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MicrotasksCompletedCallback callback) { 35003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < microtasks_completed_callbacks_.length(); i++) { 35013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (callback == microtasks_completed_callbacks_.at(i)) return; 35023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 35033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_completed_callbacks_.Add(callback); 35043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 35053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 35063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 35073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Isolate::RemoveMicrotasksCompletedCallback( 35083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch MicrotasksCompletedCallback callback) { 35093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < microtasks_completed_callbacks_.length(); i++) { 35103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (callback == microtasks_completed_callbacks_.at(i)) { 35113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_completed_callbacks_.Remove(i); 3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Isolate::FireMicrotasksCompletedCallback() { 35183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch for (int i = 0; i < microtasks_completed_callbacks_.length(); i++) { 35193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch microtasks_completed_callbacks_.at(i)(reinterpret_cast<v8::Isolate*>(this)); 35203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 35213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 35223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 35233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 3524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::SetUseCounterCallback(v8::Isolate::UseCounterCallback callback) { 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!use_counter_callback_); 3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch use_counter_callback_ = callback; 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Isolate::CountUsage(v8::Isolate::UseCounterFeature feature) { 3531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The counter callback may cause the embedder to call into V8, which is not 3532014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // generally possible during GC. 3533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (heap_.gc_state() == Heap::NOT_IN_GC) { 3534014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (use_counter_callback_) { 3535014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope handle_scope(this); 3536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch use_counter_callback_(reinterpret_cast<v8::Isolate*>(this), feature); 3537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3538014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 3539014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch heap_.IncrementDeferredCount(feature); 3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierBasicBlockProfiler* Isolate::GetOrCreateBasicBlockProfiler() { 3545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (basic_block_profiler_ == NULL) { 3546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier basic_block_profiler_ = new BasicBlockProfiler(); 3547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return basic_block_profiler_; 3549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 3550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::string Isolate::GetTurboCfgFileName() { 3553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (FLAG_trace_turbo_cfg_file == NULL) { 3554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier std::ostringstream os; 3555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier os << "turbo-" << base::OS::GetCurrentProcessId() << "-" << id() << ".cfg"; 3556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return os.str(); 3557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } else { 3558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return FLAG_trace_turbo_cfg_file; 3559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 3560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 3561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 35623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Isolate::SetTailCallEliminationEnabled(bool enabled) { 35633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (is_tail_call_elimination_enabled_ == enabled) return; 35643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch is_tail_call_elimination_enabled_ = enabled; 35653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // TODO(ishell): Introduce DependencyGroup::kTailCallChangedGroup to 35663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // deoptimize only those functions that are affected by the change of this 35673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // flag. 35683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch internal::Deoptimizer::DeoptimizeAll(this); 35693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 3570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 3571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Heap::detached_contexts tracks detached contexts as pairs 3572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// (number of GC since the context was detached, the context). 3573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::AddDetachedContext(Handle<Context> context) { 3574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(this); 3575014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<WeakCell> cell = factory()->NewWeakCell(context); 3576f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<FixedArray> detached_contexts = factory()->detached_contexts(); 3577014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = detached_contexts->length(); 3578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch detached_contexts = factory()->CopyFixedArrayAndGrow(detached_contexts, 2); 3579c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch detached_contexts->set(length, Smi::kZero); 3580014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch detached_contexts->set(length + 1, *cell); 3581014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch heap()->set_detached_contexts(*detached_contexts); 3582014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3584014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3585014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Isolate::CheckDetachedContextsAfterGC() { 3586014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(this); 3587f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<FixedArray> detached_contexts = factory()->detached_contexts(); 3588014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length = detached_contexts->length(); 3589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (length == 0) return; 3590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int new_length = 0; 3591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < length; i += 2) { 3592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int mark_sweeps = Smi::cast(detached_contexts->get(i))->value(); 3593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(detached_contexts->get(i + 1)->IsWeakCell()); 3594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCell* cell = WeakCell::cast(detached_contexts->get(i + 1)); 3595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!cell->cleared()) { 3596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch detached_contexts->set(new_length, Smi::FromInt(mark_sweeps + 1)); 3597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch detached_contexts->set(new_length + 1, cell); 3598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch new_length += 2; 3599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3600014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch counters()->detached_context_age_in_gc()->AddSample(mark_sweeps + 1); 3601014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3602014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (FLAG_trace_detached_contexts) { 3603014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PrintF("%d detached contexts are collected out of %d\n", 3604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch length - new_length, length); 3605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < new_length; i += 2) { 3606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int mark_sweeps = Smi::cast(detached_contexts->get(i))->value(); 3607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(detached_contexts->get(i + 1)->IsWeakCell()); 3608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakCell* cell = WeakCell::cast(detached_contexts->get(i + 1)); 3609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (mark_sweeps > 3) { 3610bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch PrintF("detached context %p\n survived %d GCs (leak?)\n", 3611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static_cast<void*>(cell->value()), mark_sweeps); 3612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3613014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3614014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3615014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (new_length == 0) { 3616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch heap()->set_detached_contexts(heap()->empty_fixed_array()); 3617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (new_length < length) { 361862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()->RightTrimFixedArray(*detached_contexts, length - new_length); 3619014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 3620014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 3621014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 362262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochdouble Isolate::LoadStartTimeMs() { 362362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch base::LockGuard<base::Mutex> guard(&rail_mutex_); 362462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return load_start_time_ms_; 362562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 362662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 362713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochvoid Isolate::SetRAILMode(RAILMode rail_mode) { 362862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch RAILMode old_rail_mode = rail_mode_.Value(); 362962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (old_rail_mode != PERFORMANCE_LOAD && rail_mode == PERFORMANCE_LOAD) { 363062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch base::LockGuard<base::Mutex> guard(&rail_mutex_); 363162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch load_start_time_ms_ = heap()->MonotonicallyIncreasingTimeInMs(); 363262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 3633f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch rail_mode_.SetValue(rail_mode); 363462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (old_rail_mode == PERFORMANCE_LOAD && rail_mode != PERFORMANCE_LOAD) { 363562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()->incremental_marking()->incremental_marking_job()->ScheduleTask( 363662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch heap()); 363762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 363813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (FLAG_trace_rail) { 3639f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PrintIsolate(this, "RAIL mode: %s\n", RAILModeName(rail_mode)); 364013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 364113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 3642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3643f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Isolate::IsolateInBackgroundNotification() { 3644f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch is_isolate_in_background_ = true; 3645f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch heap()->ActivateMemoryReducerIfNeeded(); 3646f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 3647f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3648f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Isolate::IsolateInForegroundNotification() { 3649f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch is_isolate_in_background_ = false; 3650f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 3651f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 3652f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid Isolate::PrintWithTimestamp(const char* format, ...) { 3653f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch base::OS::Print("[%d:%p] %8.0f ms: ", base::OS::GetCurrentProcessId(), 3654f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch static_cast<void*>(this), time_millis_since_init()); 3655f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch va_list arguments; 3656f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch va_start(arguments, format); 3657f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch base::OS::VPrint(format, arguments); 3658f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch va_end(arguments); 3659f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 3660f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3661014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochbool StackLimitCheck::JsHasOverflowed(uintptr_t gap) const { 3662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StackGuard* stack_guard = isolate_->stack_guard(); 3663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef USE_SIMULATOR 3664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The simulator uses a separate JS stack. 3665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Address jssp_address = Simulator::current(isolate_)->get_sp(); 3666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t jssp = reinterpret_cast<uintptr_t>(jssp_address); 3667014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (jssp - gap < stack_guard->real_jslimit()) return true; 3668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // USE_SIMULATOR 3669014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return GetCurrentStackPosition() - gap < stack_guard->real_climit(); 3670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3672f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSaveContext::SaveContext(Isolate* isolate) 3673f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : isolate_(isolate), prev_(isolate->save_context()) { 3674f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (isolate->context() != NULL) { 3675f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context_ = Handle<Context>(isolate->context()); 3676f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 3677f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate->set_save_context(this); 3678f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3679f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch c_entry_fp_ = isolate->c_entry_fp(isolate->thread_local_top()); 3680f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 3681f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3682f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochSaveContext::~SaveContext() { 3683f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate_->set_context(context_.is_null() ? NULL : *context_); 3684f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate_->set_save_context(prev_); 3685f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 3686f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 3687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG 3688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochAssertNoContextChange::AssertNoContextChange(Isolate* isolate) 3689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : isolate_(isolate), context_(isolate->context(), isolate) {} 3690014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // DEBUG 3691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 3693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool PostponeInterruptsScope::Intercept(StackGuard::InterruptFlag flag) { 3694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // First check whether the previous scope intercepts. 3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (prev_ && prev_->Intercept(flag)) return true; 3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Then check whether this scope intercepts. 3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((flag & intercept_mask_)) { 3698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intercepted_flags_ |= flag; 3699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 3700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 3702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 3703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 3705014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 3706