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