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