| Index: src/debug.cc
|
| diff --git a/src/debug.cc b/src/debug.cc
|
| index f812d1fd1f8a3445575bc6643df3989ba2044206..dc39b48118173aedf2cc9699fc5c52162bb40366 100644
|
| --- a/src/debug.cc
|
| +++ b/src/debug.cc
|
| @@ -84,8 +84,7 @@ BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info,
|
| ~RelocInfo::ModeMask(RelocInfo::CODE_AGE_SEQUENCE)),
|
| break_index_(-1),
|
| position_(1),
|
| - statement_position_(1),
|
| - has_immediate_position_(false) {
|
| + statement_position_(1) {
|
| Next();
|
| }
|
|
|
| @@ -115,7 +114,6 @@ void BreakLocation::Iterator::Next() {
|
| debug_info_->shared()->start_position());
|
| DCHECK(position_ >= 0);
|
| DCHECK(statement_position_ >= 0);
|
| - has_immediate_position_ = true;
|
| continue;
|
| }
|
|
|
| @@ -145,25 +143,19 @@ void BreakLocation::Iterator::Next() {
|
| break;
|
| }
|
|
|
| - // Skip below if we only want locations for calls and returns.
|
| - if (type_ == CALLS_AND_RETURNS) continue;
|
| -
|
| - // Only break at an inline cache if it has an immediate position attached.
|
| - if (has_immediate_position_ &&
|
| - (code->is_inline_cache_stub() && !code->is_binary_op_stub() &&
|
| - !code->is_compare_ic_stub() && !code->is_to_boolean_ic_stub())) {
|
| + if (code->kind() == Code::STUB &&
|
| + CodeStub::GetMajorKey(code) == CodeStub::CallFunction) {
|
| break_index_++;
|
| break;
|
| }
|
| - if (code->kind() == Code::STUB) {
|
| - if (RelocInfo::IsDebuggerStatement(rmode())) {
|
| - break_index_++;
|
| - break;
|
| - } else if (CodeStub::GetMajorKey(code) == CodeStub::CallFunction) {
|
| - break_index_++;
|
| - break;
|
| - }
|
| - }
|
| + }
|
| +
|
| + // Skip below if we only want locations for calls and returns.
|
| + if (type_ == CALLS_AND_RETURNS) continue;
|
| +
|
| + if (RelocInfo::IsDebuggerStatement(rmode())) {
|
| + break_index_++;
|
| + break;
|
| }
|
|
|
| if (RelocInfo::IsDebugBreakSlot(rmode()) && type_ != CALLS_AND_RETURNS) {
|
| @@ -172,7 +164,6 @@ void BreakLocation::Iterator::Next() {
|
| break;
|
| }
|
| }
|
| - has_immediate_position_ = false;
|
| }
|
|
|
|
|
| @@ -385,28 +376,8 @@ static Handle<Code> DebugBreakForIC(Handle<Code> code, RelocInfo::Mode mode) {
|
| // Find the builtin debug break function matching the calling convention
|
| // used by the call site.
|
| if (code->is_inline_cache_stub()) {
|
| - switch (code->kind()) {
|
| - case Code::CALL_IC:
|
| - return isolate->builtins()->CallICStub_DebugBreak();
|
| -
|
| - case Code::LOAD_IC:
|
| - return isolate->builtins()->LoadIC_DebugBreak();
|
| -
|
| - case Code::STORE_IC:
|
| - return isolate->builtins()->StoreIC_DebugBreak();
|
| -
|
| - case Code::KEYED_LOAD_IC:
|
| - return isolate->builtins()->KeyedLoadIC_DebugBreak();
|
| -
|
| - case Code::KEYED_STORE_IC:
|
| - return isolate->builtins()->KeyedStoreIC_DebugBreak();
|
| -
|
| - case Code::COMPARE_NIL_IC:
|
| - return isolate->builtins()->CompareNilIC_DebugBreak();
|
| -
|
| - default:
|
| - UNREACHABLE();
|
| - }
|
| + DCHECK(code->kind() == Code::CALL_IC);
|
| + return isolate->builtins()->CallICStub_DebugBreak();
|
| }
|
| if (RelocInfo::IsConstructCall(mode)) {
|
| if (code->has_function_cache()) {
|
| @@ -1258,8 +1229,6 @@ void Debug::PrepareStep(StepAction step_action,
|
| Handle<DebugInfo> debug_info = GetDebugInfo(shared);
|
|
|
| // Compute whether or not the target is a call target.
|
| - bool is_load_or_store = false;
|
| - bool is_inline_cache_stub = false;
|
| bool is_at_restarted_function = false;
|
| Handle<Code> call_function_stub;
|
|
|
| @@ -1272,8 +1241,6 @@ void Debug::PrepareStep(StepAction step_action,
|
| if (thread_local_.restarter_frame_function_pointer_ == NULL) {
|
| if (location.IsCodeTarget()) {
|
| Handle<Code> target_code = location.CodeTarget();
|
| - is_inline_cache_stub = target_code->is_inline_cache_stub();
|
| - is_load_or_store = is_inline_cache_stub && !target_code->is_call_stub();
|
|
|
| // Check if target code is CallFunction stub.
|
| Handle<Code> maybe_call_function_stub = target_code;
|
| @@ -1320,21 +1287,10 @@ void Debug::PrepareStep(StepAction step_action,
|
| // Set target frame pointer.
|
| ActivateStepOut(frames_it.frame());
|
| }
|
| - } else if (!(is_inline_cache_stub || location.IsConstructCall() ||
|
| - !call_function_stub.is_null() || is_at_restarted_function) ||
|
| - step_action == StepNext || step_action == StepMin) {
|
| - // Step next or step min.
|
| -
|
| - // Fill the current function with one-shot break points.
|
| - // If we are stepping into another frame, only fill calls and returns.
|
| - FloodWithOneShot(function, step_action == StepFrame ? CALLS_AND_RETURNS
|
| - : ALL_BREAK_LOCATIONS);
|
| -
|
| - // Remember source position and frame to handle step next.
|
| - thread_local_.last_statement_position_ =
|
| - debug_info->code()->SourceStatementPosition(summary.pc());
|
| - thread_local_.last_fp_ = frame->UnpaddedFP();
|
| - } else {
|
| + return;
|
| + }
|
| +
|
| + if (step_action != StepNext && step_action != StepMin) {
|
| // If there's restarter frame on top of the stack, just get the pointer
|
| // to function which is going to be restarted.
|
| if (is_at_restarted_function) {
|
| @@ -1395,36 +1351,21 @@ void Debug::PrepareStep(StepAction step_action,
|
| }
|
| }
|
|
|
| - // Fill the current function with one-shot break points even for step in on
|
| - // a call target as the function called might be a native function for
|
| - // which step in will not stop. It also prepares for stepping in
|
| - // getters/setters.
|
| - // If we are stepping into another frame, only fill calls and returns.
|
| - FloodWithOneShot(function, step_action == StepFrame ? CALLS_AND_RETURNS
|
| - : ALL_BREAK_LOCATIONS);
|
| -
|
| - if (is_load_or_store) {
|
| - // Remember source position and frame to handle step in getter/setter. If
|
| - // there is a custom getter/setter it will be handled in
|
| - // Object::Get/SetPropertyWithAccessor, otherwise the step action will be
|
| - // propagated on the next Debug::Break.
|
| - thread_local_.last_statement_position_ =
|
| - debug_info->code()->SourceStatementPosition(summary.pc());
|
| - thread_local_.last_fp_ = frame->UnpaddedFP();
|
| - }
|
| -
|
| - // Step in or Step in min
|
| - // Step in through construct call requires no changes to the running code.
|
| - // Step in through getters/setters should already be prepared as well
|
| - // because caller of this function (Debug::PrepareStep) is expected to
|
| - // flood the top frame's function with one shot breakpoints.
|
| - // Step in through CallFunction stub should also be prepared by caller of
|
| - // this function (Debug::PrepareStep) which should flood target function
|
| - // with breakpoints.
|
| - DCHECK(location.IsConstructCall() || is_inline_cache_stub ||
|
| - !call_function_stub.is_null() || is_at_restarted_function);
|
| ActivateStepIn(frame);
|
| }
|
| +
|
| + // Fill the current function with one-shot break points even for step in on
|
| + // a call target as the function called might be a native function for
|
| + // which step in will not stop. It also prepares for stepping in
|
| + // getters/setters.
|
| + // If we are stepping into another frame, only fill calls and returns.
|
| + FloodWithOneShot(function, step_action == StepFrame ? CALLS_AND_RETURNS
|
| + : ALL_BREAK_LOCATIONS);
|
| +
|
| + // Remember source position and frame to handle step next.
|
| + thread_local_.last_statement_position_ =
|
| + debug_info->code()->SourceStatementPosition(summary.pc());
|
| + thread_local_.last_fp_ = frame->UnpaddedFP();
|
| }
|
|
|
|
|
|
|