| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/debug/debug.h" | 5 #include "src/debug/debug.h" |
| 6 | 6 |
| 7 #include "src/api.h" | 7 #include "src/api.h" |
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 return v8::Utils::ToLocal(native_context); | 59 return v8::Utils::ToLocal(native_context); |
| 60 } | 60 } |
| 61 | 61 |
| 62 BreakLocation::BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type, | 62 BreakLocation::BreakLocation(Handle<DebugInfo> debug_info, DebugBreakType type, |
| 63 int code_offset, int position, | 63 int code_offset, int position, |
| 64 int statement_position) | 64 int statement_position) |
| 65 : debug_info_(debug_info), | 65 : debug_info_(debug_info), |
| 66 code_offset_(code_offset), | 66 code_offset_(code_offset), |
| 67 type_(type), | 67 type_(type), |
| 68 position_(position), | 68 position_(position), |
| 69 statement_position_(statement_position) {} | 69 statement_position_(statement_position) { |
| 70 #ifdef DEBUG |
| 71 if (type == DEBUG_BREAK_SLOT_AT_RETURN) { |
| 72 int return_position = 0; |
| 73 SharedFunctionInfo* shared = debug_info->shared(); |
| 74 if (shared->HasSourceCode()) { |
| 75 return_position = |
| 76 std::max(shared->end_position() - shared->start_position() - 1, 0); |
| 77 } |
| 78 CHECK_EQ(return_position, position); |
| 79 CHECK_EQ(return_position, statement_position); |
| 80 } |
| 81 #endif // DEBUG |
| 82 } |
| 70 | 83 |
| 71 BreakLocation::Iterator* BreakLocation::GetIterator( | 84 BreakLocation::Iterator* BreakLocation::GetIterator( |
| 72 Handle<DebugInfo> debug_info, BreakLocatorType type) { | 85 Handle<DebugInfo> debug_info, BreakLocatorType type) { |
| 73 if (debug_info->abstract_code()->IsBytecodeArray()) { | 86 if (debug_info->abstract_code()->IsBytecodeArray()) { |
| 74 return new BytecodeArrayIterator(debug_info, type); | 87 return new BytecodeArrayIterator(debug_info, type); |
| 75 } else { | 88 } else { |
| 76 return new CodeIterator(debug_info, type); | 89 return new CodeIterator(debug_info, type); |
| 77 } | 90 } |
| 78 } | 91 } |
| 79 | 92 |
| 80 BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info) | 93 BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info) |
| 81 : debug_info_(debug_info), | 94 : debug_info_(debug_info), |
| 82 break_index_(-1), | 95 break_index_(-1), |
| 83 position_(1), | 96 position_(1), |
| 84 statement_position_(1) {} | 97 statement_position_(1) {} |
| 85 | 98 |
| 86 int BreakLocation::Iterator::ReturnPosition() { | |
| 87 if (debug_info_->shared()->HasSourceCode()) { | |
| 88 return debug_info_->shared()->end_position() - | |
| 89 debug_info_->shared()->start_position() - 1; | |
| 90 } else { | |
| 91 return 0; | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info, | 99 BreakLocation::CodeIterator::CodeIterator(Handle<DebugInfo> debug_info, |
| 96 BreakLocatorType type) | 100 BreakLocatorType type) |
| 97 : Iterator(debug_info), | 101 : Iterator(debug_info), |
| 98 reloc_iterator_(debug_info->abstract_code()->GetCode(), | 102 reloc_iterator_(debug_info->abstract_code()->GetCode(), |
| 99 GetModeMask(type)) { | 103 GetModeMask(type)), |
| 104 source_position_iterator_( |
| 105 debug_info->abstract_code()->GetCode()->source_position_table()), |
| 106 start_position_(debug_info_->shared()->start_position()) { |
| 100 // There is at least one break location. | 107 // There is at least one break location. |
| 101 DCHECK(!Done()); | 108 DCHECK(!Done()); |
| 102 Next(); | 109 Next(); |
| 103 } | 110 } |
| 104 | 111 |
| 105 int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) { | 112 int BreakLocation::CodeIterator::GetModeMask(BreakLocatorType type) { |
| 106 int mask = 0; | 113 int mask = 0; |
| 107 mask |= RelocInfo::ModeMask(RelocInfo::POSITION); | |
| 108 mask |= RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION); | |
| 109 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); | 114 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_RETURN); |
| 110 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL); | 115 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL); |
| 111 if (isolate()->is_tail_call_elimination_enabled()) { | 116 if (isolate()->is_tail_call_elimination_enabled()) { |
| 112 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL); | 117 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_TAIL_CALL); |
| 113 } | 118 } |
| 114 if (type == ALL_BREAK_LOCATIONS) { | 119 if (type == ALL_BREAK_LOCATIONS) { |
| 115 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); | 120 mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION); |
| 116 mask |= RelocInfo::ModeMask(RelocInfo::DEBUGGER_STATEMENT); | 121 mask |= RelocInfo::ModeMask(RelocInfo::DEBUGGER_STATEMENT); |
| 117 } | 122 } |
| 118 return mask; | 123 return mask; |
| 119 } | 124 } |
| 120 | 125 |
| 121 void BreakLocation::CodeIterator::Next() { | 126 void BreakLocation::CodeIterator::Next() { |
| 122 DisallowHeapAllocation no_gc; | 127 DisallowHeapAllocation no_gc; |
| 123 DCHECK(!Done()); | 128 DCHECK(!Done()); |
| 124 | 129 |
| 125 // Iterate through reloc info stopping at each breakable code target. | 130 // Iterate through reloc info stopping at each breakable code target. |
| 126 bool first = break_index_ == -1; | 131 bool first = break_index_ == -1; |
| 127 while (!Done()) { | |
| 128 if (!first) reloc_iterator_.next(); | |
| 129 first = false; | |
| 130 if (Done()) return; | |
| 131 | 132 |
| 132 // Whenever a statement position or (plain) position is passed update the | 133 if (!first) reloc_iterator_.next(); |
| 133 // current value of these. | 134 first = false; |
| 134 if (RelocInfo::IsPosition(rmode())) { | 135 if (Done()) return; |
| 135 if (RelocInfo::IsStatementPosition(rmode())) { | 136 |
| 136 statement_position_ = static_cast<int>( | 137 int offset = code_offset(); |
| 137 rinfo()->data() - debug_info_->shared()->start_position()); | 138 while (!source_position_iterator_.done() && |
| 138 } | 139 source_position_iterator_.code_offset() <= offset) { |
| 139 // Always update the position as we don't want that to be before the | 140 position_ = source_position_iterator_.source_position() - start_position_; |
| 140 // statement position. | 141 if (source_position_iterator_.is_statement()) { |
| 141 position_ = static_cast<int>(rinfo()->data() - | 142 statement_position_ = position_; |
| 142 debug_info_->shared()->start_position()); | |
| 143 DCHECK(position_ >= 0); | |
| 144 DCHECK(statement_position_ >= 0); | |
| 145 continue; | |
| 146 } | 143 } |
| 144 source_position_iterator_.Advance(); |
| 145 } |
| 147 | 146 |
| 148 DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) || | 147 DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) || |
| 149 RelocInfo::IsDebuggerStatement(rmode())); | 148 RelocInfo::IsDebuggerStatement(rmode())); |
| 150 | |
| 151 if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) { | |
| 152 // Set the positions to the end of the function. | |
| 153 statement_position_ = position_ = ReturnPosition(); | |
| 154 } | |
| 155 | |
| 156 break; | |
| 157 } | |
| 158 break_index_++; | 149 break_index_++; |
| 159 } | 150 } |
| 160 | 151 |
| 161 BreakLocation BreakLocation::CodeIterator::GetBreakLocation() { | 152 BreakLocation BreakLocation::CodeIterator::GetBreakLocation() { |
| 162 DebugBreakType type; | 153 DebugBreakType type; |
| 163 if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) { | 154 if (RelocInfo::IsDebugBreakSlotAtReturn(rmode())) { |
| 164 type = DEBUG_BREAK_SLOT_AT_RETURN; | 155 type = DEBUG_BREAK_SLOT_AT_RETURN; |
| 165 } else if (RelocInfo::IsDebugBreakSlotAtCall(rmode())) { | 156 } else if (RelocInfo::IsDebugBreakSlotAtCall(rmode())) { |
| 166 type = DEBUG_BREAK_SLOT_AT_CALL; | 157 type = DEBUG_BREAK_SLOT_AT_CALL; |
| 167 } else if (RelocInfo::IsDebugBreakSlotAtTailCall(rmode())) { | 158 } else if (RelocInfo::IsDebugBreakSlotAtTailCall(rmode())) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 DCHECK(position_ >= 0); | 198 DCHECK(position_ >= 0); |
| 208 DCHECK(statement_position_ >= 0); | 199 DCHECK(statement_position_ >= 0); |
| 209 | 200 |
| 210 enum DebugBreakType type = GetDebugBreakType(); | 201 enum DebugBreakType type = GetDebugBreakType(); |
| 211 if (type == NOT_DEBUG_BREAK) continue; | 202 if (type == NOT_DEBUG_BREAK) continue; |
| 212 | 203 |
| 213 if (break_locator_type_ == ALL_BREAK_LOCATIONS) break; | 204 if (break_locator_type_ == ALL_BREAK_LOCATIONS) break; |
| 214 | 205 |
| 215 DCHECK_EQ(CALLS_AND_RETURNS, break_locator_type_); | 206 DCHECK_EQ(CALLS_AND_RETURNS, break_locator_type_); |
| 216 if (type == DEBUG_BREAK_SLOT_AT_CALL) break; | 207 if (type == DEBUG_BREAK_SLOT_AT_CALL) break; |
| 217 if (type == DEBUG_BREAK_SLOT_AT_RETURN) { | 208 if (type == DEBUG_BREAK_SLOT_AT_RETURN) break; |
| 218 DCHECK_EQ(ReturnPosition(), position_); | |
| 219 DCHECK_EQ(ReturnPosition(), statement_position_); | |
| 220 break; | |
| 221 } | |
| 222 } | 209 } |
| 223 break_index_++; | 210 break_index_++; |
| 224 } | 211 } |
| 225 | 212 |
| 226 BreakLocation::DebugBreakType | 213 BreakLocation::DebugBreakType |
| 227 BreakLocation::BytecodeArrayIterator::GetDebugBreakType() { | 214 BreakLocation::BytecodeArrayIterator::GetDebugBreakType() { |
| 228 BytecodeArray* bytecode_array = debug_info_->original_bytecode_array(); | 215 BytecodeArray* bytecode_array = debug_info_->original_bytecode_array(); |
| 229 interpreter::Bytecode bytecode = | 216 interpreter::Bytecode bytecode = |
| 230 interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset())); | 217 interpreter::Bytecodes::FromByte(bytecode_array->get(code_offset())); |
| 231 | 218 |
| (...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2596 } | 2583 } |
| 2597 | 2584 |
| 2598 | 2585 |
| 2599 void LockingCommandMessageQueue::Clear() { | 2586 void LockingCommandMessageQueue::Clear() { |
| 2600 base::LockGuard<base::Mutex> lock_guard(&mutex_); | 2587 base::LockGuard<base::Mutex> lock_guard(&mutex_); |
| 2601 queue_.Clear(); | 2588 queue_.Clear(); |
| 2602 } | 2589 } |
| 2603 | 2590 |
| 2604 } // namespace internal | 2591 } // namespace internal |
| 2605 } // namespace v8 | 2592 } // namespace v8 |
| OLD | NEW |