from typing import Optional
from .server import capability, request
+from .sources import decode_source
from .startup import in_gdb_thread, send_gdb_with_response
@in_gdb_thread
-def _find_lines(filename, start_line, end_line):
+def _find_lines(source, start_line, end_line):
+ filename = decode_source(source)
lines = set()
for entry in gdb.execute_mi("-symbol-list-lines", filename)["lines"]:
line = entry["line"]
def breakpoint_locations(*, source, line: int, endLine: Optional[int] = None, **extra):
if endLine is None:
endLine = line
- if "path" in source:
- filename = source["path"]
- elif "name" in source:
- filename = source["name"]
- else:
- raise Exception("")
- return send_gdb_with_response(lambda: _find_lines(filename, line, endLine))
+ return send_gdb_with_response(lambda: _find_lines(source, line, endLine))
return result
+@in_gdb_thread
+def decode_source(source):
+ """Decode a Source object.
+
+ Finds and returns the filename of a given Source object."""
+ if "path" in source:
+ return source["path"]
+ if "sourceReference" not in source:
+ raise Exception("either 'path' or 'sourceReference' must appear in Source")
+ ref = source["sourceReference"]
+ global _id_map
+ if ref not in _id_map:
+ raise Exception("no sourceReference " + str(ref))
+ return _id_map[ref]["path"]
+
+
@in_gdb_thread
def _sources():
result = []