156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <stdlib.h>
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "v8.h"
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "api.h"
3313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org#include "bootstrapper.h"
3444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org#include "codegen.h"
3537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com#include "debug.h"
36e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include "deoptimizer.h"
37c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com#include "isolate-inl.h"
38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "runtime-profiler.h"
39c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "simulator.h"
4037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com#include "v8threads.h"
41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "vm-state-inl.h"
4237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
4371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
4471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgStackGuard::StackGuard()
48ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    : isolate_(NULL) {
49ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
50ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid StackGuard::set_interrupt_limits(const ExecutionAccess& lock) {
53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(isolate_ != NULL);
54ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Ignore attempts to interrupt when interrupts are postponed.
55ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (should_postpone_interrupts(lock)) return;
56ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.jslimit_ = kInterruptLimit;
57ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.climit_ = kInterruptLimit;
58ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
59ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
60ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
61ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid StackGuard::reset_limits(const ExecutionAccess& lock) {
63ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(isolate_ != NULL);
64ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.jslimit_ = thread_local_.real_jslimit_;
65ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.climit_ = thread_local_.real_climit_;
66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
67ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
68ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
69ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
70a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.orgstatic Handle<Object> Invoke(bool is_construct,
71a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                             Handle<JSFunction> function,
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                             Handle<Object> receiver,
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                             int argc,
74a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                             Handle<Object> args[],
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                             bool* has_pending_exception) {
76a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Isolate* isolate = function->GetIsolate();
77ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Entering JavaScript.
79ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  VMState<JS> state(isolate);
8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Placeholder for return value.
82303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  MaybeObject* value = reinterpret_cast<Object*>(kZapValue);
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  typedef Object* (*JSEntryFunction)(byte* entry,
85a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     Object* function,
86a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     Object* receiver,
87a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     int argc,
88a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     Object*** args);
8943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
90a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Code> code = is_construct
91a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org      ? isolate->factory()->js_construct_entry_code()
92a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org      : isolate->factory()->js_entry_code();
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
948d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  // Convert calls on global objects to be calls on the global
958d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  // receiver instead to avoid having a 'this' pointer which refers
968d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  // directly to a global object.
978d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  if (receiver->IsGlobalObject()) {
988d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org    Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver);
998d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org    receiver = Handle<JSObject>(global->global_receiver());
1008d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  }
1018d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org
1027b9eafd3a796ae40fdd9b130bb931c71c8a622d2kasperl@chromium.org  // Make sure that the global object of the context we're about to
1037b9eafd3a796ae40fdd9b130bb931c71c8a622d2kasperl@chromium.org  // make the current one is indeed a global object.
10446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  ASSERT(function->context()->global_object()->IsGlobalObject());
1057b9eafd3a796ae40fdd9b130bb931c71c8a622d2kasperl@chromium.org
10644510671e908d0efc639513d81efcd81e7f14240kasper.lund  {
10744510671e908d0efc639513d81efcd81e7f14240kasper.lund    // Save and restore context around invocation and block the
10843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // allocation of handles without explicit handle scopes.
109ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    SaveContext save(isolate);
11079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org    SealHandleScope shs(isolate);
111a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry());
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Call the function through the right JS entry stub.
114a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    byte* function_entry = function->code()->entry();
115a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    JSFunction* func = *function;
116a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Object* recv = *receiver;
117a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Object*** argv = reinterpret_cast<Object***>(args);
118a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    value =
119a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org        CALL_GENERATED_CODE(stub_entry, function_entry, func, recv, argc, argv);
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
122c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  value->Verify();
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Update the pending exception flag and return the value.
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  *has_pending_exception = value->IsException();
12809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  ASSERT(*has_pending_exception == isolate->has_pending_exception());
1295a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org  if (*has_pending_exception) {
130ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->ReportPendingMessages();
13159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org    if (isolate->pending_exception()->IsOutOfMemory()) {
1327c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org      if (!isolate->ignore_out_of_memory()) {
1333a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org        V8::FatalProcessOutOfMemory("JS", true);
1343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org      }
1353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org    }
13681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
13781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    // Reset stepping state when script exits with uncaught exception.
13881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    if (isolate->debugger()->IsDebuggerActive()) {
13981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      isolate->debug()->ClearStepping();
14081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    }
14181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#endif  // ENABLE_DEBUGGER_SUPPORT
1423bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org    return Handle<Object>();
1438bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  } else {
144ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->clear_pending_message();
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
147ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return Handle<Object>(value->ToObjectUnchecked(), isolate);
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
151c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.orgHandle<Object> Execution::Call(Handle<Object> callable,
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                               Handle<Object> receiver,
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                               int argc,
154a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                               Handle<Object> argv[],
15534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org                               bool* pending_exception,
15634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org                               bool convert_receiver) {
157c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  *pending_exception = false;
158c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
159c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  if (!callable->IsJSFunction()) {
160c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    callable = TryGetFunctionDelegate(callable, pending_exception);
161c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org    if (*pending_exception) return callable;
162c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
163c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  Handle<JSFunction> func = Handle<JSFunction>::cast(callable);
16434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
16534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // In non-strict mode, convert receiver.
16634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (convert_receiver && !receiver->IsJSReceiver() &&
1671b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org      !func->shared()->native() && func->shared()->is_classic_mode()) {
16834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    if (receiver->IsUndefined() || receiver->IsNull()) {
16946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      Object* global = func->context()->global_object()->global_receiver();
17034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      // Under some circumstances, 'global' can be the JSBuiltinsObject
17146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      // In that case, don't rewrite.  (FWIW, the same holds for
17246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      // GetIsolate()->global_object()->global_receiver().)
17309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      if (!global->IsJSBuiltinsObject()) {
17409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        receiver = Handle<Object>(global, func->GetIsolate());
17509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      }
17634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    } else {
17734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      receiver = ToObject(receiver, pending_exception);
17834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    }
17934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    if (*pending_exception) return callable;
18034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
18134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
182a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  return Invoke(false, func, receiver, argc, argv, pending_exception);
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.orgHandle<Object> Execution::New(Handle<JSFunction> func,
187a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                              int argc,
188a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                              Handle<Object> argv[],
189a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                              bool* pending_exception) {
19009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  return Invoke(true, func, func->GetIsolate()->global_object(), argc, argv,
191ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org                pending_exception);
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::TryCall(Handle<JSFunction> func,
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  Handle<Object> receiver,
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  int argc,
198a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                  Handle<Object> args[],
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  bool* caught_exception) {
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Enter a try-block while executing the JavaScript code. To avoid
2019258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // duplicate error printing it must be non-verbose.  Also, to avoid
2029258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // creating message objects during stack overflow we shouldn't
2039258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // capture messages.
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  v8::TryCatch catcher;
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  catcher.SetVerbose(false);
2069258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  catcher.SetCaptureMessage(false);
207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  *caught_exception = false;
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
209594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Get isolate now, because handle might be persistent
210594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // and get destroyed in the next call.
211594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  Isolate* isolate = func->GetIsolate();
21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Object> result = Invoke(false, func, receiver, argc, args,
21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                 caught_exception);
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (*caught_exception) {
21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(catcher.HasCaught());
217ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ASSERT(isolate->has_pending_exception());
218ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ASSERT(isolate->external_caught_exception());
21949a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    if (isolate->is_out_of_memory() && !isolate->ignore_out_of_memory()) {
22049a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org      V8::FatalProcessOutOfMemory("OOM during Execution::TryCall");
22149a44674c6935d62c3e776dfbf896b7f6f34228ammassi@chromium.org    }
222ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (isolate->pending_exception() ==
223ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        isolate->heap()->termination_exception()) {
224ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      result = isolate->factory()->termination_exception();
22518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    } else {
22618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org      result = v8::Utils::OpenHandle(*catcher.Exception());
22718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    }
228ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->OptionalRescheduleException(true);
22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  ASSERT(!isolate->has_pending_exception());
23209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  ASSERT(!isolate->external_caught_exception());
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::GetFunctionDelegate(Handle<Object> object) {
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!object->IsJSFunction());
239c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = Isolate::Current();
240c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Factory* factory = isolate->factory();
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If you return a function from here, it will be called when an
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // attempt is made to call the given object as a function.
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxy, get its handler. Iterate if necessary.
24634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
24734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
24834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
24934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
25009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
25134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Objects created through the API can have an instance-call handler
25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // that should be used when calling the object as a function.
25434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
25534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Handle<JSFunction>(
25746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_function_delegate());
25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
260c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return factory->undefined_value();
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2641c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgHandle<Object> Execution::TryGetFunctionDelegate(Handle<Object> object,
2651c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org                                                 bool* has_pending_exception) {
2661c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  ASSERT(!object->IsJSFunction());
2671c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  Isolate* isolate = Isolate::Current();
2681c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
26934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxy, get its handler. Iterate if necessary.
27034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
27134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
27234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
27334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
27409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
27534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
2761c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // Objects created through the API can have an instance-call handler
2771c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // that should be used when calling the object as a function.
27834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
27934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
2801c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    return Handle<JSFunction>(
28146839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_function_delegate());
2821c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
2831c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2841c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // If the Object doesn't have an instance-call handler we should
2851c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // throw a non-callable exception.
2861c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError(
2871c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      "called_non_callable", i::HandleVector<i::Object>(&object, 1));
2881c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  isolate->Throw(*error_obj);
2891c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  *has_pending_exception = true;
2901c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2911c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  return isolate->factory()->undefined_value();
2921c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org}
2931c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2941c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
29505521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.orgHandle<Object> Execution::GetConstructorDelegate(Handle<Object> object) {
29605521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  ASSERT(!object->IsJSFunction());
297c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = Isolate::Current();
29805521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
29905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // If you return a function from here, it will be called when an
30005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // attempt is made to call the given object as a constructor.
30105521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
30234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxies, get its handler. Iterate if necessary.
30334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
30434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
30534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
30634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
30709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
30834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
30905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // Objects created through the API can have an instance-call handler
31005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // that should be used when calling the object as a function.
31134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
31234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
31305521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org    return Handle<JSFunction>(
31446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_constructor_delegate());
31505521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  }
31605521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
317c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return isolate->factory()->undefined_value();
31805521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org}
31905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
32005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
3211c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgHandle<Object> Execution::TryGetConstructorDelegate(
3221c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    Handle<Object> object,
3231c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    bool* has_pending_exception) {
3241c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  ASSERT(!object->IsJSFunction());
3251c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  Isolate* isolate = Isolate::Current();
3261c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3271c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // If you return a function from here, it will be called when an
3281c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // attempt is made to call the given object as a constructor.
3291c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
33034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxies, get its handler. Iterate if necessary.
33134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
33234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
33334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
33434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
33509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
33634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
3371c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // Objects created through the API can have an instance-call handler
3381c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // that should be used when calling the object as a function.
33934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
34034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
3411c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    return Handle<JSFunction>(
34246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_constructor_delegate());
3431c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
3441c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3451c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // If the Object doesn't have an instance-call handler we should
3461c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // throw a non-callable exception.
3471c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError(
3481c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      "called_non_callable", i::HandleVector<i::Object>(&object, 1));
3491c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  isolate->Throw(*error_obj);
3501c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  *has_pending_exception = true;
3511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3521c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  return isolate->factory()->undefined_value();
3531c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org}
3541c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3551c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool StackGuard::IsStackOverflow() {
357ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return (thread_local_.jslimit_ != kInterruptLimit &&
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          thread_local_.climit_ != kInterruptLimit);
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::EnableInterrupts() {
364ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
365b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  if (has_pending_interrupts(access)) {
366b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org    set_interrupt_limits(access);
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::SetStackLimit(uintptr_t limit) {
372ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
3732efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  // If the current limits are special (e.g. due to a pending interrupt) then
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // leave them alone.
3751c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  uintptr_t jslimit = SimulatorStack::JsLimitFromCLimit(isolate_, limit);
376c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (thread_local_.jslimit_ == thread_local_.real_jslimit_) {
377c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    thread_local_.jslimit_ = jslimit;
37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
379c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (thread_local_.climit_ == thread_local_.real_climit_) {
38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    thread_local_.climit_ = limit;
38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
382c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  thread_local_.real_climit_ = limit;
383c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  thread_local_.real_jslimit_ = jslimit;
38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::DisableInterrupts() {
388ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  reset_limits(access);
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
393bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.combool StackGuard::ShouldPostponeInterrupts() {
394bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  ExecutionAccess access(isolate_);
395bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  return should_postpone_interrupts(access);
396bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
397bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
398bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool StackGuard::IsInterrupted() {
400ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
401c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return (thread_local_.interrupt_flags_ & INTERRUPT) != 0;
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::Interrupt() {
406ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  thread_local_.interrupt_flags_ |= INTERRUPT;
408b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  set_interrupt_limits(access);
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool StackGuard::IsPreempted() {
413ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return thread_local_.interrupt_flags_ & PREEMPT;
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::Preempt() {
419ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  thread_local_.interrupt_flags_ |= PREEMPT;
421b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  set_interrupt_limits(access);
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
425c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.orgbool StackGuard::IsTerminateExecution() {
426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
427c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return (thread_local_.interrupt_flags_ & TERMINATE) != 0;
428c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org}
429c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
430c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
43132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.orgvoid StackGuard::CancelTerminateExecution() {
43232d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  ExecutionAccess access(isolate_);
43332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  Continue(TERMINATE);
43432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  isolate_->CancelTerminateExecution();
43532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
43632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
43732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
438c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.orgvoid StackGuard::TerminateExecution() {
439ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
440c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  thread_local_.interrupt_flags_ |= TERMINATE;
441b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  set_interrupt_limits(access);
442c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org}
443c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
444c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org
445c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool StackGuard::IsGCRequest() {
446c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ExecutionAccess access(isolate_);
447c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return (thread_local_.interrupt_flags_ & GC_REQUEST) != 0;
448c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
449c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
450c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
451c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid StackGuard::RequestGC() {
452c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  ExecutionAccess access(isolate_);
453c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  thread_local_.interrupt_flags_ |= GC_REQUEST;
454c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (thread_local_.postpone_interrupts_nesting_ == 0) {
455c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    thread_local_.jslimit_ = thread_local_.climit_ = kInterruptLimit;
456c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    isolate_->heap()->SetStackLimits();
457c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
458c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
459c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
460c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
461e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool StackGuard::IsFullDeopt() {
462e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ExecutionAccess access(isolate_);
463e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  return (thread_local_.interrupt_flags_ & FULL_DEOPT) != 0;
464e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
465e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
466e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
467e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid StackGuard::FullDeopt() {
468e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  ExecutionAccess access(isolate_);
469e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  thread_local_.interrupt_flags_ |= FULL_DEOPT;
470e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  set_interrupt_limits(access);
471e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}
472e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
473e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
47465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool StackGuard::IsDebugBreak() {
476ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return thread_local_.interrupt_flags_ & DEBUGBREAK;
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48044510671e908d0efc639513d81efcd81e7f14240kasper.lund
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::DebugBreak() {
482ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
4837276f14ca716596e0a0d17539516370c1f453847kasper.lund  thread_local_.interrupt_flags_ |= DEBUGBREAK;
484b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  set_interrupt_limits(access);
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
488bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgbool StackGuard::IsDebugCommand() {
489ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
490bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  return thread_local_.interrupt_flags_ & DEBUGCOMMAND;
491bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
492bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
493bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
494bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvoid StackGuard::DebugCommand() {
495bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  if (FLAG_debugger_auto_break) {
496ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ExecutionAccess access(isolate_);
497bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    thread_local_.interrupt_flags_ |= DEBUGCOMMAND;
498b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org    set_interrupt_limits(access);
499bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  }
500bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}
50165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
502bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::Continue(InterruptFlag after_what) {
504ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  thread_local_.interrupt_flags_ &= ~static_cast<int>(after_what);
506b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  if (!should_postpone_interrupts(access) && !has_pending_interrupts(access)) {
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    reset_limits(access);
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StackGuard::ArchiveStackGuard(char* to) {
513ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
514e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  OS::MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal));
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ThreadLocal blank;
516ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
517ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Set the stack limits using the old thread_local_.
518ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // TODO(isolates): This was the old semantics of constructing a ThreadLocal
519ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  //                 (as the ctor called SetStackLimits, which looked at the
520ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  //                 current thread_local_ from StackGuard)-- but is this
521ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  //                 really what was intended?
522ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  thread_local_ = blank;
524ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return to + sizeof(ThreadLocal);
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StackGuard::RestoreStackGuard(char* from) {
530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
531e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  OS::MemCopy(
532e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      reinterpret_cast<char*>(&thread_local_), from, sizeof(ThreadLocal));
533ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return from + sizeof(ThreadLocal);
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
538c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::FreeThreadResources() {
539ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  Isolate::PerIsolateThreadData* per_thread =
540ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org      isolate_->FindOrAllocatePerThreadDataForThisThread();
541ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  per_thread->set_stack_limit(thread_local_.real_climit_);
542c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
543c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
544c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
545c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::ThreadLocal::Clear() {
546c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  real_jslimit_ = kIllegalLimit;
547c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  jslimit_ = kIllegalLimit;
548c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  real_climit_ = kIllegalLimit;
549c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  climit_ = kIllegalLimit;
550c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  nesting_ = 0;
551c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  postpone_interrupts_nesting_ = 0;
552c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  interrupt_flags_ = 0;
553c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
554c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
555c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
5561c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgbool StackGuard::ThreadLocal::Initialize(Isolate* isolate) {
557ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool should_set_stack_limits = false;
558c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (real_climit_ == kIllegalLimit) {
559c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    // Takes the address of the limit variable in order to find out where
560c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    // the top of stack is right now.
561496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    const uintptr_t kLimitSize = FLAG_stack_size * KB;
5629d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    uintptr_t limit = reinterpret_cast<uintptr_t>(&limit) - kLimitSize;
5639d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    ASSERT(reinterpret_cast<uintptr_t>(&limit) > kLimitSize);
5641c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    real_jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit);
5651c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit);
566c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    real_climit_ = limit;
567c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    climit_ = limit;
568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    should_set_stack_limits = true;
569c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  }
570c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  nesting_ = 0;
571c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  postpone_interrupts_nesting_ = 0;
572c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  interrupt_flags_ = 0;
573ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return should_set_stack_limits;
574c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
575c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
576c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
577c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::ClearThread(const ExecutionAccess& lock) {
578c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  thread_local_.Clear();
579ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
580c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
581c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
582c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
583c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::InitThread(const ExecutionAccess& lock) {
5841c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  if (thread_local_.Initialize(isolate_)) isolate_->heap()->SetStackLimits();
5851c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  Isolate::PerIsolateThreadData* per_thread =
5861c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      isolate_->FindOrAllocatePerThreadDataForThisThread();
5871c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  uintptr_t stored_limit = per_thread->stack_limit();
588c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  // You should hold the ExecutionAccess lock when you call this.
589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (stored_limit != 0) {
590ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    SetStackLimit(stored_limit);
591c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  }
592c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
593c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
594c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- C a l l s   t o   n a t i v e s ---
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
597a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org#define RETURN_NATIVE_CALL(name, args, has_pending_exception)           \
598a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  do {                                                                  \
599a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Isolate* isolate = Isolate::Current();                              \
600a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Handle<Object> argv[] = args;                                       \
601a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    ASSERT(has_pending_exception != NULL);                              \
602a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    return Call(isolate->name##_fun(),                                  \
603a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                isolate->js_builtins_object(),                          \
604a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                ARRAY_SIZE(argv), argv,                                 \
605a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                has_pending_exception);                                 \
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } while (false)
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToNumber(Handle<Object> obj, bool* exc) {
610a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_number, { obj }, exc);
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToString(Handle<Object> obj, bool* exc) {
615a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_string, { obj }, exc);
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToDetailString(Handle<Object> obj, bool* exc) {
620a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_detail_string, { obj }, exc);
62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToObject(Handle<Object> obj, bool* exc) {
62534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (obj->IsSpecObject()) return obj;
626a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_object, { obj }, exc);
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToInteger(Handle<Object> obj, bool* exc) {
631a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_integer, { obj }, exc);
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToUint32(Handle<Object> obj, bool* exc) {
636a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_uint32, { obj }, exc);
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::ToInt32(Handle<Object> obj, bool* exc) {
641a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(to_int32, { obj }, exc);
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::NewDate(double time, bool* exc) {
646d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Isolate* isolate = Isolate::Current();
647d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Object> time_obj = isolate->factory()->NewNumber(time);
648a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  RETURN_NATIVE_CALL(create_date, { time_obj }, exc);
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef RETURN_NATIVE_CALL
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
655b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgHandle<JSRegExp> Execution::NewJSRegExp(Handle<String> pattern,
656b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org                                        Handle<String> flags,
657b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org                                        bool* exc) {
658ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Handle<JSFunction> function = Handle<JSFunction>(
65946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      pattern->GetIsolate()->native_context()->regexp_function());
660b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  Handle<Object> re_obj = RegExpImpl::CreateRegExpLiteral(
661ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      function, pattern, flags, exc);
662b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  if (*exc) return Handle<JSRegExp>();
663b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  return Handle<JSRegExp>::cast(re_obj);
664b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org}
665b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
666b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::CharAt(Handle<String> string, uint32_t index) {
668c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = string->GetIsolate();
669c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Factory* factory = isolate->factory();
670c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int int_index = static_cast<int>(index);
67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (int_index < 0 || int_index >= string->length()) {
673c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    return factory->undefined_value();
67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6764a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  Handle<Object> char_at = GetProperty(
6774a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      isolate, isolate->js_builtins_object(), factory->char_at_string());
67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!char_at->IsJSFunction()) {
679c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    return factory->undefined_value();
68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  bool caught_exception;
683c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Handle<Object> index_object = factory->NewNumberFromInt(int_index);
684a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> index_arg[] = { index_object };
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Handle<Object> result = TryCall(Handle<JSFunction>::cast(char_at),
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  string,
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  ARRAY_SIZE(index_arg),
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  index_arg,
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  &caught_exception);
69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (caught_exception) {
691c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    return factory->undefined_value();
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<JSFunction> Execution::InstantiateFunction(
698a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Handle<FunctionTemplateInfo> data,
699a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    bool* exc) {
700c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = data->GetIsolate();
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Fast case: see if the function has already been instantiated
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int serial_number = Smi::cast(data->serial_number())->value();
703ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Object* elm =
70446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      isolate->native_context()->function_cache()->
705ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org          GetElementNoExceptionThrown(serial_number);
7063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm));
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The function has not yet been instantiated in this context; do it.
708a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> args[] = { data };
709a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> result = Call(isolate->instantiate_fun(),
710a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                               isolate->js_builtins_object(),
711a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                               ARRAY_SIZE(args),
712a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                               args,
713a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                               exc);
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (*exc) return Handle<JSFunction>::null();
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Handle<JSFunction>::cast(result);
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<JSObject> Execution::InstantiateObject(Handle<ObjectTemplateInfo> data,
72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                              bool* exc) {
721c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = data->GetIsolate();
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (data->property_list()->IsUndefined() &&
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      !data->constructor()->IsUndefined()) {
724bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    // Initialization to make gcc happy.
725bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    Object* result = NULL;
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    {
727c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org      HandleScope scope(isolate);
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Handle<FunctionTemplateInfo> cons_template =
72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen          Handle<FunctionTemplateInfo>(
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen              FunctionTemplateInfo::cast(data->constructor()));
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Handle<JSFunction> cons = InstantiateFunction(cons_template, exc);
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (*exc) return Handle<JSObject>::null();
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Handle<Object> value = New(cons, 0, NULL, exc);
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      if (*exc) return Handle<JSObject>::null();
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      result = *value;
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(!*exc);
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Handle<JSObject>(JSObject::cast(result));
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
740a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Handle<Object> args[] = { data };
741a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Handle<Object> result = Call(isolate->instantiate_fun(),
742a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                 isolate->js_builtins_object(),
743a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                 ARRAY_SIZE(args),
744a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                 args,
745a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                 exc);
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (*exc) return Handle<JSObject>::null();
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Handle<JSObject>::cast(result);
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Execution::ConfigureInstance(Handle<Object> instance,
75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  Handle<Object> instance_template,
75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                  bool* exc) {
755c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = Isolate::Current();
756a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> args[] = { instance, instance_template };
757c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Execution::Call(isolate->configure_instance_fun(),
758a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  isolate->js_builtins_object(),
759a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  ARRAY_SIZE(args),
760a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  args,
761a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                  exc);
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<String> Execution::GetStackTraceLine(Handle<Object> recv,
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            Handle<JSFunction> fun,
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            Handle<Object> pos,
76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            Handle<Object> is_global) {
769c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = fun->GetIsolate();
770a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> args[] = { recv, fun, pos, is_global };
771c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  bool caught_exception;
772a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> result = TryCall(isolate->get_stack_trace_line_fun(),
773a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                  isolate->js_builtins_object(),
774a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                  ARRAY_SIZE(args),
775a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                  args,
776a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                  &caught_exception);
777c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  if (caught_exception || !result->IsString()) {
7784a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      return isolate->factory()->empty_string();
779c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
780c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Handle<String>::cast(result);
78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comstatic Object* RuntimePreempt() {
786ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate = Isolate::Current();
787ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
78837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Clear the preempt request flag.
789ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate->stack_guard()->Continue(PREEMPT);
79037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
79137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  ContextSwitcher::PreemptionReceived();
79237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
79365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
794ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (isolate->debug()->InDebugger()) {
7957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    // If currently in the debugger don't do any actual preemption but record
7967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    // that preemption occoured while in the debugger.
797ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->debug()->PreemptionWhileInDebugger();
7987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org  } else {
7997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org    // Perform preemption.
8001c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    v8::Unlocker unlocker(reinterpret_cast<v8::Isolate*>(isolate));
80137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    Thread::YieldCPU();
80237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
80365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#else
804ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  { // NOLINT
805ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    // Perform preemption.
8061c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    v8::Unlocker unlocker(reinterpret_cast<v8::Isolate*>(isolate));
807ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Thread::YieldCPU();
808ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  }
80965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
81037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
811ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return isolate->heap()->undefined_value();
81237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
81337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
81437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
81565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
81637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comObject* Execution::DebugBreakHelper() {
817ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Isolate* isolate = Isolate::Current();
818ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
81937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Just continue if breaks are disabled.
820ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (isolate->debug()->disable_break()) {
821ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return isolate->heap()->undefined_value();
82237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
82337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
82413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  // Ignore debug break during bootstrapping.
825ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (isolate->bootstrapper()->IsActive()) {
826ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return isolate->heap()->undefined_value();
82713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org  }
82813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org
82928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  // Ignore debug break if debugger is not active.
83028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  if (!isolate->debugger()->IsDebuggerActive()) {
83128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org    return isolate->heap()->undefined_value();
83228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org  }
83328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org
8347d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  StackLimitCheck check(isolate);
8357d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  if (check.HasOverflowed()) {
8367d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    return isolate->heap()->undefined_value();
8377d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
8387d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
839e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  {
84074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org    JavaScriptFrameIterator it(isolate);
841e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org    ASSERT(!it.done());
842e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org    Object* fun = it.frame()->function();
843e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org    if (fun && fun->IsJSFunction()) {
844e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org      // Don't stop in builtin functions.
8450b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org      if (JSFunction::cast(fun)->IsBuiltin()) {
846ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return isolate->heap()->undefined_value();
847e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org      }
84846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      GlobalObject* global = JSFunction::cast(fun)->context()->global_object();
849e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org      // Don't stop in debugger functions.
850ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      if (isolate->debug()->IsDebugGlobal(global)) {
851ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org        return isolate->heap()->undefined_value();
852e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org      }
853e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org    }
854e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org  }
855e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org
856755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Collect the break state before clearing the flags.
857bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  bool debug_command_only =
858ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      isolate->stack_guard()->IsDebugCommand() &&
859ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      !isolate->stack_guard()->IsDebugBreak();
860bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
861b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Clear the debug break request flag.
862ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate->stack_guard()->Continue(DEBUGBREAK);
863b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
864f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  ProcessDebugMessages(debug_command_only);
865b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
866b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Return to continue execution.
867ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return isolate->heap()->undefined_value();
868b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
869b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
870e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
871f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid Execution::ProcessDebugMessages(bool debug_command_only) {
872c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = Isolate::Current();
873b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  // Clear the debug command request flag.
874c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  isolate->stack_guard()->Continue(DEBUGCOMMAND);
875bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org
8767d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  StackLimitCheck check(isolate);
8777d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  if (check.HasOverflowed()) {
8787d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org    return;
8797d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org  }
8807d10be581a91ab5eefa1139ff0b86c64ac8f6e59fschneider@chromium.org
881c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  HandleScope scope(isolate);
88237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  // Enter the debugger. Just continue if we fail to enter the debugger.
88337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  EnterDebugger debugger;
88437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (debugger.FailedToEnter()) {
885b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    return;
88637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
88737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
888755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // Notify the debug event listeners. Indicate auto continue if the break was
889755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org  // a debug command break.
890c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  isolate->debugger()->OnDebugBreak(isolate->factory()->undefined_value(),
891c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org                                    debug_command_only);
89237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
893b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
894b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
89565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
89637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
897812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgMaybeObject* Execution::HandleStackGuardInterrupt(Isolate* isolate) {
898ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  StackGuard* stack_guard = isolate->stack_guard();
899bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  if (stack_guard->ShouldPostponeInterrupts()) {
900bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    return isolate->heap()->undefined_value();
901bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
902c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
903c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (stack_guard->IsGCRequest()) {
9043233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org    isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
9053233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org                                       "StackGuard GC request");
906c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    stack_guard->Continue(GC_REQUEST);
907c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
908c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
909ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate->counters()->stack_interrupts()->Increment();
910cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org  isolate->counters()->runtime_profiler_ticks()->Increment();
911cddc71f18a46e6117cc765b1c53ca122e7aaa318rossberg@chromium.org  isolate->runtime_profiler()->OptimizeNow();
91265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT
913ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (stack_guard->IsDebugBreak() || stack_guard->IsDebugCommand()) {
914bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    DebugBreakHelper();
915bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  }
91665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org#endif
917ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (stack_guard->IsPreempted()) RuntimePreempt();
918ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (stack_guard->IsTerminateExecution()) {
919ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    stack_guard->Continue(TERMINATE);
920ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return isolate->TerminateExecution();
921c81c894dabeceb472d668027ca59e73096f5cfafsgjesse@chromium.org  }
922ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (stack_guard->IsInterrupted()) {
923ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    stack_guard->Continue(INTERRUPT);
924ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    return isolate->StackOverflow();
92537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
926e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  if (stack_guard->IsFullDeopt()) {
927e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    stack_guard->Continue(FULL_DEOPT);
928e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    Deoptimizer::DeoptimizeAll(isolate);
929e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  }
930ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return isolate->heap()->undefined_value();
93137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
93237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
93356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
935