From 4b6521cf69f45050f857edeb592bc46ea198041d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 27 Jul 2023 14:21:13 -0600 Subject: [PATCH] Handle Source in DAP breakpointLocations This changes the DAP breakpointLocations request to accept a Source and to decode it properly. --- gdb/python/lib/gdb/dap/locations.py | 12 ++++-------- gdb/python/lib/gdb/dap/sources.py | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gdb/python/lib/gdb/dap/locations.py b/gdb/python/lib/gdb/dap/locations.py index 594f1bad45b..a299e8da959 100644 --- a/gdb/python/lib/gdb/dap/locations.py +++ b/gdb/python/lib/gdb/dap/locations.py @@ -19,11 +19,13 @@ import gdb 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"] @@ -44,10 +46,4 @@ def _find_lines(filename, start_line, end_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)) diff --git a/gdb/python/lib/gdb/dap/sources.py b/gdb/python/lib/gdb/dap/sources.py index 50b5909ed1d..806352836db 100644 --- a/gdb/python/lib/gdb/dap/sources.py +++ b/gdb/python/lib/gdb/dap/sources.py @@ -54,6 +54,22 @@ def make_source(fullname, filename): 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 = [] -- 2.30.2