Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index b7a5b2e4ec45e1642a6ad578e9f98604f490d806..3791af42d9eb576241679614d92129f5878a23d0 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -8926,6 +8926,51 @@ MaybeLocal<String> DebugInterface::Script::Source() const { |
| handle_scope.CloseAndEscape(i::Handle<i::String>::cast(value))); |
| } |
| +bool DebugInterface::Script::GetPossibleBreakpoints( |
| + int start_line, int start_column, int end_line, int end_column, |
| + std::vector<int>& positions) const { |
|
Yang
2016/11/03 08:03:26
Can we use std::pair<int, int> or a struct to wrap
kozy
2016/11/03 17:26:44
Replaced with Location object. I can convert it in
|
| + i::Handle<i::Script> script = Utils::OpenHandle(this); |
| + int start_offset = GetSourcePosition(start_line, start_column); |
| + int end_offset; |
| + if (end_line == -1 || end_column == -1) |
| + end_offset = GetSourcePosition(static_cast<int>(LineEnds().size()), 0); |
| + else |
| + end_offset = GetSourcePosition(end_line, end_column); |
| + if (start_offset >= end_offset) return true; |
| + |
| + i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| + std::vector<int> offsets; |
| + if (!isolate->debug()->GetPossibleBreakpoints(script, start_offset, |
| + end_offset, offsets)) |
| + return false; |
| + std::set<int> unique_offsets; |
| + for (size_t i = 0; i < offsets.size(); ++i) unique_offsets.insert(offsets[i]); |
| + |
| + int current_line_end_index = 0; |
| + std::vector<int> line_endings = LineEnds(); |
| + for (const auto& it : unique_offsets) { |
| + int offset = it; |
| + while (offset > line_endings[current_line_end_index] && |
| + current_line_end_index < line_endings.size()) |
| + ++current_line_end_index; |
| + CHECK(current_line_end_index < line_endings.size()); |
| + positions.push_back(current_line_end_index); |
| + positions.push_back(offset - |
| + (current_line_end_index > 0 |
| + ? (line_endings[current_line_end_index - 1] + 1) |
| + : 0)); |
| + } |
| + return true; |
| +} |
| + |
| +int DebugInterface::Script::GetSourcePosition(int line, int column) const { |
| + i::Handle<i::Script> script = Utils::OpenHandle(this); |
| + std::vector<int> line_endings = LineEnds(); |
| + if (line == 0) return std::min(column, line_endings[line]); |
| + if (line >= line_endings.size()) return line_endings.back(); |
| + return std::min(line_endings[line - 1] + column + 1, line_endings[line]); |
| +} |
| + |
| MaybeLocal<DebugInterface::Script> DebugInterface::Script::Wrap( |
| v8::Isolate* v8_isolate, v8::Local<v8::Object> script) { |
| i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |