12efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 5ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include <stdlib.h> 6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h" 117b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org#include "src/base/sys-info.h" 125de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/utils/random-number-generator.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bootstrapper.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/codegen.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/compilation-cache.h" 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/cpu-profiler.h" 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/deoptimizer.h" 193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/spaces.h" 203e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/sweeper-thread.h" 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap-profiler.h" 22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen.h" 23a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#include "src/ic/stub-cache.h" 24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate-inl.h" 25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/lithium-allocator.h" 26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/log.h" 27196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/messages.h" 289bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org#include "src/prototype.h" 29196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/regexp-stack.h" 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime-profiler.h" 31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/sampler.h" 32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopeinfo.h" 33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h" 34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/simulator.h" 35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/version.h" 36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/vm-state-inl.h" 37ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 39ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnamespace v8 { 40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgnamespace internal { 41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 421e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgbase::Atomic32 ThreadId::highest_thread_id_ = 0; 43a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 44a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgint ThreadId::AllocateThreadId() { 451e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org int new_id = base::NoBarrier_AtomicIncrement(&highest_thread_id_, 1); 46a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org return new_id; 47a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org} 48a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 50a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgint ThreadId::GetCurrentThreadId() { 515de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org int thread_id = base::Thread::GetThreadLocalInt(Isolate::thread_id_key_); 52a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org if (thread_id == 0) { 53a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org thread_id = AllocateThreadId(); 545de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::Thread::SetThreadLocalInt(Isolate::thread_id_key_, thread_id); 55a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org } 56a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org return thread_id; 57a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org} 58ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgThreadLocalTop::ThreadLocalTop() { 617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org InitializeInternal(); 627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid ThreadLocalTop::InitializeInternal() { 667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org c_entry_fp_ = 0; 677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org handler_ = 0; 687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef USE_SIMULATOR 697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org simulator_ = NULL; 707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif 717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org js_entry_sp_ = NULL; 72c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org external_callback_scope_ = NULL; 737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org current_vm_state_ = EXTERNAL; 746a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org try_catch_handler_ = NULL; 757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org context_ = NULL; 767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_id_ = ThreadId::Invalid(); 777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org external_caught_exception_ = false; 787304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org failed_access_check_callback_ = NULL; 797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org save_context_ = NULL; 807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org catcher_ = NULL; 81394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com top_lookup_result_ = NULL; 825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org promise_on_stack_ = NULL; 83a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org 84a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // These members are re-initialized later after deserialization 85a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // is complete. 86a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org pending_exception_ = NULL; 87a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org has_pending_message_ = false; 8893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org rethrowing_message_ = false; 89a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org pending_message_obj_ = NULL; 90a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org pending_message_script_ = NULL; 91a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org scheduled_exception_ = NULL; 927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid ThreadLocalTop::Initialize() { 967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org InitializeInternal(); 977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef USE_SIMULATOR 987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org simulator_ = Simulator::current(isolate_); 997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif 1007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_id_ = ThreadId::Current(); 1017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 1027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvoid ThreadLocalTop::Free() { 1055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // Match unmatched PopPromise calls. 1065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org while (promise_on_stack_) isolate_->PopPromise(); 1075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 1085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 1095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 1105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::Thread::LocalStorageKey Isolate::isolate_key_; 1115de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::Thread::LocalStorageKey Isolate::thread_id_key_; 1125de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_; 11379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org#ifdef DEBUG 1145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgbase::Thread::LocalStorageKey PerThreadAssertScopeBase::thread_local_key; 11579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org#endif // DEBUG 116a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgbase::LazyMutex Isolate::thread_data_table_mutex_ = LAZY_MUTEX_INITIALIZER; 1178c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.orgIsolate::ThreadDataTable* Isolate::thread_data_table_ = NULL; 1181e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgbase::Atomic32 Isolate::isolate_counter_ = 0; 1198c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org 120ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate::PerIsolateThreadData* 121ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate::FindOrAllocatePerThreadDataForThisThread() { 122a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org ThreadId thread_id = ThreadId::Current(); 123ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PerIsolateThreadData* per_thread = NULL; 124ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { 125a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 1268c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org per_thread = thread_data_table_->Lookup(this, thread_id); 127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (per_thread == NULL) { 128639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org per_thread = new PerIsolateThreadData(this, thread_id); 129639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org thread_data_table_->Insert(per_thread); 130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 131e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(thread_data_table_->Lookup(this, thread_id) == per_thread); 132ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 133ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return per_thread; 134ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 135ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 136ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1371c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgIsolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() { 1381c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org ThreadId thread_id = ThreadId::Current(); 139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return FindPerThreadDataForThread(thread_id); 140e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgIsolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThread( 144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ThreadId thread_id) { 1451c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org PerIsolateThreadData* per_thread = NULL; 1461c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org { 147a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 1488c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org per_thread = thread_data_table_->Lookup(this, thread_id); 1491c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org } 1501c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org return per_thread; 1511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org} 1521c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 1531c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 154a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid Isolate::InitializeOncePerProcess() { 155a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 156a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CHECK(thread_data_table_ == NULL); 157a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org isolate_key_ = base::Thread::CreateThreadLocalKey(); 158a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org thread_id_key_ = base::Thread::CreateThreadLocalKey(); 159a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org per_isolate_thread_data_key_ = base::Thread::CreateThreadLocalKey(); 16079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org#ifdef DEBUG 161a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org PerThreadAssertScopeBase::thread_local_key = 162a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org base::Thread::CreateThreadLocalKey(); 16379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org#endif // DEBUG 164a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org thread_data_table_ = new Isolate::ThreadDataTable(); 165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 166ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgAddress Isolate::get_address_from_id(Isolate::AddressId id) { 1697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return isolate_addresses_[id]; 1707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 1717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgchar* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) { 1747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage); 1757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Iterate(v, thread); 1767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return thread_storage + sizeof(ThreadLocalTop); 1777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 1787304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::IterateThread(ThreadVisitor* v, char* t) { 1817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(t); 1827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org v->VisitThread(this, thread); 1837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 1847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::Iterate(ObjectVisitor* v, ThreadLocalTop* thread) { 1877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Visit the roots from the top for a given thread. 1889e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org v->VisitPointer(&thread->pending_exception_); 1897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org v->VisitPointer(&(thread->pending_message_obj_)); 190e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org v->VisitPointer(bit_cast<Object**>(&(thread->pending_message_script_))); 191e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org v->VisitPointer(bit_cast<Object**>(&(thread->context_))); 1929e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org v->VisitPointer(&thread->scheduled_exception_); 1937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1946a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org for (v8::TryCatch* block = thread->try_catch_handler(); 1957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org block != NULL; 1966a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org block = block->next_) { 197e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org v->VisitPointer(bit_cast<Object**>(&(block->exception_))); 198e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org v->VisitPointer(bit_cast<Object**>(&(block->message_obj_))); 199e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org v->VisitPointer(bit_cast<Object**>(&(block->message_script_))); 2007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 2017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Iterate over pointers on native execution stack. 2037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org for (StackFrameIterator it(this, thread); !it.done(); it.Advance()) { 2047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org it.frame()->Iterate(v); 2057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 206394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com 207394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // Iterate pointers in live lookup results. 208394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com thread->top_lookup_result_->Iterate(v); 2097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::Iterate(ObjectVisitor* v) { 2137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ThreadLocalTop* current_t = thread_local_top(); 2147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Iterate(v, current_t); 2157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 217e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 218304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid Isolate::IterateDeferredHandles(ObjectVisitor* visitor) { 219304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org for (DeferredHandles* deferred = deferred_handles_head_; 220304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred != NULL; 221304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred = deferred->next_) { 222304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred->Iterate(visitor); 223304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 224304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 225304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 2267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 22732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org#ifdef DEBUG 22832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgbool Isolate::IsDeferredHandle(Object** handle) { 22932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // Each DeferredHandles instance keeps the handles to one job in the 2309259716434187c932704601f700375e53d865de8rossberg@chromium.org // concurrent recompilation queue, containing a list of blocks. Each block 23132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // contains kHandleBlockSize handles except for the first block, which may 23232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // not be fully filled. 23332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // We iterate through all the blocks to see whether the argument handle 23432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org // belongs to one of the blocks. If so, it is deferred. 23532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org for (DeferredHandles* deferred = deferred_handles_head_; 23632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org deferred != NULL; 23732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org deferred = deferred->next_) { 23832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org List<Object**>* blocks = &deferred->blocks_; 23932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org for (int i = 0; i < blocks->length(); i++) { 24032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org Object** block_limit = (i == 0) ? deferred->first_block_limit_ 24132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org : blocks->at(i) + kHandleBlockSize; 24232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (blocks->at(i) <= handle && handle < block_limit) return true; 24332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 24432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 24532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org return false; 24632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 24732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org#endif // DEBUG 24832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 24932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 2507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::RegisterTryCatchHandler(v8::TryCatch* that) { 2516a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org thread_local_top()->set_try_catch_handler(that); 2527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::UnregisterTryCatchHandler(v8::TryCatch* that) { 256e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(thread_local_top()->try_catch_handler() == that); 2576a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org thread_local_top()->set_try_catch_handler(that->next_); 2587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->catcher_ = NULL; 2597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgHandle<String> Isolate::StackTraceString() { 2637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (stack_trace_nesting_level_ == 0) { 2647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_nesting_level_++; 2657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org HeapStringAllocator allocator; 2663d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org StringStream::ClearMentionedObjectCache(this); 2677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StringStream accumulator(&allocator); 2687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org incomplete_message_ = &accumulator; 2697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org PrintStack(&accumulator); 2703d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Handle<String> stack_trace = accumulator.ToString(this); 2717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org incomplete_message_ = NULL; 2727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_nesting_level_ = 0; 2737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return stack_trace; 2747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else if (stack_trace_nesting_level_ == 1) { 2757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_nesting_level_++; 2765de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError( 2777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "\n\nAttempt to print stack while printing stack (double fault)\n"); 2785de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError( 2797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "If you are lucky you may find a partial stack dump on stdout.\n\n"); 2807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org incomplete_message_->OutputToStdOut(); 2814a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return factory()->empty_string(); 2827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else { 2835de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Abort(); 2847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Unreachable 2854a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return factory()->empty_string(); 2867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 2877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 2887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 2897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 29067255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.orgvoid Isolate::PushStackTraceAndDie(unsigned int magic, 29167255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org Object* object, 29267255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org Map* map, 29367255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org unsigned int magic2) { 29467255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org const int kMaxStackTraceSize = 8192; 29567255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org Handle<String> trace = StackTraceString(); 29659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org uint8_t buffer[kMaxStackTraceSize]; 29767255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org int length = Min(kMaxStackTraceSize - 1, trace->length()); 29867255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org String::WriteToFlat(*trace, buffer, 0, length); 29967255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org buffer[length] = '\0'; 30059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org // TODO(dcarney): convert buffer to utf8? 3015de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError("Stacktrace (%x-%x) %p %p: %s\n", magic, magic2, 3025de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org static_cast<void*>(object), static_cast<void*>(map), 3035de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org reinterpret_cast<char*>(buffer)); 3045de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Abort(); 30567255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org} 30667255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org 30767255bead6b3c379ed821d8371271e34779602cajkummerow@chromium.org 308eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// Determines whether the given stack frame should be displayed in 309eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// a stack trace. The caller is the error constructor that asked 310eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// for the stack trace to be collected. The first time a construct 311eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// call to this function is encountered it is skipped. The seen_caller 312eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// in/out parameter is used to remember if the caller has been seen 313eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org// yet. 314d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgstatic bool IsVisibleInStackTrace(JSFunction* fun, 315eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org Object* caller, 316d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Object* receiver, 317eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org bool* seen_caller) { 318169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if ((fun == caller) && !(*seen_caller)) { 319eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org *seen_caller = true; 320eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return false; 321eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 322eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // Skip all frames until we've seen the caller. 323eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!(*seen_caller)) return false; 324eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // Also, skip non-visible built-in functions and any call with the builtins 325eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // object as receiver, so as to not reveal either the builtins object or 326eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // an internal function. 327eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // The --builtins-in-stack-traces command line flag allows including 328eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // internal call sites in the stack trace for debugging purposes. 329eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (!FLAG_builtins_in_stack_traces) { 330d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (receiver->IsJSBuiltinsObject()) return false; 331d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (fun->IsBuiltin()) { 332d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return fun->shared()->native(); 333d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } else if (fun->IsFromNativeScript() || fun->IsFromExtensionScript()) { 334eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return false; 335eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 336eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 337eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return true; 338eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 339eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 340eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 341d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgHandle<Object> Isolate::CaptureSimpleStackTrace(Handle<JSObject> error_object, 342d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> caller) { 343d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Get stack trace limit. 344d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> error = Object::GetProperty( 345d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org this, js_builtins_object(), "$Error").ToHandleChecked(); 346d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (!error->IsJSObject()) return factory()->undefined_value(); 347d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 348d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<String> stackTraceLimit = 349d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org factory()->InternalizeUtf8String("stackTraceLimit"); 350e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!stackTraceLimit.is_null()); 351d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> stack_trace_limit = 352d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org JSObject::GetDataProperty(Handle<JSObject>::cast(error), 353d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org stackTraceLimit); 354d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (!stack_trace_limit->IsNumber()) return factory()->undefined_value(); 355d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org int limit = FastD2IChecked(stack_trace_limit->Number()); 356eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org limit = Max(limit, 0); // Ensure that limit is not negative. 357d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 358eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org int initial_size = Min(limit, 10); 359eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org Handle<FixedArray> elements = 360f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org factory()->NewFixedArrayWithHoles(initial_size * 4 + 1); 361eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 362eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // If the caller parameter is a function we skip frames until we're 363eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // under it before starting to collect. 364eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org bool seen_caller = !caller->IsJSFunction(); 365486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org // First element is reserved to store the number of sloppy frames. 366f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org int cursor = 1; 367eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org int frames_seen = 0; 368486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org int sloppy_frames = 0; 369f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org bool encountered_strict_function = false; 370d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org for (JavaScriptFrameIterator iter(this); 371eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org !iter.done() && frames_seen < limit; 372eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org iter.Advance()) { 373d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org JavaScriptFrame* frame = iter.frame(); 374d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Set initial size to the maximum inlining level + 1 for the outermost 375d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // function. 376d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org List<FrameSummary> frames(FLAG_max_inlining_levels + 1); 377d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org frame->Summarize(&frames); 378d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org for (int i = frames.length() - 1; i >= 0; i--) { 379d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<JSFunction> fun = frames[i].function(); 380d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> recv = frames[i].receiver(); 381d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Filter out internal frames that we do not want to show. 382d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (!IsVisibleInStackTrace(*fun, *caller, *recv, &seen_caller)) continue; 383d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Filter out frames from other security contexts. 384d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (!this->context()->HasSameSecurityTokenAs(fun->context())) continue; 385d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (cursor + 4 > elements->length()) { 386d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org int new_capacity = JSObject::NewElementsCapacity(elements->length()); 387d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<FixedArray> new_elements = 388d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org factory()->NewFixedArrayWithHoles(new_capacity); 389d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org for (int i = 0; i < cursor; i++) { 390d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org new_elements->set(i, elements->get(i)); 391eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 392d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org elements = new_elements; 393d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 394e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(cursor + 4 <= elements->length()); 395d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 396d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 397d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Code> code = frames[i].code(); 398d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Smi> offset(Smi::FromInt(frames[i].offset()), this); 399d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // The stack trace API should not expose receivers and function 400d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // objects on frames deeper than the top-most one with a strict 401d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // mode function. The number of sloppy frames is stored as 402d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // first element in the result array. 403d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (!encountered_strict_function) { 404d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (fun->shared()->strict_mode() == STRICT) { 405d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org encountered_strict_function = true; 406d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } else { 407d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org sloppy_frames++; 408f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 409eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 410d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org elements->set(cursor++, *recv); 411d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org elements->set(cursor++, *fun); 412d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org elements->set(cursor++, *code); 413d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org elements->set(cursor++, *offset); 41454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org frames_seen++; 415eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 416eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org } 417486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org elements->set(0, Smi::FromInt(sloppy_frames)); 418eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org Handle<JSArray> result = factory()->NewJSArrayWithElements(elements); 419eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org result->set_length(Smi::FromInt(cursor)); 420eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org return result; 421eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org} 422eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 423eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 424eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.orgvoid Isolate::CaptureAndSetDetailedStackTrace(Handle<JSObject> error_object) { 425ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (capture_stack_trace_for_uncaught_exceptions_) { 426ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // Capture stack trace for a detailed exception message. 427d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Name> key = factory()->detailed_stack_trace_symbol(); 428ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org Handle<JSArray> stack_trace = CaptureCurrentStackTrace( 429ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org stack_trace_for_uncaught_exceptions_frame_limit_, 430ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org stack_trace_for_uncaught_exceptions_options_); 4319bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org JSObject::SetProperty(error_object, key, stack_trace, STRICT).Assert(); 432ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 433ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org} 434ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org 435ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org 436d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgvoid Isolate::CaptureAndSetSimpleStackTrace(Handle<JSObject> error_object, 437d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> caller) { 438d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Capture stack trace for simple stack trace string formatting. 439d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Name> key = factory()->stack_trace_symbol(); 440d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> stack_trace = CaptureSimpleStackTrace(error_object, caller); 4419bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org JSObject::SetProperty(error_object, key, stack_trace, STRICT).Assert(); 442d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org} 443d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 444d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 4457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgHandle<JSArray> Isolate::CaptureCurrentStackTrace( 4467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int frame_limit, StackTrace::StackTraceOptions options) { 4477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Ensure no negative values. 4487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int limit = Max(frame_limit, 0); 4497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<JSArray> stack_trace = factory()->NewJSArray(frame_limit); 4507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 451a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Handle<String> column_key = 4522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("column")); 453a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Handle<String> line_key = 4542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("lineNumber")); 4558fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Handle<String> script_id_key = 4562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("scriptId")); 4578fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Handle<String> script_name_key = 4582c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("scriptName")); 4597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<String> script_name_or_source_url_key = 4604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org factory()->InternalizeOneByteString( 4612c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org STATIC_CHAR_VECTOR("scriptNameOrSourceURL")); 462a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Handle<String> function_key = 4632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("functionName")); 464a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Handle<String> eval_key = 4652c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("isEval")); 4667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<String> constructor_key = 4672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("isConstructor")); 4687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 4697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackTraceFrameIterator it(this); 4707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int frames_seen = 0; 4717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org while (!it.done() && (frames_seen < limit)) { 4727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org JavaScriptFrame* frame = it.frame(); 4737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Set initial size to the maximum inlining level + 1 for the outermost 4747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // function. 475ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org List<FrameSummary> frames(FLAG_max_inlining_levels + 1); 4767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org frame->Summarize(&frames); 4777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org for (int i = frames.length() - 1; i >= 0 && frames_seen < limit; i--) { 47854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<JSFunction> fun = frames[i].function(); 47954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org // Filter frames from other security contexts. 48054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org if (!(options & StackTrace::kExposeFramesAcrossSecurityOrigins) && 48154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org !this->context()->HasSameSecurityTokenAs(fun->context())) continue; 48254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 4837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Create a JSObject to hold the information for the StackFrame. 484f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com Handle<JSObject> stack_frame = factory()->NewJSObject(object_function()); 4857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 4867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<Script> script(Script::cast(fun->shared()->script())); 4877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 4887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kLineNumber) { 4897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int script_line_offset = script->line_offset()->value(); 4907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int position = frames[i].code()->SourcePosition(frames[i].pc()); 4919fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org int line_number = Script::GetLineNumber(script, position); 4927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // line_number is already shifted by the script_line_offset. 4937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int relative_line_number = line_number - script_line_offset; 4947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kColumnOffset && relative_line_number >= 0) { 4957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends())); 4967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int start = (relative_line_number == 0) ? 0 : 4977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Smi::cast(line_ends->get(relative_line_number - 1))->value() + 1; 4987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int column_offset = position - start; 4997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (relative_line_number == 0) { 5007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // For the case where the code is on the same line as the script 5017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // tag. 5027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org column_offset += script->column_offset()->value(); 5037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5045de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty( 5058f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org stack_frame, column_key, 5065de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org handle(Smi::FromInt(column_offset + 1), this), NONE); 5077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5085de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty( 5098f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org stack_frame, line_key, 5105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org handle(Smi::FromInt(line_number + 1), this), NONE); 5117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5138fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org if (options & StackTrace::kScriptId) { 5145de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty( 5155de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org stack_frame, script_id_key, handle(script->id(), this), NONE); 5168fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org } 5178fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org 5187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kScriptName) { 5195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty( 5205de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org stack_frame, script_name_key, handle(script->name(), this), NONE); 5217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5237304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kScriptNameOrSourceURL) { 5249fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org Handle<Object> result = Script::GetNameOrSourceURL(script); 5255de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty( 5265de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org stack_frame, script_name_or_source_url_key, result, NONE); 5277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kFunctionName) { 5303e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org Handle<Object> fun_name(fun->shared()->DebugName(), this); 5315de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty(stack_frame, function_key, fun_name, NONE); 5327304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kIsEval) { 535d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org Handle<Object> is_eval = 536d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org script->compilation_type() == Script::COMPILATION_TYPE_EVAL ? 537d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org factory()->true_value() : factory()->false_value(); 5385de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty(stack_frame, eval_key, is_eval, NONE); 5397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5407304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5417304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (options & StackTrace::kIsConstructor) { 5427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<Object> is_constructor = (frames[i].is_constructor()) ? 5437304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org factory()->true_value() : factory()->false_value(); 5445de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org JSObject::AddProperty( 5455de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org stack_frame, constructor_key, is_constructor, NONE); 5467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 548f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com FixedArray::cast(stack_trace->elements())->set(frames_seen, *stack_frame); 5497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org frames_seen++; 5507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org it.Advance(); 5527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace->set_length(Smi::FromInt(frames_seen)); 5557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return stack_trace; 5567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 5577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 559bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgvoid Isolate::PrintStack(FILE* out) { 5607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (stack_trace_nesting_level_ == 0) { 5617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_nesting_level_++; 5623d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org StringStream::ClearMentionedObjectCache(this); 5637ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org HeapStringAllocator allocator; 5647ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org StringStream accumulator(&allocator); 5657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org incomplete_message_ = &accumulator; 5667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org PrintStack(&accumulator); 567bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org accumulator.OutputToFile(out); 5687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org InitializeLoggingAndCounters(); 569e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org accumulator.Log(this); 5707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org incomplete_message_ = NULL; 5717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_nesting_level_ = 0; 5727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else if (stack_trace_nesting_level_ == 1) { 5737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_nesting_level_++; 5745de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError( 5757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "\n\nAttempt to print stack while printing stack (double fault)\n"); 5765de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError( 5777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "If you are lucky you may find a partial stack dump on stdout.\n\n"); 578bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org incomplete_message_->OutputToFile(out); 5797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 5817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 583c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgstatic void PrintFrames(Isolate* isolate, 584c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org StringStream* accumulator, 5857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackFrame::PrintMode mode) { 586c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org StackFrameIterator it(isolate); 5877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org for (int i = 0; !it.done(); it.Advance()) { 5887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org it.frame()->Print(accumulator, mode, i++); 5897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 5917304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 5937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::PrintStack(StringStream* accumulator) { 5947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (!IsInitialized()) { 5957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org accumulator->Add( 596a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org "\n==== JS stack trace is not available =======================\n\n"); 5977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org accumulator->Add( 5987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "\n==== Isolate for the thread is not initialized =============\n\n"); 5997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return; 6007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 6017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // The MentionedObjectCache is not GC-proof at the moment. 60279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_gc; 603e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(StringStream::IsMentionedObjectCacheClear(this)); 6047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Avoid printing anything if there are no frames. 6067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (c_entry_fp(thread_local_top()) == 0) return; 6077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org accumulator->Add( 609a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org "\n==== JS stack trace =========================================\n\n"); 610c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintFrames(this, accumulator, StackFrame::OVERVIEW); 6117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org accumulator->Add( 6137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "\n==== Details ================================================\n\n"); 614c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org PrintFrames(this, accumulator, StackFrame::DETAILS); 6157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org accumulator->PrintMentionedObjectCache(this); 6177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org accumulator->Add("=====================\n\n"); 6187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 6197304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::SetFailedAccessCheckCallback( 6227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org v8::FailedAccessCheckCallback callback) { 6237304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->failed_access_check_callback_ = callback; 6247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 6257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 627c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgstatic inline AccessCheckInfo* GetAccessCheckInfo(Isolate* isolate, 628c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<JSObject> receiver) { 629c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org JSFunction* constructor = JSFunction::cast(receiver->map()->constructor()); 630c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (!constructor->shared()->IsApiFunction()) return NULL; 631c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 632c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Object* data_obj = 633c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org constructor->shared()->get_api_func_data()->access_check_info(); 634c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (data_obj == isolate->heap()->undefined_value()) return NULL; 635c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 636c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return AccessCheckInfo::cast(data_obj); 637c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org} 638c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 639c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 640c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgvoid Isolate::ReportFailedAccessCheck(Handle<JSObject> receiver, 641c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::AccessType type) { 642d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org if (!thread_local_top()->failed_access_check_callback_) { 643d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org Handle<String> message = factory()->InternalizeUtf8String("no access"); 644ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Handle<Object> error; 645ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org ASSIGN_RETURN_ON_EXCEPTION_VALUE( 646ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org this, error, factory()->NewTypeError(message), /* void */); 647ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org ScheduleThrow(*error); 648d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org return; 649d4d66c214e72f4db85c4bccc5561a6d61116b330machenbach@chromium.org } 6507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(receiver->IsAccessCheckNeeded()); 652e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(context()); 6537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Get the data object from access check info. 655c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 656c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> data; 657c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org { DisallowHeapAllocation no_gc; 658c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver); 659c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (!access_check_info) return; 660c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org data = handle(access_check_info->data(), this); 661c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org } 662c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 663c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Leaving JavaScript. 664c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org VMState<EXTERNAL> state(this); 665c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org thread_local_top()->failed_access_check_callback_( 666c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::Utils::ToLocal(receiver), 667f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org type, 668f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org v8::Utils::ToLocal(data)); 6697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 6707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgenum MayAccessDecision { 6737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org YES, NO, UNKNOWN 6747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}; 6757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgstatic MayAccessDecision MayAccessPreCheck(Isolate* isolate, 678c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<JSObject> receiver, 6797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org v8::AccessType type) { 680c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org DisallowHeapAllocation no_gc; 6817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // During bootstrapping, callback functions are not enabled yet. 6827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (isolate->bootstrapper()->IsActive()) return YES; 6837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (receiver->IsJSGlobalProxy()) { 685c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Object* receiver_context = JSGlobalProxy::cast(*receiver)->native_context(); 6867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (!receiver_context->IsContext()) return NO; 6877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 68846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // Get the native context of current top context. 68946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org // avoid using Isolate::native_context() because it uses Handle. 69046839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org Context* native_context = 69146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org isolate->context()->global_object()->native_context(); 69246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (receiver_context == native_context) return YES; 6937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (Context::cast(receiver_context)->security_token() == 69546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org native_context->security_token()) 6967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return YES; 6977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 6987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 6997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return UNKNOWN; 7007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 7017304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7027304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 703c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgbool Isolate::MayNamedAccess(Handle<JSObject> receiver, 704c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> key, 7057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org v8::AccessType type) { 706e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(receiver->IsJSGlobalProxy() || receiver->IsAccessCheckNeeded()); 7077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Skip checks for hidden properties access. Note, we do not 7097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // require existence of a context in this case. 710c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (key.is_identical_to(factory()->hidden_string())) return true; 7117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Check for compatibility between the security tokens in the 7137304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // current lexical context and the accessed object. 714e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(context()); 7157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MayAccessDecision decision = MayAccessPreCheck(this, receiver, type); 7177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (decision != UNKNOWN) return decision == YES; 7187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7197304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org HandleScope scope(this); 720c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> data; 721c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::NamedSecurityCallback callback; 722c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org { DisallowHeapAllocation no_gc; 723c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver); 724c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (!access_check_info) return false; 725c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Object* fun_obj = access_check_info->named_callback(); 726c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org callback = v8::ToCData<v8::NamedSecurityCallback>(fun_obj); 727c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (!callback) return false; 728c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org data = handle(access_check_info->data(), this); 7297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 730c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 731c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org LOG(this, ApiNamedSecurityCheck(*key)); 732c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 733c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Leaving JavaScript. 734c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org VMState<EXTERNAL> state(this); 735c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return callback(v8::Utils::ToLocal(receiver), 736c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::Utils::ToLocal(key), 737c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org type, 738c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::Utils::ToLocal(data)); 7397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 7407304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7417304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 742c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.orgbool Isolate::MayIndexedAccess(Handle<JSObject> receiver, 7437304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org uint32_t index, 7447304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org v8::AccessType type) { 745e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(receiver->IsJSGlobalProxy() || receiver->IsAccessCheckNeeded()); 7467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Check for compatibility between the security tokens in the 7477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // current lexical context and the accessed object. 748e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(context()); 7497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MayAccessDecision decision = MayAccessPreCheck(this, receiver, type); 7517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (decision != UNKNOWN) return decision == YES; 7527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org HandleScope scope(this); 754c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Handle<Object> data; 755c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::IndexedSecurityCallback callback; 756c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org { DisallowHeapAllocation no_gc; 757c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Get named access check callback 758c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org AccessCheckInfo* access_check_info = GetAccessCheckInfo(this, receiver); 759c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (!access_check_info) return false; 760c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org Object* fun_obj = access_check_info->indexed_callback(); 761c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org callback = v8::ToCData<v8::IndexedSecurityCallback>(fun_obj); 762c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org if (!callback) return false; 763c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org data = handle(access_check_info->data(), this); 7647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 765c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 766c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org LOG(this, ApiIndexedSecurityCheck(index)); 767c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org 768c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org // Leaving JavaScript. 769c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org VMState<EXTERNAL> state(this); 770c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org return callback( 771c2e08d7d6b03e672e13fc3bf274a292009decce6machenbach@chromium.org v8::Utils::ToLocal(receiver), index, type, v8::Utils::ToLocal(data)); 7727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 7737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgconst char* const Isolate::kStackOverflowMessage = 7767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org "Uncaught RangeError: Maximum call stack size exceeded"; 7777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7787304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 779a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgObject* Isolate::StackOverflow() { 780c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 781eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // At this point we cannot create an Error object using its javascript 782eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // constructor. Instead, we copy the pre-constructed boilerplate and 783eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // attach the stack trace as a hidden property. 7844a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org Handle<String> key = factory()->stack_overflow_string(); 7852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<JSObject> boilerplate = Handle<JSObject>::cast( 7862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Object::GetProperty(js_builtins_object(), key).ToHandleChecked()); 7873484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org Handle<JSObject> exception = factory()->CopyJSObject(boilerplate); 7887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org DoThrow(*exception, NULL); 789eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 790d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org CaptureAndSetSimpleStackTrace(exception, factory()->undefined_value()); 791a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return heap()->exception(); 7927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 7937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 7947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 795a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgObject* Isolate::TerminateExecution() { 7967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org DoThrow(heap_.termination_exception(), NULL); 797a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return heap()->exception(); 7987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 7997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 80132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgvoid Isolate::CancelTerminateExecution() { 80232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (try_catch_handler()) { 80332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org try_catch_handler()->has_terminated_ = false; 80432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 80532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (has_pending_exception() && 80632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org pending_exception() == heap_.termination_exception()) { 80732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org thread_local_top()->external_caught_exception_ = false; 80832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org clear_pending_exception(); 80932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 81032d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org if (has_scheduled_exception() && 81132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org scheduled_exception() == heap_.termination_exception()) { 81232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org thread_local_top()->external_caught_exception_ = false; 81332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org clear_scheduled_exception(); 81432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org } 81532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org} 81632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 81732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org 8183c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgvoid Isolate::InvokeApiInterruptCallback() { 8196a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org // Note: callback below should be called outside of execution access lock. 8206a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org InterruptCallback callback = NULL; 8216a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org void* data = NULL; 8226a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org { 8236a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org ExecutionAccess access(this); 8246a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org callback = api_interrupt_callback_; 8256a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org data = api_interrupt_callback_data_; 8266a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org api_interrupt_callback_ = NULL; 8276a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org api_interrupt_callback_data_ = NULL; 8286a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org } 8293c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org 8303c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org if (callback != NULL) { 8313c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org VMState<EXTERNAL> state(this); 8323c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org HandleScope handle_scope(this); 8333c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org callback(reinterpret_cast<v8::Isolate*>(this), data); 8343c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org } 8353c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org} 8363c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org 8373c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org 838a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgObject* Isolate::Throw(Object* exception, MessageLocation* location) { 8397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org DoThrow(exception, location); 840a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return heap()->exception(); 8417304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 8427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8437304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 844a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgObject* Isolate::ReThrow(Object* exception) { 8457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool can_be_caught_externally = false; 846ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org bool catchable_by_javascript = is_catchable_by_javascript(exception); 847ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org ShouldReportException(&can_be_caught_externally, catchable_by_javascript); 848ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org 8497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->catcher_ = can_be_caught_externally ? 8507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org try_catch_handler() : NULL; 8517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Set the exception being re-thrown. 8537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org set_pending_exception(exception); 854a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org return heap()->exception(); 8557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 8567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 858a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgObject* Isolate::ThrowIllegalOperation() { 859f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (FLAG_stack_trace_on_illegal) PrintStack(stdout); 8604a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org return Throw(heap_.illegal_access_string()); 8617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 8627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::ScheduleThrow(Object* exception) { 8657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // When scheduling a throw we first throw the exception to get the 8667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // error reporting if it is uncaught before rescheduling it. 8677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Throw(exception); 86849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org PropagatePendingExceptionToExternalTryCatch(); 86949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org if (has_pending_exception()) { 87049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org thread_local_top()->scheduled_exception_ = pending_exception(); 87149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org thread_local_top()->external_caught_exception_ = false; 87249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org clear_pending_exception(); 87349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org } 8747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 8757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 8767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 87793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgvoid Isolate::RestorePendingMessageFromTryCatch(v8::TryCatch* handler) { 878e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(handler == try_catch_handler()); 879e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(handler->HasCaught()); 880e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(handler->rethrow_); 881e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(handler->capture_message_); 88293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Object* message = reinterpret_cast<Object*>(handler->message_obj_); 88393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Object* script = reinterpret_cast<Object*>(handler->message_script_); 884e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(message->IsJSMessageObject() || message->IsTheHole()); 885e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(script->IsScript() || script->IsTheHole()); 88693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top()->pending_message_obj_ = message; 88793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top()->pending_message_script_ = script; 88893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top()->pending_message_start_pos_ = handler->message_start_pos_; 88993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top()->pending_message_end_pos_ = handler->message_end_pos_; 89093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org} 89193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 89293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 893474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.orgvoid Isolate::CancelScheduledExceptionFromTryCatch(v8::TryCatch* handler) { 894e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_scheduled_exception()); 895474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (scheduled_exception() == handler->exception_) { 896e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(scheduled_exception() != heap()->termination_exception()); 897474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org clear_scheduled_exception(); 898474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org } 899474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org} 900474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 901474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org 902a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgObject* Isolate::PromoteScheduledException() { 9039e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org Object* thrown = scheduled_exception(); 9047304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org clear_scheduled_exception(); 9057304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Re-throw the exception to avoid getting repeated error reporting. 9067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return ReThrow(thrown); 9077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 9087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::PrintCurrentStackTrace(FILE* out) { 9117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackTraceFrameIterator it(this); 9127304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org while (!it.done()) { 913c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 9147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Find code position if recorded in relocation info. 9157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org JavaScriptFrame* frame = it.frame(); 9167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int pos = frame->LookupCode()->SourcePosition(frame->pc()); 91709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> pos_obj(Smi::FromInt(pos), this); 9187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Fetch function and receiver. 919169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Handle<JSFunction> fun(frame->function()); 92009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> recv(frame->receiver(), this); 9217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Advance to the next JavaScript frame and determine if the 9227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // current frame is the top-level frame. 9237304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org it.Advance(); 9247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<Object> is_top_level = it.done() 9257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ? factory()->true_value() 9267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org : factory()->false_value(); 9277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Generate and print stack trace line. 9287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<String> line = 9297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level); 9307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (line->length() > 0) { 9317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org line->PrintOn(out); 932e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org PrintF(out, "\n"); 9337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 9347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 9357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 9367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::ComputeLocation(MessageLocation* target) { 9397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1); 9407304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackTraceFrameIterator it(this); 9417304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (!it.done()) { 9427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org JavaScriptFrame* frame = it.frame(); 943169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org JSFunction* fun = frame->function(); 9447304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Object* script = fun->shared()->script(); 9457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (script->IsScript() && 9467304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org !(Script::cast(script)->source()->IsUndefined())) { 9477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int pos = frame->LookupCode()->SourcePosition(frame->pc()); 9487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Compute the location from the function and the reloc info. 9497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<Script> casted_script(Script::cast(script)); 9507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org *target = MessageLocation(casted_script, pos, pos + 1); 9517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 9527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 9537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 9547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgbool Isolate::ShouldReportException(bool* can_be_caught_externally, 9577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool catchable_by_javascript) { 9587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Find the top-most try-catch handler. 9597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackHandler* handler = 9607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackHandler::FromAddress(Isolate::handler(thread_local_top())); 96178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org while (handler != NULL && !handler->is_catch()) { 9627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org handler = handler->next(); 9637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 9647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Get the address of the external handler so we can compare the address to 9667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // determine which one is closer to the top of the stack. 9677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Address external_handler_address = 9687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->try_catch_handler_address(); 9697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // The exception has been externally caught if and only if there is 9717304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // an external handler which is on top of the top-most try-catch 9727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // handler. 9737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org *can_be_caught_externally = external_handler_address != NULL && 9747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org (handler == NULL || handler->address() > external_handler_address || 9757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org !catchable_by_javascript); 9767304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (*can_be_caught_externally) { 9787304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Only report the exception if the external handler is verbose. 9797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return try_catch_handler()->is_verbose_; 9807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else { 9817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Report the exception if it isn't caught by JavaScript code. 9827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return handler == NULL; 9837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 9847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 9857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 9867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 987ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.orgbool Isolate::IsErrorObject(Handle<Object> obj) { 988ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (!obj->IsJSObject()) return false; 989ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org 9905b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org Handle<String> error_key = 9912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("$Error")); 9922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Handle<Object> error_constructor = Object::GetProperty( 9932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org js_builtins_object(), error_key).ToHandleChecked(); 994ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org 9955b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org DisallowHeapAllocation no_gc; 9969bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org for (PrototypeIterator iter(this, *obj, PrototypeIterator::START_AT_RECEIVER); 9979bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org !iter.IsAtEnd(); iter.Advance()) { 9989bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org if (iter.GetCurrent()->IsJSProxy()) return false; 9999bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org if (JSObject::cast(iter.GetCurrent())->map()->constructor() == 10005b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org *error_constructor) { 1001ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org return true; 1002ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 1003ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 1004ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org return false; 1005ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org} 1006ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org 1007e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic int fatal_exception_depth = 0; 1008ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org 1009ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.orgvoid Isolate::DoThrow(Object* exception, MessageLocation* location) { 1010e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!has_pending_exception()); 10117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1012c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 101309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> exception_handle(exception, this); 10147304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 10157304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Determine reporting and whether the exception is caught externally. 10167304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool catchable_by_javascript = is_catchable_by_javascript(exception); 10177304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool can_be_caught_externally = false; 10187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool should_report_exception = 10197304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ShouldReportException(&can_be_caught_externally, catchable_by_javascript); 10207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool report_exception = catchable_by_javascript && should_report_exception; 1021ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org bool try_catch_needs_message = 102206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org can_be_caught_externally && try_catch_handler()->capture_message_; 1023ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org bool bootstrapping = bootstrapper()->IsActive(); 102406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org bool rethrowing_message = thread_local_top()->rethrowing_message_; 10257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 102693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top()->rethrowing_message_ = false; 102793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 10287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Notify debugger of exception. 10297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (catchable_by_javascript) { 10309d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org debug()->OnThrow(exception_handle, report_exception); 10317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 10327304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1033ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // Generate the message if required. 103406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org if (!rethrowing_message && (report_exception || try_catch_needs_message)) { 1035ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org MessageLocation potential_computed_location; 10367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (location == NULL) { 1037ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // If no location was specified we use a computed one instead. 10387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org ComputeLocation(&potential_computed_location); 10397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org location = &potential_computed_location; 10407304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1041ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // It's not safe to try to make message objects or collect stack traces 1042ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // while the bootstrapper is active since the infrastructure may not have 1043ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // been properly initialized. 1044ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (!bootstrapping) { 10457304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Handle<JSArray> stack_trace_object; 1046ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (capture_stack_trace_for_uncaught_exceptions_) { 1047ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (IsErrorObject(exception_handle)) { 1048ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // We fetch the stack trace that corresponds to this error object. 1049d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Name> key = factory()->detailed_stack_trace_symbol(); 1050d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Look up as own property. If the lookup fails, the exception is 1051d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // probably not a valid Error object. In that case, we fall through 1052d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // and capture the stack trace at this throw site. 10535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org LookupIterator lookup(exception_handle, key, 10549aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org LookupIterator::OWN_SKIP_INTERCEPTOR); 1055d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org Handle<Object> stack_trace_property; 1056d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (Object::GetProperty(&lookup).ToHandle(&stack_trace_property) && 1057d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org stack_trace_property->IsJSArray()) { 1058d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org stack_trace_object = Handle<JSArray>::cast(stack_trace_property); 1059ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 1060ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 1061ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (stack_trace_object.is_null()) { 1062ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org // Not an error object, we capture at throw site. 10637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_object = CaptureCurrentStackTrace( 10647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_for_uncaught_exceptions_frame_limit_, 10657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_for_uncaught_exceptions_options_); 1066ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 10677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1068eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org 1069eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org Handle<Object> exception_arg = exception_handle; 1070eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // If the exception argument is a custom object, turn it into a string 1071eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // before throwing as uncaught exception. Note that the pending 1072eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org // exception object to be set later must not be turned into a string. 1073eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org if (exception_arg->IsJSObject() && !IsErrorObject(exception_arg)) { 10742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org MaybeHandle<Object> maybe_exception = 10752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org Execution::ToDetailString(this, exception_arg); 10762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org if (!maybe_exception.ToHandle(&exception_arg)) { 10774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org exception_arg = factory()->InternalizeOneByteString( 10782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org STATIC_CHAR_VECTOR("exception")); 1079e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 1080e4ac3ef2f6fa9300bc78c5a4cb7d4cb66ac6e83dmvstanton@chromium.org } 1081ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org Handle<Object> message_obj = MessageHandler::MakeMessageObject( 1082d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org this, 1083ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org "uncaught_exception", 1084ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org location, 1085eeb44b681a16e45f1415dfacff0ba3dba9de5d8cyangguo@chromium.org HandleVector<Object>(&exception_arg, 1), 10867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_object); 1087ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org thread_local_top()->pending_message_obj_ = *message_obj; 1088ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org if (location != NULL) { 1089ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org thread_local_top()->pending_message_script_ = *location->script(); 1090ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org thread_local_top()->pending_message_start_pos_ = location->start_pos(); 1091ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org thread_local_top()->pending_message_end_pos_ = location->end_pos(); 1092ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org } 1093e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1094e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // If the abort-on-uncaught-exception flag is specified, abort on any 1095e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // exception not caught by JavaScript, even when an external handler is 1096e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // present. This flag is intended for use by JavaScript developers, so 1097e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // print a user-friendly stack trace (not an internal one). 1098e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (fatal_exception_depth == 0 && 1099e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FLAG_abort_on_uncaught_exception && 1100e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (report_exception || can_be_caught_externally)) { 1101e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org fatal_exception_depth++; 1102e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org PrintF(stderr, 1103e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "%s\n\nFROM\n", 1104afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org MessageHandler::GetLocalizedMessage(this, message_obj).get()); 1105e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org PrintCurrentStackTrace(stderr); 11065de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::Abort(); 1107e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 1108394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com } else if (location != NULL && !location->script().is_null()) { 1109394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // We are bootstrapping and caught an error where the location is set 1110394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // and we have a script for the location. 1111394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // In this case we could have an extension (or an internal error 1112394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // somewhere) and we print out the line number at which the error occured 1113394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com // to the console for easier debugging. 11149fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org int line_number = 11159fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org location->script()->GetLineNumber(location->start_pos()) + 1; 111632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org if (exception->IsString() && location->script()->name()->IsString()) { 11175de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError( 111837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org "Extension or internal compilation error: %s in %s at line %d.\n", 1119afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org String::cast(exception)->ToCString().get(), 1120afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org String::cast(location->script()->name())->ToCString().get(), 11219fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org line_number); 112232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } else if (location->script()->name()->IsString()) { 11235de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError( 112437141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org "Extension or internal compilation error in %s at line %d.\n", 1125afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org String::cast(location->script()->name())->ToCString().get(), 11269fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org line_number); 112732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } else { 11285de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::OS::PrintError("Extension or internal compilation error.\n"); 112937141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.org } 1130fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org#ifdef OBJECT_PRINT 1131fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // Since comments and empty lines have been stripped from the source of 1132fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org // builtins, print the actual source here so that line numbers match. 1133fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (location->script()->source()->IsString()) { 1134fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org Handle<String> src(String::cast(location->script()->source())); 1135fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org PrintF("Failing script:\n"); 1136fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org int len = src->length(); 1137fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org int line_number = 1; 1138fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org PrintF("%5d: ", line_number); 1139fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org for (int i = 0; i < len; i++) { 1140fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org uint16_t character = src->Get(i); 1141fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org PrintF("%c", character); 1142fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (character == '\n' && i < len - 2) { 1143fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org PrintF("%5d: ", ++line_number); 1144fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org } 1145fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org } 1146fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org } 1147fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org#endif 11487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 11497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 11507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Save the message for reporting if the the exception remains uncaught. 11527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->has_pending_message_ = report_exception; 11537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Do not forget to clean catcher_ if currently thrown exception cannot 11557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // be caught. If necessary, ReThrow will update the catcher. 11567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->catcher_ = can_be_caught_externally ? 11577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org try_catch_handler() : NULL; 11587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1159ab7dad4f999df008b590c74c2fe3d2e2c67ef7ffjkummerow@chromium.org set_pending_exception(*exception_handle); 11607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 11617304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1163fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.orgbool Isolate::HasExternalTryCatch() { 1164e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_pending_exception()); 11657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1166fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org return (thread_local_top()->catcher_ != NULL) && 1167fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org (try_catch_handler() == thread_local_top()->catcher_); 1168fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org} 11697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1171fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.orgbool Isolate::IsFinallyOnTop() { 11727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Get the address of the external handler so we can compare the address to 11737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // determine which one is closer to the top of the stack. 11747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Address external_handler_address = 11757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->try_catch_handler_address(); 1176e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(external_handler_address != NULL); 11777304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11787304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // The exception has been externally caught if and only if there is 11797304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // an external handler which is on top of the top-most try-finally 11807304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // handler. 11817304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // There should be no try-catch blocks as they would prohibit us from 11827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // finding external catcher in the first place (see catcher_ check above). 11837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // 11847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Note, that finally clause would rethrow an exception unless it's 11857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // aborted by jumps in control flow like return, break, etc. and we'll 11867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // have another chances to set proper v8::TryCatch. 11877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackHandler* handler = 11887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackHandler::FromAddress(Isolate::handler(thread_local_top())); 11897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org while (handler != NULL && handler->address() < external_handler_address) { 1190e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!handler->is_catch()); 1191fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org if (handler->is_finally()) return true; 11927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org handler = handler->next(); 11947304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 11957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1196fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org return false; 11977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 11987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 11997304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 12007304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::ReportPendingMessages() { 1201e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_pending_exception()); 1202fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org bool can_clear_message = PropagatePendingExceptionToExternalTryCatch(); 12037304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1204c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 1205474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (thread_local_top_.pending_exception_ == heap()->termination_exception()) { 12067304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Do nothing: if needed, the exception has been already propagated to 12077304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // v8::TryCatch. 12087304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else { 12097304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (thread_local_top_.has_pending_message_) { 12107304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top_.has_pending_message_ = false; 12117304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (!thread_local_top_.pending_message_obj_->IsTheHole()) { 1212c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 121309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object> message_obj(thread_local_top_.pending_message_obj_, 121409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org this); 121593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org if (!thread_local_top_.pending_message_script_->IsTheHole()) { 121693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Handle<Script> script( 121793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Script::cast(thread_local_top_.pending_message_script_)); 12187304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int start_pos = thread_local_top_.pending_message_start_pos_; 12197304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int end_pos = thread_local_top_.pending_message_end_pos_; 12207304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MessageLocation location(script, start_pos, end_pos); 12217304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MessageHandler::ReportMessage(this, &location, message_obj); 12227304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else { 12237304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org MessageHandler::ReportMessage(this, NULL, message_obj); 12247304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 12257304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 12267304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 12277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1228fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org if (can_clear_message) clear_pending_message(); 12297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 12307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 12317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 123249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.orgMessageLocation Isolate::GetMessageLocation() { 1233e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_pending_exception()); 123449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org 1235a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (thread_local_top_.pending_exception_ != heap()->termination_exception() && 123649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org thread_local_top_.has_pending_message_ && 123749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org !thread_local_top_.pending_message_obj_->IsTheHole() && 123893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org !thread_local_top_.pending_message_obj_->IsTheHole()) { 123993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Handle<Script> script( 124093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org Script::cast(thread_local_top_.pending_message_script_)); 124149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org int start_pos = thread_local_top_.pending_message_start_pos_; 124249a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org int end_pos = thread_local_top_.pending_message_end_pos_; 124349a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org return MessageLocation(script, start_pos, end_pos); 124449a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org } 124549a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org 124649a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org return MessageLocation(); 124749a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org} 124849a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org 124949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org 12507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgbool Isolate::OptionalRescheduleException(bool is_bottom_call) { 1251e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_pending_exception()); 12527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org PropagatePendingExceptionToExternalTryCatch(); 12537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1254a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org bool is_termination_exception = 1255a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org pending_exception() == heap_.termination_exception(); 12567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1257a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org // Do not reschedule the exception if this is the bottom call. 1258a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org bool clear_exception = is_bottom_call; 12597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1260a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (is_termination_exception) { 1261a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (is_bottom_call) { 12627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->external_caught_exception_ = false; 12637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org clear_pending_exception(); 12647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return false; 12657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 1266a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } else if (thread_local_top()->external_caught_exception_) { 1267a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org // If the exception is externally caught, clear it if there are no 1268a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org // JavaScript frames on the way to the C++ frame that has the 1269a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org // external handler. 1270e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(thread_local_top()->try_catch_handler_address() != NULL); 1271a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Address external_handler_address = 1272a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org thread_local_top()->try_catch_handler_address(); 1273a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org JavaScriptFrameIterator it(this); 1274a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (it.done() || (it.frame()->sp() > external_handler_address)) { 1275a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org clear_exception = true; 1276a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } 1277a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } 1278a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 1279a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org // Clear the exception if needed. 1280a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (clear_exception) { 1281a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org thread_local_top()->external_caught_exception_ = false; 1282a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org clear_pending_exception(); 1283a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org return false; 12847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 12857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 12867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org // Reschedule the exception. 12877304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->scheduled_exception_ = pending_exception(); 12887304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org clear_pending_exception(); 12897304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return true; 12907304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 12917304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 12927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 12935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvoid Isolate::PushPromise(Handle<JSObject> promise) { 12945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org ThreadLocalTop* tltop = thread_local_top(); 12955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org PromiseOnStack* prev = tltop->promise_on_stack_; 12965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org StackHandler* handler = StackHandler::FromAddress(Isolate::handler(tltop)); 12975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Handle<JSObject> global_handle = 12985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Handle<JSObject>::cast(global_handles()->Create(*promise)); 12995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org tltop->promise_on_stack_ = new PromiseOnStack(handler, global_handle, prev); 13005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 13015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 13025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 13035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvoid Isolate::PopPromise() { 13045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org ThreadLocalTop* tltop = thread_local_top(); 13055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (tltop->promise_on_stack_ == NULL) return; 13065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org PromiseOnStack* prev = tltop->promise_on_stack_->prev(); 13075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Handle<Object> global_handle = tltop->promise_on_stack_->promise(); 13085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org delete tltop->promise_on_stack_; 13095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org tltop->promise_on_stack_ = prev; 13105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org global_handles()->Destroy(global_handle.location()); 13115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 13125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 13135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 13145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgHandle<Object> Isolate::GetPromiseOnStackOnThrow() { 13155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org Handle<Object> undefined = factory()->undefined_value(); 13165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org ThreadLocalTop* tltop = thread_local_top(); 13175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (tltop->promise_on_stack_ == NULL) return undefined; 13185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org StackHandler* promise_try = tltop->promise_on_stack_->handler(); 13195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // Find the top-most try-catch handler. 13205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org StackHandler* handler = StackHandler::FromAddress(Isolate::handler(tltop)); 13215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org do { 13225e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org if (handler == promise_try) { 13235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // Mark the pushed try-catch handler to prevent a later duplicate event 13245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // triggered with the following reject. 13255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return tltop->promise_on_stack_->promise(); 13265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 13275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org handler = handler->next(); 13285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // Throwing inside a Promise can be intercepted by an inner try-catch, so 13295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org // we stop at the first try-catch handler. 13305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } while (handler != NULL && !handler->is_catch()); 13315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return undefined; 13325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org} 13335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 13345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 13357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid Isolate::SetCaptureStackTraceForUncaughtExceptions( 13367304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org bool capture, 13377304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org int frame_limit, 13387304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org StackTrace::StackTraceOptions options) { 13397304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org capture_stack_trace_for_uncaught_exceptions_ = capture; 13407304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_for_uncaught_exceptions_frame_limit_ = frame_limit; 13417304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org stack_trace_for_uncaught_exceptions_options_ = options; 13427304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 13437304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13447304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 134546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgHandle<Context> Isolate::native_context() { 134658a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org return handle(context()->native_context()); 13477304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 13487304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13497304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1350355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.orgHandle<Context> Isolate::global_context() { 135158a725587734a6889c689668fd01f0157ed749a6machenbach@chromium.org return handle(context()->global_object()->global_context()); 1352355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org} 1353355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 1354355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org 135546839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgHandle<Context> Isolate::GetCallingNativeContext() { 1356c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org JavaScriptFrameIterator it(this); 1357196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org if (debug_->in_debug_scope()) { 13587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org while (!it.done()) { 13597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org JavaScriptFrame* frame = it.frame(); 13607304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Context* context = Context::cast(frame->context()); 136146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org if (context->native_context() == *debug_->debug_context()) { 13627304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org it.Advance(); 13637304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else { 13647304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org break; 13657304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 13667304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 13677304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 13687304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (it.done()) return Handle<Context>::null(); 13697304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org JavaScriptFrame* frame = it.frame(); 13707304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Context* context = Context::cast(frame->context()); 137146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org return Handle<Context>(context->native_context()); 13727304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 13737304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13747304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13757304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgchar* Isolate::ArchiveThread(char* to) { 1376d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemCopy(to, reinterpret_cast<char*>(thread_local_top()), 1377d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org sizeof(ThreadLocalTop)); 13787304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org InitializeThreadLocal(); 1379a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org clear_pending_exception(); 1380a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org clear_pending_message(); 1381a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org clear_scheduled_exception(); 13827304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return to + sizeof(ThreadLocalTop); 13837304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 13847304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13857304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13867304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgchar* Isolate::RestoreThread(char* from) { 1387d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org MemCopy(reinterpret_cast<char*>(thread_local_top()), from, 1388d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org sizeof(ThreadLocalTop)); 1389d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// This might be just paranoia, but it seems to be needed in case a 1390d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org// thread_local_top_ is restored on a separate OS thread. 13917304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#ifdef USE_SIMULATOR 13927304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org thread_local_top()->simulator_ = Simulator::current(this); 13937304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org#endif 1394e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(context() == NULL || context()->IsContext()); 13957304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return from + sizeof(ThreadLocalTop); 13967304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org} 13977304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 13987304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org 1399ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate::ThreadDataTable::ThreadDataTable() 1400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org : list_(NULL) { 1401ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1402ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1403ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 14047c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgIsolate::ThreadDataTable::~ThreadDataTable() { 14057c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org // TODO(svenpanne) The assertion below would fire if an embedder does not 14067c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org // cleanly dispose all Isolates before disposing v8, so we are conservative 14077c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org // and leave it out for now. 1408e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org // DCHECK_EQ(NULL, list_); 14097c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org} 14107c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 14117c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 1412f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgIsolate::PerIsolateThreadData::~PerIsolateThreadData() { 1413f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#if defined(USE_SIMULATOR) 1414f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org delete simulator_; 1415f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org#endif 1416f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 1417f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1418f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate::PerIsolateThreadData* 1420a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org Isolate::ThreadDataTable::Lookup(Isolate* isolate, 1421a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org ThreadId thread_id) { 1422ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (PerIsolateThreadData* data = list_; data != NULL; data = data->next_) { 1423ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (data->Matches(isolate, thread_id)) return data; 1424ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return NULL; 1426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1428ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::ThreadDataTable::Insert(Isolate::PerIsolateThreadData* data) { 1430ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (list_ != NULL) list_->prev_ = data; 1431ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org data->next_ = list_; 1432ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org list_ = data; 1433ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1434ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1435ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1436ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::ThreadDataTable::Remove(PerIsolateThreadData* data) { 1437ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (list_ == data) list_ = data->next_; 1438ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (data->next_ != NULL) data->next_->prev_ = data->prev_; 1439ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (data->prev_ != NULL) data->prev_->next_ = data->next_; 144028a37086dc5bb171203246e0d9701882d56d6e81rossberg@chromium.org delete data; 1441ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1442ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1443ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1444e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.orgvoid Isolate::ThreadDataTable::RemoveAllThreads(Isolate* isolate) { 1445e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org PerIsolateThreadData* data = list_; 1446e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org while (data != NULL) { 1447e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org PerIsolateThreadData* next = data->next_; 1448e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org if (data->isolate() == isolate) Remove(data); 1449e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org data = next; 1450e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 1451e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org} 1452e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 1453e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 1454ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#ifdef DEBUG 1455ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define TRACE_ISOLATE(tag) \ 1456ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org do { \ 1457ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (FLAG_trace_isolates) { \ 1458750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org PrintF("Isolate %p (id %d)" #tag "\n", \ 1459750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org reinterpret_cast<void*>(this), id()); \ 1460ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } \ 1461ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } while (false) 1462ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#else 1463ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define TRACE_ISOLATE(tag) 1464ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 1465ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1466ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1467ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate::Isolate() 14687ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org : embedder_data_(), 14697ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org state_(UNINITIALIZED), 1470ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org entry_stack_(NULL), 1471ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stack_trace_nesting_level_(0), 1472ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org incomplete_message_(NULL), 1473ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bootstrapper_(NULL), 1474ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org runtime_profiler_(NULL), 1475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org compilation_cache_(NULL), 14767c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org counters_(NULL), 1477ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_range_(NULL), 14787c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org logger_(NULL), 14797c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org stats_table_(NULL), 1480ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stub_cache_(NULL), 14815924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org code_aging_helper_(NULL), 1482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org deoptimizer_data_(NULL), 148357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org materialized_object_store_(NULL), 1484ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org capture_stack_trace_for_uncaught_exceptions_(false), 1485ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stack_trace_for_uncaught_exceptions_frame_limit_(0), 1486ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stack_trace_for_uncaught_exceptions_options_(StackTrace::kOverview), 1487ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org memory_allocator_(NULL), 1488ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org keyed_lookup_cache_(NULL), 1489ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org context_slot_cache_(NULL), 1490ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org descriptor_lookup_cache_(NULL), 1491ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org handle_scope_implementer_(NULL), 1492a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org unicode_cache_(NULL), 1493c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org runtime_zone_(this), 1494c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner_pointer_to_code_cache_(NULL), 14954cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org write_iterator_(NULL), 1496ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org global_handles_(NULL), 1497594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org eternal_handles_(NULL), 1498ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org thread_manager_(NULL), 149927bf28851c1fa362a3f7c709871c21dcc9c23ce7ricow@chromium.org has_installed_extensions_(false), 1500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org string_tracker_(NULL), 1501ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org regexp_stack_(NULL), 15024efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org date_cache_(NULL), 15039aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org call_descriptor_data_(NULL), 1504c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // TODO(bmeurer) Initialized lazily because it depends on flags; can 1505c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // be fixed once the default isolate cleanup is done. 1506c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org random_number_generator_(NULL), 1507fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org serializer_enabled_(false), 1508e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org has_fatal_error_(false), 15091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org initialized_from_snapshot_(false), 1510f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org cpu_profiler_(NULL), 1511f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org heap_profiler_(NULL), 15121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org function_entry_hook_(NULL), 1513304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred_handles_head_(NULL), 15148e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org optimizing_compiler_thread_(NULL), 1515bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org sweeper_thread_(NULL), 15169af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org num_sweeper_threads_(0), 1517f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org stress_deopt_count_(0), 1518165e3bef8364106ea0c47f3c21920aae5a7d9e46jochen@chromium.org next_optimization_id_(0), 1519165e3bef8364106ea0c47f3c21920aae5a7d9e46jochen@chromium.org use_counter_callback_(NULL) { 1520a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org { 1521a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 1522a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org CHECK(thread_data_table_); 1523a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 15241e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org id_ = base::NoBarrier_AtomicIncrement(&isolate_counter_, 1); 1525ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org TRACE_ISOLATE(constructor); 1526ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1527ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org memset(isolate_addresses_, 0, 152883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org sizeof(isolate_addresses_[0]) * (kIsolateAddressCount + 1)); 1529ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_.isolate_ = this; 1531ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stack_guard_.isolate_ = this; 1532ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 15331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org // ThreadManager is initialized early to support locking an isolate 15341c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org // before it is entered. 15351c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org thread_manager_ = new ThreadManager(); 15361c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org thread_manager_->isolate_ = this; 15371c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 1538ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#ifdef DEBUG 1539ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // heap_histograms_ initializes itself. 1540ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org memset(&js_spill_information_, 0, sizeof(js_spill_information_)); 1541ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 1542ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1543ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org handle_scope_data_.Initialize(); 1544ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1545ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define ISOLATE_INIT_EXECUTE(type, name, initial_value) \ 1546ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org name##_ = (initial_value); 1547ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ISOLATE_INIT_LIST(ISOLATE_INIT_EXECUTE) 1548ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#undef ISOLATE_INIT_EXECUTE 1549ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1550ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define ISOLATE_INIT_ARRAY_EXECUTE(type, name, length) \ 1551ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org memset(name##_, 0, sizeof(type) * length); 1552ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ISOLATE_INIT_ARRAY_LIST(ISOLATE_INIT_ARRAY_EXECUTE) 1553ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#undef ISOLATE_INIT_ARRAY_EXECUTE 1554af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org 1555af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org InitializeLoggingAndCounters(); 1556af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org debug_ = new Debug(this); 1557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1559e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 1560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::TearDown() { 1561ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org TRACE_ISOLATE(tear_down); 1562ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1563ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Temporarily set this isolate as current so that various parts of 1564ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // the isolate can access it in their destructors without having a 1565ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // direct pointer. We don't use Enter/Exit here to avoid 1566ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // initializing the thread data. 1567ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData(); 1568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* saved_isolate = UncheckedCurrent(); 1569ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SetIsolateThreadLocals(this, NULL); 1570ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1571ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Deinit(); 1572ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1573d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org { 1574a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org base::LockGuard<base::Mutex> lock_guard(thread_data_table_mutex_.Pointer()); 15758c0a43f09f145d9fc6f969d559873018176eeb6adanno@chromium.org thread_data_table_->RemoveAllThreads(this); 1576e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org } 1577e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 15785a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (serialize_partial_snapshot_cache_ != NULL) { 15795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org delete[] serialize_partial_snapshot_cache_; 15805a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org serialize_partial_snapshot_cache_ = NULL; 15815a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 15825a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 15833c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org delete this; 1584ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1585ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Restore the previous current isolate. 1586ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SetIsolateThreadLocals(saved_isolate, saved_data); 1587ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1588ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 15907c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgvoid Isolate::GlobalTearDown() { 15917c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org delete thread_data_table_; 1592fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org thread_data_table_ = NULL; 15937c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org} 15947c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 15957c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org 1596ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::Deinit() { 1597ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (state_ == INITIALIZED) { 1598ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org TRACE_ISOLATE(deinit); 1599ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 16007e6132b924829c353864933f29124419916db550machenbach@chromium.org debug()->Unload(); 16017e6132b924829c353864933f29124419916db550machenbach@chromium.org 16025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org FreeThreadResources(); 16035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 16049af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (concurrent_recompilation_enabled()) { 16058e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org optimizing_compiler_thread_->Stop(); 16068e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org delete optimizing_compiler_thread_; 16079af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org optimizing_compiler_thread_ = NULL; 16088e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org } 1609750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 16109af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org for (int i = 0; i < num_sweeper_threads_; i++) { 16119af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeper_thread_[i]->Stop(); 16129af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org delete sweeper_thread_[i]; 16139af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeper_thread_[i] = NULL; 1614e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org } 16159af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org delete[] sweeper_thread_; 16169af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeper_thread_ = NULL; 16179af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 1618f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (FLAG_job_based_sweeping && 1619d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org heap_.mark_compact_collector()->sweeping_in_progress()) { 1620d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org heap_.mark_compact_collector()->EnsureSweepingCompleted(); 1621f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1622e3b8d0fe80e858c990832db1233c069f8b8cd5c9mstarzinger@chromium.org 16237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (FLAG_turbo_stats) GetTStatistics()->Print("TurboFan"); 16247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (FLAG_hydrogen_stats) GetHStatistics()->Print("Hydrogen"); 1625ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1626ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (FLAG_print_deopt_stress) { 1627ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org PrintF(stdout, "=== Stress deopt counter: %u\n", stress_deopt_count_); 1628ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1629ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // We must stop the logger before we tear down other components. 1631e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Sampler* sampler = logger_->sampler(); 1632e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (sampler && sampler->IsActive()) sampler->Stop(); 1633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete deoptimizer_data_; 1635ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org deoptimizer_data_ = NULL; 1636ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org builtins_.TearDown(); 1637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bootstrapper_->TearDown(); 1638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1639ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (runtime_profiler_ != NULL) { 1640ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete runtime_profiler_; 1641ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org runtime_profiler_ = NULL; 1642ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_.TearDown(); 1644ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org logger_->TearDown(); 1645ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1646e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org delete heap_profiler_; 1647e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org heap_profiler_ = NULL; 1648e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org delete cpu_profiler_; 1649e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org cpu_profiler_ = NULL; 1650e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1651ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // The default isolate is re-initializable due to legacy API. 16527c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org state_ = UNINITIALIZED; 1653ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1654ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1655ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1656ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 16575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgvoid Isolate::PushToPartialSnapshotCache(Object* obj) { 16585a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org int length = serialize_partial_snapshot_cache_length(); 16595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org int capacity = serialize_partial_snapshot_cache_capacity(); 16605a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 16615a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (length >= capacity) { 16625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org int new_capacity = static_cast<int>((capacity + 10) * 1.2); 16635a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Object** new_array = new Object*[new_capacity]; 16645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org for (int i = 0; i < length; i++) { 16655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org new_array[i] = serialize_partial_snapshot_cache()[i]; 16665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 16675a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (capacity != 0) delete[] serialize_partial_snapshot_cache(); 16685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org set_serialize_partial_snapshot_cache(new_array); 16695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org set_serialize_partial_snapshot_cache_capacity(new_capacity); 16705a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 16715a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 16725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org serialize_partial_snapshot_cache()[length] = obj; 16735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org set_serialize_partial_snapshot_cache_length(length + 1); 16745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org} 16755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 16765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 1677ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::SetIsolateThreadLocals(Isolate* isolate, 1678ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PerIsolateThreadData* data) { 16795de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::Thread::SetThreadLocal(isolate_key_, isolate); 16805de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org base::Thread::SetThreadLocal(per_isolate_thread_data_key_, data); 1681ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1682ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1683ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1684ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgIsolate::~Isolate() { 1685ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org TRACE_ISOLATE(destructor); 1686ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1687c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org // Has to be called while counters_ are still alive 1688c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org runtime_zone_.DeleteKeptSegment(); 1689c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org 1690e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org // The entry stack must be empty when we get here. 1691e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry_stack_ == NULL || entry_stack_->previous_item == NULL); 169293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 169393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org delete entry_stack_; 169493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org entry_stack_ = NULL; 169593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 1696a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org delete unicode_cache_; 1697a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org unicode_cache_ = NULL; 1698ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 16994efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org delete date_cache_; 17004efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org date_cache_ = NULL; 17014efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org 17029aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org delete[] call_descriptor_data_; 17039aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org call_descriptor_data_ = NULL; 170426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 1705ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete regexp_stack_; 1706ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org regexp_stack_ = NULL; 1707ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1708ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete descriptor_lookup_cache_; 1709ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org descriptor_lookup_cache_ = NULL; 1710ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete context_slot_cache_; 1711ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org context_slot_cache_ = NULL; 1712ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete keyed_lookup_cache_; 1713ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org keyed_lookup_cache_ = NULL; 1714ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1715ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete stub_cache_; 1716ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stub_cache_ = NULL; 17175924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org delete code_aging_helper_; 17185924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org code_aging_helper_ = NULL; 1719ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete stats_table_; 1720ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stats_table_ = NULL; 1721ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 172257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org delete materialized_object_store_; 172357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org materialized_object_store_ = NULL; 172457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org 1725ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete logger_; 1726ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org logger_ = NULL; 1727ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1728ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete counters_; 1729ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org counters_ = NULL; 1730ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1731ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete handle_scope_implementer_; 1732ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org handle_scope_implementer_ = NULL; 1733ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1734ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete compilation_cache_; 1735ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org compilation_cache_ = NULL; 1736ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete bootstrapper_; 1737ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bootstrapper_ = NULL; 1738c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com delete inner_pointer_to_code_cache_; 1739c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner_pointer_to_code_cache_ = NULL; 17404cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org delete write_iterator_; 17414cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org write_iterator_ = NULL; 1742ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1743ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete thread_manager_; 1744ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org thread_manager_ = NULL; 1745ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1746ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete string_tracker_; 1747ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org string_tracker_ = NULL; 1748ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1749ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete memory_allocator_; 1750ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org memory_allocator_ = NULL; 1751ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete code_range_; 1752ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_range_ = NULL; 1753ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete global_handles_; 1754ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org global_handles_ = NULL; 1755594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org delete eternal_handles_; 1756594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org eternal_handles_ = NULL; 1757ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 175893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org delete string_stream_debug_object_cache_; 175993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org string_stream_debug_object_cache_ = NULL; 176093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 1761b645116853c677aca8a316381b87441ba6004f67danno@chromium.org delete external_reference_table_; 1762b645116853c677aca8a316381b87441ba6004f67danno@chromium.org external_reference_table_ = NULL; 1763b645116853c677aca8a316381b87441ba6004f67danno@chromium.org 1764c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org delete random_number_generator_; 1765c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org random_number_generator_ = NULL; 1766c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org 1767ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete debug_; 1768ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug_ = NULL; 1769ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1770ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1771ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1772ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::InitializeThreadLocal() { 17731c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org thread_local_top_.isolate_ = this; 1774ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org thread_local_top_.Initialize(); 1775ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1776ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1777ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1778fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.orgbool Isolate::PropagatePendingExceptionToExternalTryCatch() { 1779e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(has_pending_exception()); 178044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 1781fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org bool has_external_try_catch = HasExternalTryCatch(); 1782fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org if (!has_external_try_catch) { 1783fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org thread_local_top_.external_caught_exception_ = false; 1784fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org return true; 1785fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org } 178644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 1787fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org bool catchable_by_js = is_catchable_by_javascript(pending_exception()); 1788fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org if (catchable_by_js && IsFinallyOnTop()) { 1789fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org thread_local_top_.external_caught_exception_ = false; 1790fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org return false; 1791fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org } 179244bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 1793fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org thread_local_top_.external_caught_exception_ = true; 1794474e8b19cf12dc057572a8543864dd6586ee0a65machenbach@chromium.org if (thread_local_top_.pending_exception_ == heap()->termination_exception()) { 179544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org try_catch_handler()->can_continue_ = false; 179632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org try_catch_handler()->has_terminated_ = true; 179744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org try_catch_handler()->exception_ = heap()->null_value(); 179844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } else { 179993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org v8::TryCatch* handler = try_catch_handler(); 1800e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(thread_local_top_.pending_message_obj_->IsJSMessageObject() || 180193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top_.pending_message_obj_->IsTheHole()); 1802e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(thread_local_top_.pending_message_script_->IsScript() || 180393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org thread_local_top_.pending_message_script_->IsTheHole()); 180493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->can_continue_ = true; 180593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->has_terminated_ = false; 180693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->exception_ = pending_exception(); 180793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org // Propagate to the external try-catch only if we got an actual message. 1808fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org if (thread_local_top_.pending_message_obj_->IsTheHole()) return true; 180993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org 181093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->message_obj_ = thread_local_top_.pending_message_obj_; 181193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->message_script_ = thread_local_top_.pending_message_script_; 181293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->message_start_pos_ = thread_local_top_.pending_message_start_pos_; 181393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org handler->message_end_pos_ = thread_local_top_.pending_message_end_pos_; 181444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org } 1815fd703f3d69389b9129ab38adb1caeb2be7a21ecfmachenbach@chromium.org return true; 181644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org} 181744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 181844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 18197c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgvoid Isolate::InitializeLoggingAndCounters() { 18207c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (logger_ == NULL) { 1821c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org logger_ = new Logger(this); 18227c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 18237c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (counters_ == NULL) { 1824ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org counters_ = new Counters(this); 18257c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 18267c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org} 18277c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 18287c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1829ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool Isolate::Init(Deserializer* des) { 1830e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(state_ != INITIALIZED); 1831ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org TRACE_ISOLATE(init); 1832ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1833ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org stress_deopt_count_ = FLAG_deopt_every_n_times; 1834ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1835e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org has_fatal_error_ = false; 1836e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org 18371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (function_entry_hook() != NULL) { 18381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // When function entry hooking is in effect, we have to create the code 18391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // stubs from scratch to get entry hooks, rather than loading the previously 18401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // generated stubs from disk. 18411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // If this assert fires, the initialization path has regressed. 1842e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(des == NULL); 18431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 18441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1845ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // The initialization process does not handle memory exhaustion. 18465697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org DisallowAllocationFailure disallow_allocation_failure(this); 1847ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 18487c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org memory_allocator_ = new MemoryAllocator(this); 18497c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org code_range_ = new CodeRange(this); 18507c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 18512c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org // Safe after setting Heap::isolate_, and initializing StackGuard 18527c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org heap_.SetStackLimits(); 18537c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 185483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org#define ASSIGN_ELEMENT(CamelName, hacker_name) \ 185583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org isolate_addresses_[Isolate::k##CamelName##Address] = \ 185683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org reinterpret_cast<Address>(hacker_name##_address()); 185783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org FOR_EACH_ISOLATE_ADDRESS_NAME(ASSIGN_ELEMENT) 18581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#undef ASSIGN_ELEMENT 18597c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 18607c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org string_tracker_ = new StringTracker(); 18617c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org string_tracker_->isolate_ = this; 18627c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org compilation_cache_ = new CompilationCache(this); 18637c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org keyed_lookup_cache_ = new KeyedLookupCache(); 18647c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org context_slot_cache_ = new ContextSlotCache(); 18657c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org descriptor_lookup_cache_ = new DescriptorLookupCache(); 18667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org unicode_cache_ = new UnicodeCache(); 1867c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com inner_pointer_to_code_cache_ = new InnerPointerToCodeCache(this); 18684cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org write_iterator_ = new ConsStringIteratorOp(); 18697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org global_handles_ = new GlobalHandles(this); 1870594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org eternal_handles_ = new EternalHandles(); 1871c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org bootstrapper_ = new Bootstrapper(this); 18727c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org handle_scope_implementer_ = new HandleScopeImplementer(this); 18731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org stub_cache_ = new StubCache(this); 187457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org materialized_object_store_ = new MaterializedObjectStore(this); 18757c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org regexp_stack_ = new RegExpStack(); 18767c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org regexp_stack_->isolate_ = this; 18774efbdb18fa3063085682c44cc77cf5254cb3d75dsvenpanne@chromium.org date_cache_ = new DateCache(); 18789aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org call_descriptor_data_ = 18799aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org new CallInterfaceDescriptorData[CallDescriptors::NUMBER_OF_DESCRIPTORS]; 1880e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org cpu_profiler_ = new CpuProfiler(this); 1881e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org heap_profiler_ = new HeapProfiler(heap()); 1882ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1883ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Enable logging before setting up the heap 1884ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org logger_->SetUp(this); 1885ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1886ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Initialize other runtime facilities 1887ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#if defined(USE_SIMULATOR) 188812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || \ 188912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64 18901c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org Simulator::Initialize(this); 1891ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 1892ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 1893ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 18945924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org code_aging_helper_ = new CodeAgingHelper(); 18955924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org 1896ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org { // NOLINT 1897ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Ensure that the thread has a valid stack guard. The v8::Locker object 1898ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // will ensure this too, but we don't have to use lockers if we are only 1899ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // using one thread. 1900ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExecutionAccess lock(this); 1901ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org stack_guard_.InitThread(lock); 1902ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1903ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1904f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // SetUp the object heap. 1905e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!heap_.HasBeenSetUp()); 190609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org if (!heap_.SetUp()) { 19079768bf12a67dd4585cf1a62928708883161f64c3yangguo@chromium.org V8::FatalProcessOutOfMemory("heap setup"); 1908ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return false; 1909ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1910ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1911876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org deoptimizer_data_ = new DeoptimizerData(memory_allocator_); 191209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org 191309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org const bool create_heap_objects = (des == NULL); 191409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org if (create_heap_objects && !heap_.CreateHeapObjects()) { 191509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org V8::FatalProcessOutOfMemory("heap object creation"); 191609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org return false; 191709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org } 191809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org 19195a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (create_heap_objects) { 19205a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // Terminate the cache array with the sentinel so we can iterate. 19215a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org PushToPartialSnapshotCache(heap_.undefined_value()); 19225a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 19235a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 1924ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org InitializeThreadLocal(); 1925ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 1926ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bootstrapper_->Initialize(create_heap_objects); 1927e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org builtins_.SetUp(this, create_heap_objects); 1928ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1929ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org if (FLAG_log_internal_timer_events) { 19304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org set_event_logger(Logger::DefaultTimerEventsLogger); 1931ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } else { 19324c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org set_event_logger(Logger::EmptyTimerEventsLogger); 1933ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org } 1934ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org 19359af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org // Set default value if not yet set. 19369af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org // TODO(yangguo): move this to ResourceConstraints::ConfigureDefaults 19379af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org // once ResourceConstraints becomes an argument to the Isolate constructor. 19389af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (max_available_threads_ < 1) { 19399af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org // Choose the default between 1 and 4. 19405de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org max_available_threads_ = 19417b6dc58d68c4315b99f5ec3faf6927db3d0db913machenbach@chromium.org Max(Min(base::SysInfo::NumberOfProcessors(), 4), 1); 19429af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 19439af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 1944f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org if (!FLAG_job_based_sweeping) { 1945f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org num_sweeper_threads_ = 1946f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org SweeperThread::NumberOfThreads(max_available_threads_); 1947f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 19489af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 19499af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (FLAG_trace_hydrogen || FLAG_trace_hydrogen_stubs) { 19509af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org PrintF("Concurrent recompilation has been disabled for tracing.\n"); 19519af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } else if (OptimizingCompilerThread::Enabled(max_available_threads_)) { 19529af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org optimizing_compiler_thread_ = new OptimizingCompilerThread(this); 19539af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org optimizing_compiler_thread_->Start(); 19549af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 19559af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 19569af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org if (num_sweeper_threads_ > 0) { 19579af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeper_thread_ = new SweeperThread*[num_sweeper_threads_]; 19589af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org for (int i = 0; i < num_sweeper_threads_; i++) { 19599af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeper_thread_[i] = new SweeperThread(this); 19609af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org sweeper_thread_[i]->Start(); 19619af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 19629af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org } 19639af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org 1964ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // If we are deserializing, read the state into the now-empty heap. 19655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!create_heap_objects) { 19663d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org des->Deserialize(this); 1967ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1968812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org stub_cache_->Initialize(); 1969ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1970a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org // Finish initialization of ThreadLocal after deserialization is done. 1971a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org clear_pending_exception(); 1972a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org clear_pending_message(); 1973a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org clear_scheduled_exception(); 1974a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org 1975ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Deserializing may put strange things in the root array's copy of the 1976ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // stack guard. 1977ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org heap_.SetStackLimits(); 1978ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 197988d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // Quiet the heap NaN if needed on target platform. 198028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org if (!create_heap_objects) Assembler::QuietNaN(heap_.nan_value()); 198188d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org 1982ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org runtime_profiler_ = new RuntimeProfiler(this); 1983ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1984ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // If we are deserializing, log non-function code objects and compiled 1985ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // functions found in the snapshot. 19868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (!create_heap_objects && 1987f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org (FLAG_log_code || 1988f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org FLAG_ll_prof || 1989f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org FLAG_perf_jit_prof || 1990f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org FLAG_perf_basic_prof || 1991f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org logger_->is_logging_code_events())) { 1992c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org HandleScope scope(this); 1993ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(this, LogCodeObjects()); 1994ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org LOG(this, LogCompiledFunctions()); 1995ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1996ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1997efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, embedder_data_)), 1998efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org Internals::kIsolateEmbedderDataOffset); 1999efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org CHECK_EQ(static_cast<int>(OFFSET_OF(Isolate, heap_.roots_)), 2000efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org Internals::kIsolateRootsOffset); 20011e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org CHECK_EQ(static_cast<int>( 20021e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org OFFSET_OF(Isolate, heap_.amount_of_external_allocated_memory_)), 20031e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org Internals::kAmountOfExternalAllocatedMemoryOffset); 20041e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org CHECK_EQ(static_cast<int>(OFFSET_OF( 20051e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org Isolate, 20061e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org heap_.amount_of_external_allocated_memory_at_last_global_gc_)), 20071e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org Internals::kAmountOfExternalAllocatedMemoryAtLastGlobalGCOffset); 2008efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org 2009ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org state_ = INITIALIZED; 20105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org time_millis_at_init_ = base::OS::TimeCurrentMillis(); 2011a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 2012a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (!create_heap_objects) { 2013a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // Now that the heap is consistent, it's OK to generate the code for the 2014a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // deopt entry table that might have been referred to by optimized code in 2015a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // the snapshot. 2016a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org HandleScope scope(this); 2017a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Deoptimizer::EnsureCodeForDeoptimizationEntry( 20188432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org this, 2019a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org Deoptimizer::LAZY, 2020a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org kDeoptTableSerializeEntryCount - 1); 2021a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } 2022a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 2023fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org if (!serializer_enabled()) { 2024750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // Ensure that all stubs which need to be generated ahead of time, but 2025750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org // cannot be serialized into the snapshot have been generated. 2026068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org HandleScope scope(this); 20278432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org CodeStub::GenerateFPStubs(this); 2028e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(this); 20298432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org StubFailureTrampolineStub::GenerateAheadOfTime(this); 2030068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org } 2031068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 20321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org initialized_from_snapshot_ = (des != NULL); 20331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 2034ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return true; 2035ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2036ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2037ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 20387c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org// Initialized lazily to allow early 20397c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org// v8::V8::SetAddHistogramSampleFunction calls. 20407c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgStatsTable* Isolate::stats_table() { 20417c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org if (stats_table_ == NULL) { 20427c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org stats_table_ = new StatsTable; 20437c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 20447c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org return stats_table_; 20457c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org} 20467c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 20477c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 2048ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::Enter() { 2049ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* current_isolate = NULL; 2050ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PerIsolateThreadData* current_data = CurrentPerIsolateThreadData(); 2051ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (current_data != NULL) { 2052ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org current_isolate = current_data->isolate_; 2053e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(current_isolate != NULL); 2054ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (current_isolate == this) { 2055e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Current() == this); 2056e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry_stack_ != NULL); 2057e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry_stack_->previous_thread_data == NULL || 2058a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org entry_stack_->previous_thread_data->thread_id().Equals( 2059a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org ThreadId::Current())); 2060ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Same thread re-enters the isolate, no need to re-init anything. 2061ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org entry_stack_->entry_count++; 2062ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return; 2063ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2064ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 2065ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2066ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PerIsolateThreadData* data = FindOrAllocatePerThreadDataForThisThread(); 2067e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(data != NULL); 2068e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(data->isolate_ == this); 2069ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2070ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org EntryStackItem* item = new EntryStackItem(current_data, 2071ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org current_isolate, 2072ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org entry_stack_); 2073ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org entry_stack_ = item; 2074ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2075ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SetIsolateThreadLocals(this, data); 2076ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2077ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // In case it's the first time some thread enters the isolate. 2078ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org set_thread_id(data->thread_id()); 2079ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2080ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2081ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2082ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid Isolate::Exit() { 2083e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry_stack_ != NULL); 2084e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(entry_stack_->previous_thread_data == NULL || 2085a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org entry_stack_->previous_thread_data->thread_id().Equals( 2086a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org ThreadId::Current())); 2087ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2088ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (--entry_stack_->entry_count > 0) return; 2089ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2090e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(CurrentPerIsolateThreadData() != NULL); 2091e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(CurrentPerIsolateThreadData()->isolate_ == this); 2092ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2093ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Pop the stack. 2094ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org EntryStackItem* item = entry_stack_; 2095ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org entry_stack_ = item->previous_item; 2096ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2097ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PerIsolateThreadData* previous_thread_data = item->previous_thread_data; 2098ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* previous_isolate = item->previous_isolate; 2099ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2100ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org delete item; 2101ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Reinit the current thread for the isolate it was running before this one. 2103ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org SetIsolateThreadLocals(previous_isolate, previous_thread_data); 2104ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 2105ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2106ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2107304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid Isolate::LinkDeferredHandles(DeferredHandles* deferred) { 2108304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred->next_ = deferred_handles_head_; 2109304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (deferred_handles_head_ != NULL) { 2110304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred_handles_head_->previous_ = deferred; 2111304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 2112304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred_handles_head_ = deferred; 2113304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 2114304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 2115304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 2116304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid Isolate::UnlinkDeferredHandles(DeferredHandles* deferred) { 2117304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#ifdef DEBUG 2118304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org // In debug mode assert that the linked list is well-formed. 2119304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org DeferredHandles* deferred_iterator = deferred; 2120304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org while (deferred_iterator->previous_ != NULL) { 2121304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred_iterator = deferred_iterator->previous_; 2122304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 2123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(deferred_handles_head_ == deferred_iterator); 2124304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#endif 2125304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (deferred_handles_head_ == deferred) { 2126304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred_handles_head_ = deferred_handles_head_->next_; 2127304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 2128304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (deferred->next_ != NULL) { 2129304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred->next_->previous_ = deferred->previous_; 2130304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 2131304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org if (deferred->previous_ != NULL) { 2132304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org deferred->previous_->next_ = deferred->next_; 2133304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org } 2134304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} 2135304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 2136304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org 2137750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgHStatistics* Isolate::GetHStatistics() { 2138750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (hstatistics() == NULL) set_hstatistics(new HStatistics()); 2139750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return hstatistics(); 2140750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 2141750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 2142750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 21437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgHStatistics* Isolate::GetTStatistics() { 21447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (tstatistics() == NULL) set_tstatistics(new HStatistics()); 21457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return tstatistics(); 21467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 21477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 21487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 2149750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgHTracer* Isolate::GetHTracer() { 2150750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (htracer() == NULL) set_htracer(new HTracer(id())); 2151750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return htracer(); 2152750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} 2153750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 2154750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 2155e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgCodeTracer* Isolate::GetCodeTracer() { 2156e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (code_tracer() == NULL) set_code_tracer(new CodeTracer(id())); 2157e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return code_tracer(); 2158e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 2159e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 2160e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 2161906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgMap* Isolate::get_initial_js_array_map(ElementsKind kind) { 2162906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Context* native_context = context()->native_context(); 2163906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Object* maybe_map_array = native_context->js_array_maps(); 2164906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (!maybe_map_array->IsUndefined()) { 2165906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Object* maybe_transitioned_map = 2166906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org FixedArray::cast(maybe_map_array)->get(kind); 2167906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (!maybe_transitioned_map->IsUndefined()) { 2168906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org return Map::cast(maybe_transitioned_map); 2169906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org } 2170906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org } 2171906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org return NULL; 2172906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org} 2173906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 2174906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 2175fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.orgbool Isolate::use_crankshaft() const { 2176fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org return FLAG_crankshaft && 2177fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org !serializer_enabled_ && 2178fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CpuFeatures::SupportsCrankshaft(); 2179fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org} 2180fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org 2181fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org 2182906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgbool Isolate::IsFastArrayConstructorPrototypeChainIntact() { 2183906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org Map* root_array_map = 2184906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org get_initial_js_array_map(GetInitialFastElementsKind()); 2185e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(root_array_map != NULL); 2186906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org JSObject* initial_array_proto = JSObject::cast(*initial_array_prototype()); 2187906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 2188906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Check that the array prototype hasn't been altered WRT empty elements. 2189906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (root_array_map->prototype() != initial_array_proto) return false; 2190906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (initial_array_proto->elements() != heap()->empty_fixed_array()) { 2191906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org return false; 2192906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org } 2193906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 2194906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org // Check that the object prototype hasn't been altered WRT empty elements. 2195906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org JSObject* initial_object_proto = JSObject::cast(*initial_object_prototype()); 219693720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org PrototypeIterator iter(this, initial_array_proto); 219793720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org if (iter.IsAtEnd() || iter.GetCurrent() != initial_object_proto) { 219893720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org return false; 219993720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org } 2200906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org if (initial_object_proto->elements() != heap()->empty_fixed_array()) { 2201906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org return false; 2202906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org } 2203906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 220493720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org iter.Advance(); 220593720aaa16a789ba13d52a265a479b26f4885e2emachenbach@chromium.org return iter.IsAtEnd(); 2206906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org} 2207906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 2208906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org 22099aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.orgCallInterfaceDescriptorData* Isolate::call_descriptor_data(int index) { 22109aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org DCHECK(0 <= index && index < CallDescriptors::NUMBER_OF_DESCRIPTORS); 22119aaa825cf89e1bcfece269a453300ebf4a26d64dmachenbach@chromium.org return &call_descriptor_data_[index]; 221226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org} 221326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 221426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org 2215ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgObject* Isolate::FindCodeObject(Address a) { 2216ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return inner_pointer_to_code_cache()->GcSafeFindCodeForInnerPointer(a); 2217ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} 2218ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 2219ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 2220ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#ifdef DEBUG 2221ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#define ISOLATE_FIELD_OFFSET(type, name, ignored) \ 2222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_); 2223ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET) 2224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET) 2225ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#undef ISOLATE_FIELD_OFFSET 2226ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#endif 2227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2228a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 2229a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.orgHandle<JSObject> Isolate::GetSymbolRegistry() { 2230a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if (heap()->symbol_registry()->IsUndefined()) { 2231a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Handle<Map> map = factory()->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); 2232a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Handle<JSObject> registry = factory()->NewJSObjectFromMap(map); 2233a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org heap()->set_symbol_registry(*registry); 2234a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 2235a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org static const char* nested[] = { 2236a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org "for", "for_api", "for_intern", "keyFor", "private_api", "private_intern" 2237a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org }; 2238fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org for (unsigned i = 0; i < arraysize(nested); ++i) { 2239a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Handle<String> name = factory()->InternalizeUtf8String(nested[i]); 2240a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Handle<JSObject> obj = factory()->NewJSObjectFromMap(map); 2241a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org JSObject::NormalizeProperties(obj, KEEP_INOBJECT_PROPERTIES, 8); 22429bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org JSObject::SetProperty(registry, name, obj, STRICT).Assert(); 2243a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } 2244a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org } 2245a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org return Handle<JSObject>::cast(factory()->symbol_registry()); 2246a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org} 2247a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 2248a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org 2249865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid Isolate::AddCallCompletedCallback(CallCompletedCallback callback) { 2250865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org for (int i = 0; i < call_completed_callbacks_.length(); i++) { 2251865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org if (callback == call_completed_callbacks_.at(i)) return; 2252865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } 2253865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org call_completed_callbacks_.Add(callback); 2254865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org} 2255865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 2256865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 2257865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid Isolate::RemoveCallCompletedCallback(CallCompletedCallback callback) { 2258865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org for (int i = 0; i < call_completed_callbacks_.length(); i++) { 2259865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org if (callback == call_completed_callbacks_.at(i)) { 2260865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org call_completed_callbacks_.Remove(i); 2261865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } 2262865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } 2263865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org} 2264865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 2265865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 2266865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.orgvoid Isolate::FireCallCompletedCallback() { 2267865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org bool has_call_completed_callbacks = !call_completed_callbacks_.is_empty(); 226854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org bool run_microtasks = autorun_microtasks() && pending_microtask_count(); 2269865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org if (!has_call_completed_callbacks && !run_microtasks) return; 2270865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 2271865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org if (!handle_scope_implementer()->CallDepthIsZero()) return; 227254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org if (run_microtasks) RunMicrotasks(); 2273865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org // Fire callbacks. Increase call depth to prevent recursive callbacks. 2274e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org v8::Isolate::SuppressMicrotaskExecutionScope suppress( 2275e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org reinterpret_cast<v8::Isolate*>(this)); 2276865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org for (int i = 0; i < call_completed_callbacks_.length(); i++) { 2277865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org call_completed_callbacks_.at(i)(); 2278865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org } 2279865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org} 2280865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 2281865f51ff8c94f86f4c97636d70addc0f29e79674machenbach@chromium.org 228238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.orgvoid Isolate::EnqueueMicrotask(Handle<Object> microtask) { 2283e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(microtask->IsJSFunction() || microtask->IsCallHandlerInfo()); 228454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<FixedArray> queue(heap()->microtask_queue(), this); 228554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org int num_tasks = pending_microtask_count(); 2286e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(num_tasks <= queue->length()); 228754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org if (num_tasks == 0) { 228854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org queue = factory()->NewFixedArray(8); 228954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org heap()->set_microtask_queue(*queue); 229054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org } else if (num_tasks == queue->length()) { 229154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org queue = FixedArray::CopySize(queue, num_tasks * 2); 229254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org heap()->set_microtask_queue(*queue); 229354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org } 2294e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(queue->get(num_tasks)->IsUndefined()); 229554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org queue->set(num_tasks, *microtask); 229654ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org set_pending_microtask_count(num_tasks + 1); 229754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org} 2298c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 229954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 230054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.orgvoid Isolate::RunMicrotasks() { 2301a661862aff457c468f28f7efcfd1e7476eb2068dmachenbach@chromium.org // %RunMicrotasks may be called in mjsunit tests, which violates 2302a661862aff457c468f28f7efcfd1e7476eb2068dmachenbach@chromium.org // this assertion, hence the check for --allow-natives-syntax. 2303a661862aff457c468f28f7efcfd1e7476eb2068dmachenbach@chromium.org // TODO(adamk): However, this also fails some layout tests. 2304a661862aff457c468f28f7efcfd1e7476eb2068dmachenbach@chromium.org // 2305e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org // DCHECK(FLAG_allow_natives_syntax || 2306a661862aff457c468f28f7efcfd1e7476eb2068dmachenbach@chromium.org // handle_scope_implementer()->CallDepthIsZero()); 2307c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 2308c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org // Increase call depth to prevent recursive callbacks. 2309e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org v8::Isolate::SuppressMicrotaskExecutionScope suppress( 2310e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org reinterpret_cast<v8::Isolate*>(this)); 231154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 231254ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org while (pending_microtask_count() > 0) { 231354ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org HandleScope scope(this); 231454ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org int num_tasks = pending_microtask_count(); 231554ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org Handle<FixedArray> queue(heap()->microtask_queue(), this); 2316e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(num_tasks <= queue->length()); 231754ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org set_pending_microtask_count(0); 231854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org heap()->set_microtask_queue(heap()->empty_fixed_array()); 231954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org 232054ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org for (int i = 0; i < num_tasks; i++) { 232154ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org HandleScope scope(this); 232238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org Handle<Object> microtask(queue->get(i), this); 232338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org if (microtask->IsJSFunction()) { 232438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org Handle<JSFunction> microtask_function = 232538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org Handle<JSFunction>::cast(microtask); 2326975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org SaveContext save(this); 2327975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org set_context(microtask_function->context()->native_context()); 2328ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MaybeHandle<Object> maybe_exception; 2329ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org MaybeHandle<Object> result = 2330ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Execution::TryCall(microtask_function, factory()->undefined_value(), 2331ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org 0, NULL, &maybe_exception); 233238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org // If execution is terminating, just bail out. 2333ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org Handle<Object> exception; 2334ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org if (result.is_null() && maybe_exception.is_null()) { 233538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org // Clear out any remaining callbacks in the queue. 233638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org heap()->set_microtask_queue(heap()->empty_fixed_array()); 233738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org set_pending_microtask_count(0); 233838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org return; 233938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org } 234038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org } else { 234138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org Handle<CallHandlerInfo> callback_info = 234238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org Handle<CallHandlerInfo>::cast(microtask); 234338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org v8::MicrotaskCallback callback = 234438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org v8::ToCData<v8::MicrotaskCallback>(callback_info->callback()); 234538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org void* data = v8::ToCData<void*>(callback_info->data()); 234638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org callback(data); 2347e31b63e9608909e17e35a3330b0075140af2fe91machenbach@chromium.org } 234854ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org } 234954ae5fb0902b9e1b89c178fa5a7ba4e1a74daa41machenbach@chromium.org } 2350c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org} 2351c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 2352c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org 2353975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgvoid Isolate::SetUseCounterCallback(v8::Isolate::UseCounterCallback callback) { 2354e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!use_counter_callback_); 2355975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org use_counter_callback_ = callback; 2356975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org} 2357975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 2358975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 2359975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgvoid Isolate::CountUsage(v8::Isolate::UseCounterFeature feature) { 2360975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org if (use_counter_callback_) { 2361975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org use_counter_callback_(reinterpret_cast<v8::Isolate*>(this), feature); 2362975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org } 2363975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org} 2364975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 2365975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org 23663ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgbool StackLimitCheck::JsHasOverflowed() const { 23673ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org StackGuard* stack_guard = isolate_->stack_guard(); 23683ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org#ifdef USE_SIMULATOR 23693ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org // The simulator uses a separate JS stack. 23703ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org Address jssp_address = Simulator::current(isolate_)->get_sp(); 23713ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org uintptr_t jssp = reinterpret_cast<uintptr_t>(jssp_address); 23723ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org if (jssp < stack_guard->real_jslimit()) return true; 23733ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org#endif // USE_SIMULATOR 2374d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return GetCurrentStackPosition() < stack_guard->real_climit(); 23753ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org} 23763ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org 23773ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org 2378d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgbool PostponeInterruptsScope::Intercept(StackGuard::InterruptFlag flag) { 2379d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // First check whether the previous scope intercepts. 2380d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (prev_ && prev_->Intercept(flag)) return true; 2381d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org // Then check whether this scope intercepts. 2382d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if ((flag & intercept_mask_)) { 2383d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org intercepted_flags_ |= flag; 2384d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return true; 2385d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org } 2386d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return false; 2387d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org} 2388d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 2389ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} } // namespace v8::internal 2390