| Index: src/debug.cc
|
| diff --git a/src/debug.cc b/src/debug.cc
|
| index dc39b48118173aedf2cc9699fc5c52162bb40366..e952fe7ebb88a9dc07893f4e973be4fc5fc9ffab 100644
|
| --- a/src/debug.cc
|
| +++ b/src/debug.cc
|
| @@ -1351,7 +1351,7 @@ void Debug::PrepareStep(StepAction step_action,
|
| }
|
| }
|
|
|
| - ActivateStepIn(frame);
|
| + ActivateStepIn(function, frame);
|
| }
|
|
|
| // Fill the current function with one-shot break points even for step in on
|
| @@ -1455,30 +1455,27 @@ Handle<Object> Debug::GetSourceBreakLocations(
|
|
|
|
|
| // Handle stepping into a function.
|
| -void Debug::HandleStepIn(Handle<Object> function_obj, Handle<Object> holder,
|
| - Address fp, bool is_constructor) {
|
| +void Debug::HandleStepIn(Handle<Object> function_obj, bool is_constructor) {
|
| // Flood getter/setter if we either step in or step to another frame.
|
| bool step_frame = thread_local_.last_step_action_ == StepFrame;
|
| if (!StepInActive() && !step_frame) return;
|
| if (!function_obj->IsJSFunction()) return;
|
| Handle<JSFunction> function = Handle<JSFunction>::cast(function_obj);
|
| Isolate* isolate = function->GetIsolate();
|
| - // If the frame pointer is not supplied by the caller find it.
|
| - if (fp == 0) {
|
| - StackFrameIterator it(isolate);
|
| +
|
| + StackFrameIterator it(isolate);
|
| + it.Advance();
|
| + // For constructor functions skip another frame.
|
| + if (is_constructor) {
|
| + DCHECK(it.frame()->is_construct());
|
| it.Advance();
|
| - // For constructor functions skip another frame.
|
| - if (is_constructor) {
|
| - DCHECK(it.frame()->is_construct());
|
| - it.Advance();
|
| - }
|
| - fp = it.frame()->fp();
|
| }
|
| + Address fp = it.frame()->fp();
|
|
|
| // Flood the function with one-shot break points if it is called from where
|
| // step into was requested, or when stepping into a new frame.
|
| if (fp == thread_local_.step_into_fp_ || step_frame) {
|
| - FloodWithOneShotGeneric(function, holder);
|
| + FloodWithOneShotGeneric(function, Handle<Object>());
|
| }
|
| }
|
|
|
| @@ -1512,8 +1509,12 @@ void Debug::ClearOneShot() {
|
| }
|
|
|
|
|
| -void Debug::ActivateStepIn(StackFrame* frame) {
|
| +void Debug::ActivateStepIn(Handle<JSFunction> function, StackFrame* frame) {
|
| DCHECK(!StepOutActive());
|
| + // Make sure IC state is clean. This is so that we correct flood
|
| + // accessor pairs when stepping in.
|
| + function->code()->ClearInlineCaches();
|
| + function->shared()->feedback_vector()->ClearICSlots(function->shared());
|
| thread_local_.step_into_fp_ = frame->UnpaddedFP();
|
| }
|
|
|
| @@ -2069,10 +2070,6 @@ bool Debug::EnsureDebugInfo(Handle<SharedFunctionInfo> shared,
|
| return false;
|
| }
|
|
|
| - // Make sure IC state is clean.
|
| - shared->code()->ClearInlineCaches();
|
| - shared->feedback_vector()->ClearICSlots(*shared);
|
| -
|
| // Create the debug info object.
|
| Handle<DebugInfo> debug_info = isolate->factory()->NewDebugInfo(shared);
|
|
|
|
|