Handle Source in DAP breakpointLocations

This changes the DAP breakpointLocations request to accept a Source
and to decode it properly.
This commit is contained in:
Tom Tromey 2023-07-27 14:21:13 -06:00
parent c64cba1b56
commit 4b6521cf69
2 changed files with 20 additions and 8 deletions

View File

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

View File

@ -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 = []