| Index: src/execution.cc
|
| ===================================================================
|
| --- src/execution.cc (revision 7267)
|
| +++ src/execution.cc (working copy)
|
| @@ -42,14 +42,39 @@
|
| namespace internal {
|
|
|
|
|
| +StackGuard::StackGuard()
|
| + : isolate_(NULL) {
|
| +}
|
| +
|
| +
|
| +void StackGuard::set_interrupt_limits(const ExecutionAccess& lock) {
|
| + ASSERT(isolate_ != NULL);
|
| + // Ignore attempts to interrupt when interrupts are postponed.
|
| + if (should_postpone_interrupts(lock)) return;
|
| + thread_local_.jslimit_ = kInterruptLimit;
|
| + thread_local_.climit_ = kInterruptLimit;
|
| + isolate_->heap()->SetStackLimits();
|
| +}
|
| +
|
| +
|
| +void StackGuard::reset_limits(const ExecutionAccess& lock) {
|
| + ASSERT(isolate_ != NULL);
|
| + thread_local_.jslimit_ = thread_local_.real_jslimit_;
|
| + thread_local_.climit_ = thread_local_.real_climit_;
|
| + isolate_->heap()->SetStackLimits();
|
| +}
|
| +
|
| +
|
| static Handle<Object> Invoke(bool construct,
|
| Handle<JSFunction> func,
|
| Handle<Object> receiver,
|
| int argc,
|
| Object*** args,
|
| bool* has_pending_exception) {
|
| + Isolate* isolate = func->GetIsolate();
|
| +
|
| // Entering JavaScript.
|
| - VMState state(JS);
|
| + VMState state(isolate, JS);
|
|
|
| // Placeholder for return value.
|
| MaybeObject* value = reinterpret_cast<Object*>(kZapValue);
|
| @@ -85,7 +110,7 @@
|
| {
|
| // Save and restore context around invocation and block the
|
| // allocation of handles without explicit handle scopes.
|
| - SaveContext save;
|
| + SaveContext save(isolate);
|
| NoHandleAllocation na;
|
| JSEntryFunction entry = FUNCTION_CAST<JSEntryFunction>(code->entry());
|
|
|
| @@ -103,20 +128,20 @@
|
|
|
| // Update the pending exception flag and return the value.
|
| *has_pending_exception = value->IsException();
|
| - ASSERT(*has_pending_exception == Top::has_pending_exception());
|
| + ASSERT(*has_pending_exception == Isolate::Current()->has_pending_exception());
|
| if (*has_pending_exception) {
|
| - Top::ReportPendingMessages();
|
| - if (Top::pending_exception() == Failure::OutOfMemoryException()) {
|
| - if (!HandleScopeImplementer::instance()->ignore_out_of_memory()) {
|
| + isolate->ReportPendingMessages();
|
| + if (isolate->pending_exception() == Failure::OutOfMemoryException()) {
|
| + if (!isolate->handle_scope_implementer()->ignore_out_of_memory()) {
|
| V8::FatalProcessOutOfMemory("JS", true);
|
| }
|
| }
|
| return Handle<Object>();
|
| } else {
|
| - Top::clear_pending_message();
|
| + isolate->clear_pending_message();
|
| }
|
|
|
| - return Handle<Object>(value->ToObjectUnchecked());
|
| + return Handle<Object>(value->ToObjectUnchecked(), isolate);
|
| }
|
|
|
|
|
| @@ -131,7 +156,8 @@
|
|
|
| Handle<Object> Execution::New(Handle<JSFunction> func, int argc,
|
| Object*** args, bool* pending_exception) {
|
| - return Invoke(true, func, Top::global(), argc, args, pending_exception);
|
| + return Invoke(true, func, Isolate::Current()->global(), argc, args,
|
| + pending_exception);
|
| }
|
|
|
|
|
| @@ -153,18 +179,20 @@
|
|
|
| if (*caught_exception) {
|
| ASSERT(catcher.HasCaught());
|
| - ASSERT(Top::has_pending_exception());
|
| - ASSERT(Top::external_caught_exception());
|
| - if (Top::pending_exception() == Heap::termination_exception()) {
|
| - result = Factory::termination_exception();
|
| + Isolate* isolate = Isolate::Current();
|
| + ASSERT(isolate->has_pending_exception());
|
| + ASSERT(isolate->external_caught_exception());
|
| + if (isolate->pending_exception() ==
|
| + isolate->heap()->termination_exception()) {
|
| + result = isolate->factory()->termination_exception();
|
| } else {
|
| result = v8::Utils::OpenHandle(*catcher.Exception());
|
| }
|
| - Top::OptionalRescheduleException(true);
|
| + isolate->OptionalRescheduleException(true);
|
| }
|
|
|
| - ASSERT(!Top::has_pending_exception());
|
| - ASSERT(!Top::external_caught_exception());
|
| + ASSERT(!Isolate::Current()->has_pending_exception());
|
| + ASSERT(!Isolate::Current()->external_caught_exception());
|
| return result;
|
| }
|
|
|
| @@ -178,7 +206,7 @@
|
| // Regular expressions can be called as functions in both Firefox
|
| // and Safari so we allow it too.
|
| if (object->IsJSRegExp()) {
|
| - Handle<String> exec = Factory::exec_symbol();
|
| + Handle<String> exec = FACTORY->exec_symbol();
|
| // TODO(lrn): Bug 617. We should use the default function here, not the
|
| // one on the RegExp object.
|
| Object* exec_function;
|
| @@ -186,7 +214,7 @@
|
| // This can lose an exception, but the alternative is to put a failure
|
| // object in a handle, which is not GC safe.
|
| if (!maybe_exec_function->ToObject(&exec_function)) {
|
| - return Factory::undefined_value();
|
| + return FACTORY->undefined_value();
|
| }
|
| }
|
| return Handle<Object>(exec_function);
|
| @@ -197,10 +225,10 @@
|
| if (object->IsHeapObject() &&
|
| HeapObject::cast(*object)->map()->has_instance_call_handler()) {
|
| return Handle<JSFunction>(
|
| - Top::global_context()->call_as_function_delegate());
|
| + Isolate::Current()->global_context()->call_as_function_delegate());
|
| }
|
|
|
| - return Factory::undefined_value();
|
| + return FACTORY->undefined_value();
|
| }
|
|
|
|
|
| @@ -215,26 +243,22 @@
|
| if (object->IsHeapObject() &&
|
| HeapObject::cast(*object)->map()->has_instance_call_handler()) {
|
| return Handle<JSFunction>(
|
| - Top::global_context()->call_as_constructor_delegate());
|
| + Isolate::Current()->global_context()->call_as_constructor_delegate());
|
| }
|
|
|
| - return Factory::undefined_value();
|
| + return FACTORY->undefined_value();
|
| }
|
|
|
|
|
| -// Static state for stack guards.
|
| -StackGuard::ThreadLocal StackGuard::thread_local_;
|
| -
|
| -
|
| bool StackGuard::IsStackOverflow() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return (thread_local_.jslimit_ != kInterruptLimit &&
|
| thread_local_.climit_ != kInterruptLimit);
|
| }
|
|
|
|
|
| void StackGuard::EnableInterrupts() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| if (has_pending_interrupts(access)) {
|
| set_interrupt_limits(access);
|
| }
|
| @@ -242,7 +266,7 @@
|
|
|
|
|
| void StackGuard::SetStackLimit(uintptr_t limit) {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| // If the current limits are special (eg due to a pending interrupt) then
|
| // leave them alone.
|
| uintptr_t jslimit = SimulatorStack::JsLimitFromCLimit(limit);
|
| @@ -258,92 +282,92 @@
|
|
|
|
|
| void StackGuard::DisableInterrupts() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| reset_limits(access);
|
| }
|
|
|
|
|
| bool StackGuard::IsInterrupted() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return thread_local_.interrupt_flags_ & INTERRUPT;
|
| }
|
|
|
|
|
| void StackGuard::Interrupt() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| thread_local_.interrupt_flags_ |= INTERRUPT;
|
| set_interrupt_limits(access);
|
| }
|
|
|
|
|
| bool StackGuard::IsPreempted() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return thread_local_.interrupt_flags_ & PREEMPT;
|
| }
|
|
|
|
|
| void StackGuard::Preempt() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| thread_local_.interrupt_flags_ |= PREEMPT;
|
| set_interrupt_limits(access);
|
| }
|
|
|
|
|
| bool StackGuard::IsTerminateExecution() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return thread_local_.interrupt_flags_ & TERMINATE;
|
| }
|
|
|
|
|
| void StackGuard::TerminateExecution() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| thread_local_.interrupt_flags_ |= TERMINATE;
|
| set_interrupt_limits(access);
|
| }
|
|
|
|
|
| bool StackGuard::IsRuntimeProfilerTick() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return thread_local_.interrupt_flags_ & RUNTIME_PROFILER_TICK;
|
| }
|
|
|
|
|
| void StackGuard::RequestRuntimeProfilerTick() {
|
| // Ignore calls if we're not optimizing or if we can't get the lock.
|
| - if (FLAG_opt && ExecutionAccess::TryLock()) {
|
| + if (FLAG_opt && ExecutionAccess::TryLock(isolate_)) {
|
| thread_local_.interrupt_flags_ |= RUNTIME_PROFILER_TICK;
|
| if (thread_local_.postpone_interrupts_nesting_ == 0) {
|
| thread_local_.jslimit_ = thread_local_.climit_ = kInterruptLimit;
|
| - Heap::SetStackLimits();
|
| + isolate_->heap()->SetStackLimits();
|
| }
|
| - ExecutionAccess::Unlock();
|
| + ExecutionAccess::Unlock(isolate_);
|
| }
|
| }
|
|
|
|
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| bool StackGuard::IsDebugBreak() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return thread_local_.interrupt_flags_ & DEBUGBREAK;
|
| }
|
|
|
|
|
| void StackGuard::DebugBreak() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| thread_local_.interrupt_flags_ |= DEBUGBREAK;
|
| set_interrupt_limits(access);
|
| }
|
|
|
|
|
| bool StackGuard::IsDebugCommand() {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| return thread_local_.interrupt_flags_ & DEBUGCOMMAND;
|
| }
|
|
|
|
|
| void StackGuard::DebugCommand() {
|
| if (FLAG_debugger_auto_break) {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| thread_local_.interrupt_flags_ |= DEBUGCOMMAND;
|
| set_interrupt_limits(access);
|
| }
|
| @@ -351,7 +375,7 @@
|
| #endif
|
|
|
| void StackGuard::Continue(InterruptFlag after_what) {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| thread_local_.interrupt_flags_ &= ~static_cast<int>(after_what);
|
| if (!should_postpone_interrupts(access) && !has_pending_interrupts(access)) {
|
| reset_limits(access);
|
| @@ -359,36 +383,34 @@
|
| }
|
|
|
|
|
| -int StackGuard::ArchiveSpacePerThread() {
|
| - return sizeof(ThreadLocal);
|
| -}
|
| -
|
| -
|
| char* StackGuard::ArchiveStackGuard(char* to) {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| memcpy(to, reinterpret_cast<char*>(&thread_local_), sizeof(ThreadLocal));
|
| ThreadLocal blank;
|
| +
|
| + // Set the stack limits using the old thread_local_.
|
| + // TODO(isolates): This was the old semantics of constructing a ThreadLocal
|
| + // (as the ctor called SetStackLimits, which looked at the
|
| + // current thread_local_ from StackGuard)-- but is this
|
| + // really what was intended?
|
| + isolate_->heap()->SetStackLimits();
|
| thread_local_ = blank;
|
| +
|
| return to + sizeof(ThreadLocal);
|
| }
|
|
|
|
|
| char* StackGuard::RestoreStackGuard(char* from) {
|
| - ExecutionAccess access;
|
| + ExecutionAccess access(isolate_);
|
| memcpy(reinterpret_cast<char*>(&thread_local_), from, sizeof(ThreadLocal));
|
| - Heap::SetStackLimits();
|
| + isolate_->heap()->SetStackLimits();
|
| return from + sizeof(ThreadLocal);
|
| }
|
|
|
|
|
| -static internal::Thread::LocalStorageKey stack_limit_key =
|
| - internal::Thread::CreateThreadLocalKey();
|
| -
|
| -
|
| void StackGuard::FreeThreadResources() {
|
| - Thread::SetThreadLocal(
|
| - stack_limit_key,
|
| - reinterpret_cast<void*>(thread_local_.real_climit_));
|
| + Isolate::CurrentPerIsolateThreadData()->set_stack_limit(
|
| + thread_local_.real_climit_);
|
| }
|
|
|
|
|
| @@ -400,11 +422,11 @@
|
| nesting_ = 0;
|
| postpone_interrupts_nesting_ = 0;
|
| interrupt_flags_ = 0;
|
| - Heap::SetStackLimits();
|
| }
|
|
|
|
|
| -void StackGuard::ThreadLocal::Initialize() {
|
| +bool StackGuard::ThreadLocal::Initialize() {
|
| + bool should_set_stack_limits = false;
|
| if (real_climit_ == kIllegalLimit) {
|
| // Takes the address of the limit variable in order to find out where
|
| // the top of stack is right now.
|
| @@ -415,37 +437,41 @@
|
| jslimit_ = SimulatorStack::JsLimitFromCLimit(limit);
|
| real_climit_ = limit;
|
| climit_ = limit;
|
| - Heap::SetStackLimits();
|
| + should_set_stack_limits = true;
|
| }
|
| nesting_ = 0;
|
| postpone_interrupts_nesting_ = 0;
|
| interrupt_flags_ = 0;
|
| + return should_set_stack_limits;
|
| }
|
|
|
|
|
| void StackGuard::ClearThread(const ExecutionAccess& lock) {
|
| thread_local_.Clear();
|
| + isolate_->heap()->SetStackLimits();
|
| }
|
|
|
|
|
| void StackGuard::InitThread(const ExecutionAccess& lock) {
|
| - thread_local_.Initialize();
|
| - void* stored_limit = Thread::GetThreadLocal(stack_limit_key);
|
| + if (thread_local_.Initialize()) isolate_->heap()->SetStackLimits();
|
| + uintptr_t stored_limit =
|
| + Isolate::CurrentPerIsolateThreadData()->stack_limit();
|
| // You should hold the ExecutionAccess lock when you call this.
|
| - if (stored_limit != NULL) {
|
| - StackGuard::SetStackLimit(reinterpret_cast<intptr_t>(stored_limit));
|
| + if (stored_limit != 0) {
|
| + StackGuard::SetStackLimit(stored_limit);
|
| }
|
| }
|
|
|
|
|
| // --- C a l l s t o n a t i v e s ---
|
|
|
| -#define RETURN_NATIVE_CALL(name, argc, argv, has_pending_exception) \
|
| - do { \
|
| - Object** args[argc] = argv; \
|
| - ASSERT(has_pending_exception != NULL); \
|
| - return Call(Top::name##_fun(), Top::builtins(), argc, args, \
|
| - has_pending_exception); \
|
| +#define RETURN_NATIVE_CALL(name, argc, argv, has_pending_exception) \
|
| + do { \
|
| + Object** args[argc] = argv; \
|
| + ASSERT(has_pending_exception != NULL); \
|
| + return Call(Isolate::Current()->name##_fun(), \
|
| + Isolate::Current()->js_builtins_object(), argc, args, \
|
| + has_pending_exception); \
|
| } while (false)
|
|
|
|
|
| @@ -461,7 +487,7 @@
|
| double value = obj->Number();
|
| result = !((value == 0) || isnan(value));
|
| }
|
| - return Handle<Object>(Heap::ToBoolean(result));
|
| + return Handle<Object>(HEAP->ToBoolean(result));
|
| }
|
|
|
|
|
| @@ -502,7 +528,7 @@
|
|
|
|
|
| Handle<Object> Execution::NewDate(double time, bool* exc) {
|
| - Handle<Object> time_obj = Factory::NewNumber(time);
|
| + Handle<Object> time_obj = FACTORY->NewNumber(time);
|
| RETURN_NATIVE_CALL(create_date, 1, { time_obj.location() }, exc);
|
| }
|
|
|
| @@ -513,11 +539,10 @@
|
| Handle<JSRegExp> Execution::NewJSRegExp(Handle<String> pattern,
|
| Handle<String> flags,
|
| bool* exc) {
|
| + Handle<JSFunction> function = Handle<JSFunction>(
|
| + pattern->GetIsolate()->global_context()->regexp_function());
|
| Handle<Object> re_obj = RegExpImpl::CreateRegExpLiteral(
|
| - Handle<JSFunction>(Top::global_context()->regexp_function()),
|
| - pattern,
|
| - flags,
|
| - exc);
|
| + function, pattern, flags, exc);
|
| if (*exc) return Handle<JSRegExp>();
|
| return Handle<JSRegExp>::cast(re_obj);
|
| }
|
| @@ -526,17 +551,18 @@
|
| Handle<Object> Execution::CharAt(Handle<String> string, uint32_t index) {
|
| int int_index = static_cast<int>(index);
|
| if (int_index < 0 || int_index >= string->length()) {
|
| - return Factory::undefined_value();
|
| + return FACTORY->undefined_value();
|
| }
|
|
|
| Handle<Object> char_at =
|
| - GetProperty(Top::builtins(), Factory::char_at_symbol());
|
| + GetProperty(Isolate::Current()->js_builtins_object(),
|
| + FACTORY->char_at_symbol());
|
| if (!char_at->IsJSFunction()) {
|
| - return Factory::undefined_value();
|
| + return FACTORY->undefined_value();
|
| }
|
|
|
| bool caught_exception;
|
| - Handle<Object> index_object = Factory::NewNumberFromInt(int_index);
|
| + Handle<Object> index_object = FACTORY->NewNumberFromInt(int_index);
|
| Object** index_arg[] = { index_object.location() };
|
| Handle<Object> result = TryCall(Handle<JSFunction>::cast(char_at),
|
| string,
|
| @@ -544,7 +570,7 @@
|
| index_arg,
|
| &caught_exception);
|
| if (caught_exception) {
|
| - return Factory::undefined_value();
|
| + return FACTORY->undefined_value();
|
| }
|
| return result;
|
| }
|
| @@ -554,13 +580,15 @@
|
| Handle<FunctionTemplateInfo> data, bool* exc) {
|
| // Fast case: see if the function has already been instantiated
|
| int serial_number = Smi::cast(data->serial_number())->value();
|
| - Object* elm = Top::global_context()->function_cache()->
|
| - GetElementNoExceptionThrown(serial_number);
|
| + Object* elm =
|
| + Isolate::Current()->global_context()->function_cache()->
|
| + GetElementNoExceptionThrown(serial_number);
|
| if (elm->IsJSFunction()) return Handle<JSFunction>(JSFunction::cast(elm));
|
| // The function has not yet been instantiated in this context; do it.
|
| Object** args[1] = { Handle<Object>::cast(data).location() };
|
| Handle<Object> result =
|
| - Call(Top::instantiate_fun(), Top::builtins(), 1, args, exc);
|
| + Call(Isolate::Current()->instantiate_fun(),
|
| + Isolate::Current()->js_builtins_object(), 1, args, exc);
|
| if (*exc) return Handle<JSFunction>::null();
|
| return Handle<JSFunction>::cast(result);
|
| }
|
| @@ -588,7 +616,8 @@
|
| } else {
|
| Object** args[1] = { Handle<Object>::cast(data).location() };
|
| Handle<Object> result =
|
| - Call(Top::instantiate_fun(), Top::builtins(), 1, args, exc);
|
| + Call(Isolate::Current()->instantiate_fun(),
|
| + Isolate::Current()->js_builtins_object(), 1, args, exc);
|
| if (*exc) return Handle<JSObject>::null();
|
| return Handle<JSObject>::cast(result);
|
| }
|
| @@ -599,7 +628,8 @@
|
| Handle<Object> instance_template,
|
| bool* exc) {
|
| Object** args[2] = { instance.location(), instance_template.location() };
|
| - Execution::Call(Top::configure_instance_fun(), Top::builtins(), 2, args, exc);
|
| + Execution::Call(Isolate::Current()->configure_instance_fun(),
|
| + Isolate::Current()->js_builtins_object(), 2, args, exc);
|
| }
|
|
|
|
|
| @@ -613,50 +643,57 @@
|
| pos.location(),
|
| is_global.location() };
|
| bool caught_exception = false;
|
| - Handle<Object> result = TryCall(Top::get_stack_trace_line_fun(),
|
| - Top::builtins(), argc, args,
|
| - &caught_exception);
|
| - if (caught_exception || !result->IsString()) return Factory::empty_symbol();
|
| + Handle<Object> result =
|
| + TryCall(Isolate::Current()->get_stack_trace_line_fun(),
|
| + Isolate::Current()->js_builtins_object(), argc, args,
|
| + &caught_exception);
|
| + if (caught_exception || !result->IsString()) return FACTORY->empty_symbol();
|
| return Handle<String>::cast(result);
|
| }
|
|
|
|
|
| static Object* RuntimePreempt() {
|
| + Isolate* isolate = Isolate::Current();
|
| +
|
| // Clear the preempt request flag.
|
| - StackGuard::Continue(PREEMPT);
|
| + isolate->stack_guard()->Continue(PREEMPT);
|
|
|
| ContextSwitcher::PreemptionReceived();
|
|
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| - if (Debug::InDebugger()) {
|
| + if (isolate->debug()->InDebugger()) {
|
| // If currently in the debugger don't do any actual preemption but record
|
| // that preemption occoured while in the debugger.
|
| - Debug::PreemptionWhileInDebugger();
|
| + isolate->debug()->PreemptionWhileInDebugger();
|
| } else {
|
| // Perform preemption.
|
| v8::Unlocker unlocker;
|
| Thread::YieldCPU();
|
| }
|
| #else
|
| - // Perform preemption.
|
| - v8::Unlocker unlocker;
|
| - Thread::YieldCPU();
|
| + { // NOLINT
|
| + // Perform preemption.
|
| + v8::Unlocker unlocker;
|
| + Thread::YieldCPU();
|
| + }
|
| #endif
|
|
|
| - return Heap::undefined_value();
|
| + return isolate->heap()->undefined_value();
|
| }
|
|
|
|
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| Object* Execution::DebugBreakHelper() {
|
| + Isolate* isolate = Isolate::Current();
|
| +
|
| // Just continue if breaks are disabled.
|
| - if (Debug::disable_break()) {
|
| - return Heap::undefined_value();
|
| + if (isolate->debug()->disable_break()) {
|
| + return isolate->heap()->undefined_value();
|
| }
|
|
|
| // Ignore debug break during bootstrapping.
|
| - if (Bootstrapper::IsActive()) {
|
| - return Heap::undefined_value();
|
| + if (isolate->bootstrapper()->IsActive()) {
|
| + return isolate->heap()->undefined_value();
|
| }
|
|
|
| {
|
| @@ -666,32 +703,33 @@
|
| if (fun && fun->IsJSFunction()) {
|
| // Don't stop in builtin functions.
|
| if (JSFunction::cast(fun)->IsBuiltin()) {
|
| - return Heap::undefined_value();
|
| + return isolate->heap()->undefined_value();
|
| }
|
| GlobalObject* global = JSFunction::cast(fun)->context()->global();
|
| // Don't stop in debugger functions.
|
| - if (Debug::IsDebugGlobal(global)) {
|
| - return Heap::undefined_value();
|
| + if (isolate->debug()->IsDebugGlobal(global)) {
|
| + return isolate->heap()->undefined_value();
|
| }
|
| }
|
| }
|
|
|
| // Collect the break state before clearing the flags.
|
| bool debug_command_only =
|
| - StackGuard::IsDebugCommand() && !StackGuard::IsDebugBreak();
|
| + isolate->stack_guard()->IsDebugCommand() &&
|
| + !isolate->stack_guard()->IsDebugBreak();
|
|
|
| // Clear the debug break request flag.
|
| - StackGuard::Continue(DEBUGBREAK);
|
| + isolate->stack_guard()->Continue(DEBUGBREAK);
|
|
|
| ProcessDebugMesssages(debug_command_only);
|
|
|
| // Return to continue execution.
|
| - return Heap::undefined_value();
|
| + return isolate->heap()->undefined_value();
|
| }
|
|
|
| void Execution::ProcessDebugMesssages(bool debug_command_only) {
|
| // Clear the debug command request flag.
|
| - StackGuard::Continue(DEBUGCOMMAND);
|
| + Isolate::Current()->stack_guard()->Continue(DEBUGCOMMAND);
|
|
|
| HandleScope scope;
|
| // Enter the debugger. Just continue if we fail to enter the debugger.
|
| @@ -702,34 +740,37 @@
|
|
|
| // Notify the debug event listeners. Indicate auto continue if the break was
|
| // a debug command break.
|
| - Debugger::OnDebugBreak(Factory::undefined_value(), debug_command_only);
|
| + Isolate::Current()->debugger()->OnDebugBreak(FACTORY->undefined_value(),
|
| + debug_command_only);
|
| }
|
|
|
|
|
| #endif
|
|
|
| MaybeObject* Execution::HandleStackGuardInterrupt() {
|
| - Counters::stack_interrupts.Increment();
|
| - if (StackGuard::IsRuntimeProfilerTick()) {
|
| - Counters::runtime_profiler_ticks.Increment();
|
| - StackGuard::Continue(RUNTIME_PROFILER_TICK);
|
| - RuntimeProfiler::OptimizeNow();
|
| + Isolate* isolate = Isolate::Current();
|
| + StackGuard* stack_guard = isolate->stack_guard();
|
| + isolate->counters()->stack_interrupts()->Increment();
|
| + if (stack_guard->IsRuntimeProfilerTick()) {
|
| + isolate->counters()->runtime_profiler_ticks()->Increment();
|
| + stack_guard->Continue(RUNTIME_PROFILER_TICK);
|
| + isolate->runtime_profiler()->OptimizeNow();
|
| }
|
| #ifdef ENABLE_DEBUGGER_SUPPORT
|
| - if (StackGuard::IsDebugBreak() || StackGuard::IsDebugCommand()) {
|
| + if (stack_guard->IsDebugBreak() || stack_guard->IsDebugCommand()) {
|
| DebugBreakHelper();
|
| }
|
| #endif
|
| - if (StackGuard::IsPreempted()) RuntimePreempt();
|
| - if (StackGuard::IsTerminateExecution()) {
|
| - StackGuard::Continue(TERMINATE);
|
| - return Top::TerminateExecution();
|
| + if (stack_guard->IsPreempted()) RuntimePreempt();
|
| + if (stack_guard->IsTerminateExecution()) {
|
| + stack_guard->Continue(TERMINATE);
|
| + return isolate->TerminateExecution();
|
| }
|
| - if (StackGuard::IsInterrupted()) {
|
| - StackGuard::Continue(INTERRUPT);
|
| - return Top::StackOverflow();
|
| + if (stack_guard->IsInterrupted()) {
|
| + stack_guard->Continue(INTERRUPT);
|
| + return isolate->StackOverflow();
|
| }
|
| - return Heap::undefined_value();
|
| + return isolate->heap()->undefined_value();
|
| }
|
|
|
| } } // namespace v8::internal
|
|
|