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); |