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