From 13bd1a9175962980a3b0f1c0598698858c72fc04 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 27 Jul 2023 14:27:05 -0600 Subject: [PATCH] Implement DAP "source" request This implements the DAP "source" request. I renamed the "loadedSources" function from "sources" to "loaded_sources" to avoid any confusion. I also moved the loadedSources test to the new sources.exp. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30691 --- gdb/python/lib/gdb/dap/sources.py | 24 ++++++++++++- gdb/testsuite/gdb.dap/basic-dap.exp | 3 -- gdb/testsuite/gdb.dap/sources.c | 22 ++++++++++++ gdb/testsuite/gdb.dap/sources.exp | 52 +++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.dap/sources.c create mode 100644 gdb/testsuite/gdb.dap/sources.exp diff --git a/gdb/python/lib/gdb/dap/sources.py b/gdb/python/lib/gdb/dap/sources.py index 806352836db..7fa1ae430c8 100644 --- a/gdb/python/lib/gdb/dap/sources.py +++ b/gdb/python/lib/gdb/dap/sources.py @@ -82,5 +82,27 @@ def _sources(): @request("loadedSources") @capability("supportsLoadedSourcesRequest") -def sources(**extra): +def loaded_sources(**extra): return send_gdb_with_response(_sources) + + +# This helper is needed because we must only access the globals here +# from the gdb thread. +@in_gdb_thread +def _get_source(source): + filename = decode_source(source) + with open(filename) as f: + content = f.read() + return { + "content": content, + } + + +@request("source") +def source(*, source=None, sourceReference: int, **extra): + # The 'sourceReference' parameter is required by the spec, but is + # for backward compatibility, which I take to mean that the + # 'source' is preferred. + if source is None: + source = {"sourceReference": sourceReference} + return send_gdb_with_response(lambda: _get_source(source)) diff --git a/gdb/testsuite/gdb.dap/basic-dap.exp b/gdb/testsuite/gdb.dap/basic-dap.exp index c4a1698beda..7dfc759baac 100644 --- a/gdb/testsuite/gdb.dap/basic-dap.exp +++ b/gdb/testsuite/gdb.dap/basic-dap.exp @@ -207,7 +207,4 @@ set obj [dap_check_request_and_response "command repl" \ set response [lindex $obj 0] gdb_assert {[dict get $response body result] == 23} -set obj [dap_check_request_and_response sources loadedSources] -gdb_assert {[string first basic-dap.c $obj] != -1} - dap_shutdown diff --git a/gdb/testsuite/gdb.dap/sources.c b/gdb/testsuite/gdb.dap/sources.c new file mode 100644 index 00000000000..599d1bd9f77 --- /dev/null +++ b/gdb/testsuite/gdb.dap/sources.c @@ -0,0 +1,22 @@ +/* Copyright 2023 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +main () +{ + /* Distinguishing comment. */ +} diff --git a/gdb/testsuite/gdb.dap/sources.exp b/gdb/testsuite/gdb.dap/sources.exp new file mode 100644 index 00000000000..a12c2089417 --- /dev/null +++ b/gdb/testsuite/gdb.dap/sources.exp @@ -0,0 +1,52 @@ +# Copyright 2023 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test 'sources' and 'loadedSources'. + +require allow_dap_tests + +load_lib dap-support.exp + +standard_testfile + +if {[build_executable ${testfile}.exp $testfile] == -1} { + return +} + +if {[dap_launch $testfile stop_at_main 1] == ""} { + return +} + +set obj [dap_check_request_and_response loadedSources loadedSources] +set ref 0 +foreach src [dict get [lindex $obj 0] body sources] { + if {[file tail [dict get $src name]] == "sources.c"} { + set ref [dict get $src sourceReference] + } +} + +if {$ref == 0} { + fail "sources.c in loadedSources" +} else { + pass "sources.c in loadedSources" + + set obj [dap_check_request_and_response "get source" source \ + [format {o sourceReference [i %d]} $ref]] + set text [dict get [lindex $obj 0] body content] + gdb_assert {[string first "Distinguishing comment" $text] != -1} +} + + +dap_shutdown -- 2.30.2