12f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
22f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
32f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org// found in the LICENSE file.
42f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/execution.h"
62f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bootstrapper.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/codegen.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/deoptimizer.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate-inl.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/vm-state-inl.h"
1237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
1371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgStackGuard::StackGuard()
17ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    : isolate_(NULL) {
18ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
19ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
20ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
21ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid StackGuard::set_interrupt_limits(const ExecutionAccess& lock) {
22ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(isolate_ != NULL);
23ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Ignore attempts to interrupt when interrupts are postponed.
24ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (should_postpone_interrupts(lock)) return;
25ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.jslimit_ = kInterruptLimit;
26ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.climit_ = kInterruptLimit;
27ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
29ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
30ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
31ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgvoid StackGuard::reset_limits(const ExecutionAccess& lock) {
32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(isolate_ != NULL);
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.jslimit_ = thread_local_.real_jslimit_;
34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  thread_local_.climit_ = thread_local_.real_climit_;
35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
37ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMUST_USE_RESULT static MaybeHandle<Object> Invoke(
402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    bool is_construct,
412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<JSFunction> function,
422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<Object> receiver,
432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    int argc,
442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<Object> args[]) {
45a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Isolate* isolate = function->GetIsolate();
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Entering JavaScript.
48ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  VMState<JS> state(isolate);
495697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  CHECK(AllowJavascriptExecution::IsAllowed(isolate));
505697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  if (!ThrowOnJavascriptExecution::IsAllowed(isolate)) {
515697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    isolate->ThrowIllegalOperation();
525697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org    isolate->ReportPendingMessages();
532ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return MaybeHandle<Object>();
545697144afb43181fed170b81c194fe1cc0fce3b6machenbach@chromium.org  }
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Placeholder for return value.
57a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  Object* value = NULL;
5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  typedef Object* (*JSEntryFunction)(byte* entry,
60a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     Object* function,
61a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     Object* receiver,
62a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     int argc,
63a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                                     Object*** args);
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Code> code = is_construct
66a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org      ? isolate->factory()->js_construct_entry_code()
67a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org      : isolate->factory()->js_entry_code();
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
698d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  // Convert calls on global objects to be calls on the global
708d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  // receiver instead to avoid having a 'this' pointer which refers
718d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  // directly to a global object.
728d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  if (receiver->IsGlobalObject()) {
738d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org    Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver);
748d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org    receiver = Handle<JSObject>(global->global_receiver());
758d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org  }
768d96e6d90778041ec5681fece475f7a0c22650ddsgjesse@chromium.org
777b9eafd3a796ae40fdd9b130bb931c71c8a622d2kasperl@chromium.org  // Make sure that the global object of the context we're about to
787b9eafd3a796ae40fdd9b130bb931c71c8a622d2kasperl@chromium.org  // make the current one is indeed a global object.
7946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org  ASSERT(function->context()->global_object()->IsGlobalObject());
807b9eafd3a796ae40fdd9b130bb931c71c8a622d2kasperl@chromium.org
8144510671e908d0efc639513d81efcd81e7f14240kasper.lund  {
8244510671e908d0efc639513d81efcd81e7f14240kasper.lund    // Save and restore context around invocation and block the
8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // allocation of handles without explicit handle scopes.
84ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    SaveContext save(isolate);
8579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org    SealHandleScope shs(isolate);
86a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry());
8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // Call the function through the right JS entry stub.
89a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    byte* function_entry = function->code()->entry();
90a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    JSFunction* func = *function;
91a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Object* recv = *receiver;
92a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Object*** argv = reinterpret_cast<Object***>(args);
93a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    value =
94a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org        CALL_GENERATED_CODE(stub_entry, function_entry, func, recv, argc, argv);
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
98a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  value->ObjectVerify();
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Update the pending exception flag and return the value.
1022ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  bool has_exception = value->IsException();
1032ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  ASSERT(has_exception == isolate->has_pending_exception());
1042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (has_exception) {
105ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->ReportPendingMessages();
10681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    // Reset stepping state when script exits with uncaught exception.
107d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    if (isolate->debug()->is_active()) {
10881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      isolate->debug()->ClearStepping();
10981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org    }
1102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return MaybeHandle<Object>();
1118bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org  } else {
112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->clear_pending_message();
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115b67f96038c787a6bd6a835e6c436c82e1b245486machenbach@chromium.org  return Handle<Object>(value, isolate);
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::Call(Isolate* isolate,
1202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                    Handle<Object> callable,
1212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                    Handle<Object> receiver,
1222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                    int argc,
1232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                    Handle<Object> argv[],
1242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                    bool convert_receiver) {
125c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  if (!callable->IsJSFunction()) {
1262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    ASSIGN_RETURN_ON_EXCEPTION(
1272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        isolate, callable, TryGetFunctionDelegate(isolate, callable), Object);
128c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  }
129c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org  Handle<JSFunction> func = Handle<JSFunction>::cast(callable);
13034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
131486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  // In sloppy mode, convert receiver.
13234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (convert_receiver && !receiver->IsJSReceiver() &&
133486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      !func->shared()->native() &&
134486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      func->shared()->strict_mode() == SLOPPY) {
13534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    if (receiver->IsUndefined() || receiver->IsNull()) {
13646839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      Object* global = func->context()->global_object()->global_receiver();
13734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      // Under some circumstances, 'global' can be the JSBuiltinsObject
13846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      // In that case, don't rewrite.  (FWIW, the same holds for
13946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      // GetIsolate()->global_object()->global_receiver().)
14009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      if (!global->IsJSBuiltinsObject()) {
14109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org        receiver = Handle<Object>(global, func->GetIsolate());
14209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org      }
14334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    } else {
1442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      ASSIGN_RETURN_ON_EXCEPTION(
1452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org          isolate, receiver, ToObject(isolate, receiver), Object);
14634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    }
14734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
14834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
1492ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return Invoke(false, func, receiver, argc, argv);
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1532ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::New(Handle<JSFunction> func,
1542ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                   int argc,
1552ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                   Handle<Object> argv[]) {
1562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return Invoke(true, func, func->GetIsolate()->global_object(), argc, argv);
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1602ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func,
1612ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                       Handle<Object> receiver,
1622ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                       int argc,
1632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                       Handle<Object> args[],
1642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                       Handle<Object>* exception_out) {
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Enter a try-block while executing the JavaScript code. To avoid
1669258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // duplicate error printing it must be non-verbose.  Also, to avoid
1679258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // creating message objects during stack overflow we shouldn't
1689258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  // capture messages.
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  v8::TryCatch catcher;
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  catcher.SetVerbose(false);
1719258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org  catcher.SetCaptureMessage(false);
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
173594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Get isolate now, because handle might be persistent
174594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // and get destroyed in the next call.
175594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  Isolate* isolate = func->GetIsolate();
1762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  MaybeHandle<Object> maybe_result = Invoke(false, func, receiver, argc, args);
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1782ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (maybe_result.is_null()) {
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(catcher.HasCaught());
180ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ASSERT(isolate->has_pending_exception());
181ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    ASSERT(isolate->external_caught_exception());
1822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    if (exception_out != NULL) {
1832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      if (isolate->pending_exception() ==
1842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org          isolate->heap()->termination_exception()) {
1852ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        *exception_out = isolate->factory()->termination_exception();
1862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      } else {
1872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        *exception_out = v8::Utils::OpenHandle(*catcher.Exception());
1882ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      }
18918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org    }
190ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    isolate->OptionalRescheduleException(true);
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  ASSERT(!isolate->has_pending_exception());
19409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  ASSERT(!isolate->external_caught_exception());
1952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return maybe_result;
19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
19743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
199e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.orgHandle<Object> Execution::GetFunctionDelegate(Isolate* isolate,
200e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org                                              Handle<Object> object) {
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(!object->IsJSFunction());
202c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Factory* factory = isolate->factory();
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // If you return a function from here, it will be called when an
20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // attempt is made to call the given object as a function.
20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxy, get its handler. Iterate if necessary.
20834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
20934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
21034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
21134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
21209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
21334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Objects created through the API can have an instance-call handler
21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // that should be used when calling the object as a function.
21634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
21734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
21843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    return Handle<JSFunction>(
21946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_function_delegate());
22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
222c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return factory->undefined_value();
22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::TryGetFunctionDelegate(Isolate* isolate,
2272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                                      Handle<Object> object) {
2281c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  ASSERT(!object->IsJSFunction());
2291c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
23034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxy, get its handler. Iterate if necessary.
23134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
23234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
23334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
23434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
23509d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
23634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
2371c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // Objects created through the API can have an instance-call handler
2381c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // that should be used when calling the object as a function.
23934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
24034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
2411c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    return Handle<JSFunction>(
24246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_function_delegate());
2431c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
2441c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2451c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // If the Object doesn't have an instance-call handler we should
2461c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // throw a non-callable exception.
2471c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError(
2481c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      "called_non_callable", i::HandleVector<i::Object>(&object, 1));
2491c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2502ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return isolate->Throw<Object>(error_obj);
2511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org}
2521c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2531c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
254e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.orgHandle<Object> Execution::GetConstructorDelegate(Isolate* isolate,
255e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org                                                 Handle<Object> object) {
25605521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  ASSERT(!object->IsJSFunction());
25705521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
25805521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // If you return a function from here, it will be called when an
25905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // attempt is made to call the given object as a constructor.
26005521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
26134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxies, get its handler. Iterate if necessary.
26234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
26334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
26434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
26534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
26609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
26734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
26805521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // Objects created through the API can have an instance-call handler
26905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  // that should be used when calling the object as a function.
27034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
27134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
27205521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org    return Handle<JSFunction>(
27346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_constructor_delegate());
27405521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org  }
27505521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
276c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  return isolate->factory()->undefined_value();
27705521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org}
27805521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
27905521fcc4bd495d3dc2b3ae7a6bc7e52ccb7937bsgjesse@chromium.org
2802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::TryGetConstructorDelegate(
2812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> object) {
2821c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  ASSERT(!object->IsJSFunction());
2831c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
2841c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // If you return a function from here, it will be called when an
2851c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // attempt is made to call the given object as a constructor.
2861c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
28734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  // If object is a function proxies, get its handler. Iterate if necessary.
28834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  Object* fun = *object;
28934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  while (fun->IsJSFunctionProxy()) {
29034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org    fun = JSFunctionProxy::cast(fun)->call_trap();
29134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  }
29209d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org  if (fun->IsJSFunction()) return Handle<Object>(fun, isolate);
29334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org
2941c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // Objects created through the API can have an instance-call handler
2951c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // that should be used when calling the object as a function.
29634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (fun->IsHeapObject() &&
29734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org      HeapObject::cast(fun)->map()->has_instance_call_handler()) {
2981c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    return Handle<JSFunction>(
29946839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org        isolate->native_context()->call_as_constructor_delegate());
3001c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  }
3011c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3021c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // If the Object doesn't have an instance-call handler we should
3031c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  // throw a non-callable exception.
3041c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  i::Handle<i::Object> error_obj = isolate->factory()->NewTypeError(
3051c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      "called_non_callable", i::HandleVector<i::Object>(&object, 1));
3062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return isolate->Throw<Object>(error_obj);
3071c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org}
3081c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3091c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::EnableInterrupts() {
311ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
312b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  if (has_pending_interrupts(access)) {
313b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org    set_interrupt_limits(access);
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::SetStackLimit(uintptr_t limit) {
319ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
3202efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org  // If the current limits are special (e.g. due to a pending interrupt) then
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // leave them alone.
3221c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  uintptr_t jslimit = SimulatorStack::JsLimitFromCLimit(isolate_, limit);
323c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (thread_local_.jslimit_ == thread_local_.real_jslimit_) {
324c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    thread_local_.jslimit_ = jslimit;
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
326c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (thread_local_.climit_ == thread_local_.real_climit_) {
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    thread_local_.climit_ = limit;
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
329c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  thread_local_.real_climit_ = limit;
330c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  thread_local_.real_jslimit_ = jslimit;
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid StackGuard::DisableInterrupts() {
335ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  reset_limits(access);
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3403c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgbool StackGuard::CheckInterrupt(int flagbit) {
341bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  ExecutionAccess access(isolate_);
3423c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  return thread_local_.interrupt_flags_ & flagbit;
343bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
344bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
345bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
3463c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgvoid StackGuard::RequestInterrupt(int flagbit) {
347ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
3483c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  thread_local_.interrupt_flags_ |= flagbit;
349b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  set_interrupt_limits(access);
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3533c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgvoid StackGuard::ClearInterrupt(int flagbit) {
354ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
3553c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  thread_local_.interrupt_flags_ &= ~flagbit;
356b6e43bb9b1cd7673592be9dfd0a036fe8dab4dcdwhesse@chromium.org  if (!should_postpone_interrupts(access) && !has_pending_interrupts(access)) {
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    reset_limits(access);
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3628d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.orgbool StackGuard::CheckAndClearInterrupt(InterruptFlag flag) {
3638d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  ExecutionAccess access(isolate_);
3643c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  int flagbit = 1 << flag;
3653c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  bool result = (thread_local_.interrupt_flags_ & flagbit);
3663c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  thread_local_.interrupt_flags_ &= ~flagbit;
3678d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (!should_postpone_interrupts(access) && !has_pending_interrupts(access)) {
3688d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    reset_limits(access);
369ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org  }
3703c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  return result;
371ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org}
372ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org
373ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StackGuard::ArchiveStackGuard(char* to) {
375ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
376d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MemCopy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal));
37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ThreadLocal blank;
378ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
379ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // Set the stack limits using the old thread_local_.
380ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  // TODO(isolates): This was the old semantics of constructing a ThreadLocal
381ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  //                 (as the ctor called SetStackLimits, which looked at the
382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  //                 current thread_local_ from StackGuard)-- but is this
383ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  //                 really what was intended?
384ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  thread_local_ = blank;
386ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return to + sizeof(ThreadLocal);
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenchar* StackGuard::RestoreStackGuard(char* from) {
392ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ExecutionAccess access(isolate_);
393d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  MemCopy(reinterpret_cast<char*>(&thread_local_), from, sizeof(ThreadLocal));
394ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return from + sizeof(ThreadLocal);
39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
399c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::FreeThreadResources() {
400ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  Isolate::PerIsolateThreadData* per_thread =
401ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org      isolate_->FindOrAllocatePerThreadDataForThisThread();
402ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org  per_thread->set_stack_limit(thread_local_.real_climit_);
403c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
404c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
405c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
406c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::ThreadLocal::Clear() {
407c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  real_jslimit_ = kIllegalLimit;
408c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  jslimit_ = kIllegalLimit;
409c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  real_climit_ = kIllegalLimit;
410c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  climit_ = kIllegalLimit;
411c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  nesting_ = 0;
412c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  postpone_interrupts_nesting_ = 0;
413c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  interrupt_flags_ = 0;
414c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
415c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
416c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
4171c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgbool StackGuard::ThreadLocal::Initialize(Isolate* isolate) {
418ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  bool should_set_stack_limits = false;
419c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  if (real_climit_ == kIllegalLimit) {
420c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    // Takes the address of the limit variable in order to find out where
421c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    // the top of stack is right now.
422496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org    const uintptr_t kLimitSize = FLAG_stack_size * KB;
4239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    uintptr_t limit = reinterpret_cast<uintptr_t>(&limit) - kLimitSize;
4249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    ASSERT(reinterpret_cast<uintptr_t>(&limit) > kLimitSize);
4251c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    real_jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit);
4261c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org    jslimit_ = SimulatorStack::JsLimitFromCLimit(isolate, limit);
427c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    real_climit_ = limit;
428c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org    climit_ = limit;
429ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    should_set_stack_limits = true;
430c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  }
431c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  nesting_ = 0;
432c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  postpone_interrupts_nesting_ = 0;
433c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  interrupt_flags_ = 0;
434ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  return should_set_stack_limits;
435c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
436c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
437c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
438c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::ClearThread(const ExecutionAccess& lock) {
439c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  thread_local_.Clear();
440ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  isolate_->heap()->SetStackLimits();
441c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
442c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
443c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
444c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid StackGuard::InitThread(const ExecutionAccess& lock) {
4451c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  if (thread_local_.Initialize(isolate_)) isolate_->heap()->SetStackLimits();
4461c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  Isolate::PerIsolateThreadData* per_thread =
4471c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org      isolate_->FindOrAllocatePerThreadDataForThisThread();
4481c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org  uintptr_t stored_limit = per_thread->stack_limit();
449c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  // You should hold the ExecutionAccess lock when you call this.
450ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (stored_limit != 0) {
451ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org    SetStackLimit(stored_limit);
452c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  }
453c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
454c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
455c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// --- C a l l s   t o   n a t i v e s ---
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4582ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org#define RETURN_NATIVE_CALL(name, args)                                  \
459a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  do {                                                                  \
460a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Handle<Object> argv[] = args;                                       \
4612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    return Call(isolate,                                                \
4622c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org                isolate->name##_fun(),                                  \
463a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org                isolate->js_builtins_object(),                          \
4642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                ARRAY_SIZE(argv), argv);                                \
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } while (false)
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4682ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToNumber(
4692ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
4702ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_number, { obj });
47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4742ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToString(
4752ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
4762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_string, { obj });
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToDetailString(
4812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
4822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_detail_string, { obj });
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4862ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToObject(
4872ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
48834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  if (obj->IsSpecObject()) return obj;
4892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_object, { obj });
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4932ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToInteger(
4942ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
4952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_integer, { obj });
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToUint32(
5002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
5012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_uint32, { obj });
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ToInt32(
5062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate, Handle<Object> obj) {
5072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(to_int32, { obj });
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::NewDate(Isolate* isolate, double time) {
512d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Handle<Object> time_obj = isolate->factory()->NewNumber(time);
5132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  RETURN_NATIVE_CALL(create_date, { time_obj });
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef RETURN_NATIVE_CALL
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<JSRegExp> Execution::NewJSRegExp(Handle<String> pattern,
5212ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                                             Handle<String> flags) {
5222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Isolate* isolate = pattern->GetIsolate();
523ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  Handle<JSFunction> function = Handle<JSFunction>(
5242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      isolate->native_context()->regexp_function());
5252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> re_obj;
5262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  ASSIGN_RETURN_ON_EXCEPTION(
5272ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      isolate, re_obj,
5282ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      RegExpImpl::CreateRegExpLiteral(function, pattern, flags),
5292ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      JSRegExp);
530b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org  return Handle<JSRegExp>::cast(re_obj);
531b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org}
532b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
533b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<Object> Execution::CharAt(Handle<String> string, uint32_t index) {
535c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = string->GetIsolate();
536c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Factory* factory = isolate->factory();
537c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  int int_index = static_cast<int>(index);
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (int_index < 0 || int_index >= string->length()) {
540c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    return factory->undefined_value();
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5432f599e5925b02d78bd78703b44741d6b27e53a44machenbach@chromium.org  Handle<Object> char_at = Object::GetProperty(
5442ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      isolate->js_builtins_object(),
5452ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      factory->char_at_string()).ToHandleChecked();
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!char_at->IsJSFunction()) {
547c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    return factory->undefined_value();
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
550c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Handle<Object> index_object = factory->NewNumberFromInt(int_index);
551a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> index_arg[] = { index_object };
5522ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> result;
553e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  if (!TryCall(Handle<JSFunction>::cast(char_at),
554e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org               string,
555e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org               ARRAY_SIZE(index_arg),
556e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org               index_arg).ToHandle(&result)) {
557e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org    return factory->undefined_value();
558e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  }
55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return result;
56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5632ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<JSFunction> Execution::InstantiateFunction(
5642ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<FunctionTemplateInfo> data) {
565c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = data->GetIsolate();
566639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (!data->do_not_cache()) {
567639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    // Fast case: see if the function has already been instantiated
568639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    int serial_number = Smi::cast(data->serial_number())->value();
5697010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    Handle<JSObject> cache(isolate->native_context()->function_cache());
5707010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    Handle<Object> elm =
5712ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        Object::GetElement(isolate, cache, serial_number).ToHandleChecked();
5727010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    if (elm->IsJSFunction()) return Handle<JSFunction>::cast(elm);
573639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  }
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // The function has not yet been instantiated in this context; do it.
575a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> args[] = { data };
5762ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> result;
5772ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  ASSIGN_RETURN_ON_EXCEPTION(
5782ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      isolate, result,
5792ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      Call(isolate,
5802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           isolate->instantiate_fun(),
5812ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           isolate->js_builtins_object(),
5822ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           ARRAY_SIZE(args),
5832ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org           args),
5842ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      JSFunction);
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Handle<JSFunction>::cast(result);
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5892ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<JSObject> Execution::InstantiateObject(
5902ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<ObjectTemplateInfo> data) {
591c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = data->GetIsolate();
5922ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> result;
59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (data->property_list()->IsUndefined() &&
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      !data->constructor()->IsUndefined()) {
5952ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<FunctionTemplateInfo> cons_template =
5962ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        Handle<FunctionTemplateInfo>(
5972ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org            FunctionTemplateInfo::cast(data->constructor()));
5982ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<JSFunction> cons;
5992ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    ASSIGN_RETURN_ON_EXCEPTION(
6002ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        isolate, cons, InstantiateFunction(cons_template), JSObject);
6012ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    ASSIGN_RETURN_ON_EXCEPTION(isolate, result, New(cons, 0, NULL), JSObject);
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
603a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org    Handle<Object> args[] = { data };
6042ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    ASSIGN_RETURN_ON_EXCEPTION(
6052ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        isolate, result,
6062ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        Call(isolate,
6072ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org             isolate->instantiate_fun(),
6082ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org             isolate->js_builtins_object(),
6092ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org             ARRAY_SIZE(args),
6102ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org             args),
6112ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        JSObject);
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
6132ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return Handle<JSObject>::cast(result);
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6172ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.orgMaybeHandle<Object> Execution::ConfigureInstance(
6182ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Isolate* isolate,
6192ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<Object> instance,
6202ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    Handle<Object> instance_template) {
621a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> args[] = { instance, instance_template };
6222ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  return Execution::Call(isolate,
6232ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                         isolate->configure_instance_fun(),
6242ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                         isolate->js_builtins_object(),
6252ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                         ARRAY_SIZE(args),
6262ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org                         args);
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenHandle<String> Execution::GetStackTraceLine(Handle<Object> recv,
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            Handle<JSFunction> fun,
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            Handle<Object> pos,
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                            Handle<Object> is_global) {
634c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  Isolate* isolate = fun->GetIsolate();
635a8bb4d938869bdcdf759625ee868775ff24826d9svenpanne@chromium.org  Handle<Object> args[] = { recv, fun, pos, is_global };
6362ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  MaybeHandle<Object> maybe_result =
6372ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org      TryCall(isolate->get_stack_trace_line_fun(),
6382ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org              isolate->js_builtins_object(),
6392ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org              ARRAY_SIZE(args),
6402ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org              args);
6412ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  Handle<Object> result;
6422ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org  if (!maybe_result.ToHandle(&result) || !result->IsString()) {
6432ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org    return isolate->factory()->empty_string();
644c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  }
645c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Handle<String>::cast(result);
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6503c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.orgObject* StackGuard::HandleInterrupts() {
6516a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org  {
6526a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    ExecutionAccess access(isolate_);
6536a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    if (should_postpone_interrupts(access)) {
6546a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org      return isolate_->heap()->undefined_value();
6556a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    }
6568d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
657c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6588d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (CheckAndClearInterrupt(GC_REQUEST)) {
6598d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    isolate_->heap()->CollectAllGarbage(Heap::kNoGCFlags, "GC interrupt");
6608d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
6613c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
6628d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (CheckDebugBreak() || CheckDebugCommand()) {
6638d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    isolate_->debug()->HandleDebugBreak();
6648d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
6656a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org
6668d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (CheckAndClearInterrupt(TERMINATE_EXECUTION)) {
6678d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return isolate_->TerminateExecution();
6688d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
6693c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
6708d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (CheckAndClearInterrupt(DEOPT_MARKED_ALLOCATION_SITES)) {
6718d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    isolate_->heap()->DeoptMarkedAllocationSites();
6728d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
6736a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org
6748d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (CheckAndClearInterrupt(INSTALL_CODE)) {
6758d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    ASSERT(isolate_->concurrent_recompilation_enabled());
6768d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    isolate_->optimizing_compiler_thread()->InstallOptimizedFunctions();
6775c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org  }
6783c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
6798d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (CheckAndClearInterrupt(API_INTERRUPT)) {
6806a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    // Callback must be invoked outside of ExecusionAccess lock.
6816a4d394882dba70a85567fb90ffd4f428a9eb170machenbach@chromium.org    isolate_->InvokeApiInterruptCallback();
6824a35c5a501e5b966f895ddea8e19c3ca232cb23fdslomov@chromium.org  }
6833c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
6848d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  isolate_->counters()->stack_interrupts()->Increment();
6858d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  isolate_->counters()->runtime_profiler_ticks()->Increment();
6868d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  isolate_->runtime_profiler()->OptimizeNow();
6878d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
6883c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  return isolate_->heap()->undefined_value();
68937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
69037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
692