| Index: src/debug/debug.cc
|
| diff --git a/src/debug/debug.cc b/src/debug/debug.cc
|
| index 5f623f6b26aa11a1e5405a981ae60f2d17737947..6c88f826a26a944a19a6986e8a739504119ddfb9 100644
|
| --- a/src/debug/debug.cc
|
| +++ b/src/debug/debug.cc
|
| @@ -767,22 +767,6 @@ void Debug::FloodWithOneShot(Handle<JSFunction> function,
|
| }
|
|
|
|
|
| -void Debug::FloodHandlerWithOneShot() {
|
| - // Iterate through the JavaScript stack looking for handlers.
|
| - DCHECK_NE(StackFrame::NO_ID, break_frame_id());
|
| - for (JavaScriptFrameIterator it(isolate_, break_frame_id()); !it.done();
|
| - it.Advance()) {
|
| - JavaScriptFrame* frame = it.frame();
|
| - int stack_slots = 0; // The computed stack slot count is not used.
|
| - if (frame->LookupExceptionHandlerInTable(&stack_slots, NULL) > 0) {
|
| - // Flood the function with the catch/finally block with break points.
|
| - FloodWithOneShot(Handle<JSFunction>(frame->function()));
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -
|
| -
|
| void Debug::ChangeBreakOnException(ExceptionBreakType type, bool enable) {
|
| if (type == BreakUncaughtException) {
|
| break_on_uncaught_exception_ = enable;
|
| @@ -820,6 +804,35 @@ void Debug::PrepareStepIn(Handle<JSFunction> function) {
|
| }
|
|
|
|
|
| +void Debug::PrepareStepOnThrow() {
|
| + if (!is_active()) return;
|
| + if (!IsStepping()) return;
|
| + if (last_step_action() == StepNone) return;
|
| + if (in_debug_scope()) return;
|
| +
|
| + ClearOneShot();
|
| +
|
| + // Iterate through the JavaScript stack looking for handlers.
|
| + JavaScriptFrameIterator it(isolate_);
|
| + while (!it.done()) {
|
| + JavaScriptFrame* frame = it.frame();
|
| + int stack_slots = 0; // The computed stack slot count is not used.
|
| + if (frame->LookupExceptionHandlerInTable(&stack_slots, NULL) > 0) break;
|
| + it.Advance();
|
| + }
|
| +
|
| + // Find the closest Javascript frame we can flood with one-shots.
|
| + while (!it.done() &&
|
| + !it.frame()->function()->shared()->IsSubjectToDebugging()) {
|
| + it.Advance();
|
| + }
|
| +
|
| + if (it.done()) return; // No suitable Javascript catch handler.
|
| +
|
| + FloodWithOneShot(Handle<JSFunction>(it.frame()->function()));
|
| +}
|
| +
|
| +
|
| void Debug::PrepareStep(StepAction step_action,
|
| int step_count,
|
| StackFrame::Id frame_id) {
|
| @@ -856,10 +869,6 @@ void Debug::PrepareStep(StepAction step_action,
|
| thread_local_.step_count_ = step_count;
|
| }
|
|
|
| - // First of all ensure there is one-shot break points in the top handler
|
| - // if any.
|
| - FloodHandlerWithOneShot();
|
| -
|
| // If the function on the top frame is unresolved perform step out. This will
|
| // be the case when calling unknown function and having the debugger stopped
|
| // in an unhandled exception.
|
| @@ -1659,6 +1668,7 @@ MaybeHandle<Object> Debug::MakeAsyncTaskEvent(Handle<JSObject> task_event) {
|
|
|
| void Debug::OnThrow(Handle<Object> exception) {
|
| if (in_debug_scope() || ignore_events()) return;
|
| + PrepareStepOnThrow();
|
| // Temporarily clear any scheduled_exception to allow evaluating
|
| // JavaScript from the debug event handler.
|
| HandleScope scope(isolate_);
|
| @@ -1720,9 +1730,6 @@ void Debug::OnException(Handle<Object> exception, Handle<Object> promise) {
|
| DebugScope debug_scope(this);
|
| if (debug_scope.failed()) return;
|
|
|
| - // Clear all current stepping setup.
|
| - ClearStepping();
|
| -
|
| // Create the event data object.
|
| Handle<Object> event_data;
|
| // Bail out and don't call debugger if exception.
|
|
|