aboutsummaryrefslogtreecommitdiff
path: root/gdb/python
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2024-07-02 10:43:51 -0600
committerTom Tromey <tromey@adacore.com>2024-07-23 11:31:49 -0600
commitc51fb386792206f12459b22bf7eec8345c4886a6 (patch)
treecbcd572e8ca66ff6418fa36177f7e567e72cd582 /gdb/python
parentfa8c46f5adeddedc492534302057deb7fcf1939a (diff)
downloadgdb-c51fb386792206f12459b22bf7eec8345c4886a6.zip
gdb-c51fb386792206f12459b22bf7eec8345c4886a6.tar.gz
gdb-c51fb386792206f12459b22bf7eec8345c4886a6.tar.bz2
Add returnValue scope to DAP
The DAP spec recently changed to add a new scope for the return value from a "stepOut" request. This new scope uses the "returnValue" presentation hint. See: https://github.com/microsoft/debug-adapter-protocol/issues/458 This patch implements this for gdb. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31945 Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Diffstat (limited to 'gdb/python')
-rw-r--r--gdb/python/lib/gdb/dap/scopes.py23
1 files changed, 11 insertions, 12 deletions
diff --git a/gdb/python/lib/gdb/dap/scopes.py b/gdb/python/lib/gdb/dap/scopes.py
index d0e9115..fb90f64 100644
--- a/gdb/python/lib/gdb/dap/scopes.py
+++ b/gdb/python/lib/gdb/dap/scopes.py
@@ -111,20 +111,19 @@ class _ScopeReference(BaseReference):
return symbol_value(self.var_list[idx], self.frame)
-# A _ScopeReference that prepends the most recent return value. Note
-# that this object is only created if such a value actually exists.
+# A _ScopeReference that wraps the 'finish' value. Note that this
+# object is only created if such a value actually exists.
class _FinishScopeReference(_ScopeReference):
- def __init__(self, *args):
- super().__init__(*args)
+ def __init__(self, frame):
+ super().__init__("Return", "returnValue", frame, ())
def child_count(self):
- return super().child_count() + 1
+ return 1
def fetch_one_child(self, idx):
- if idx == 0:
- global _last_return_value
- return ("(return)", _last_return_value)
- return super().fetch_one_child(idx - 1)
+ assert idx == 0
+ global _last_return_value
+ return ("(return)", _last_return_value)
class _RegisterReference(_ScopeReference):
@@ -159,11 +158,11 @@ def scopes(*, frameId: int, **extra):
# Make sure to handle the None case as well as the empty
# iterator case.
locs = tuple(frame.frame_locals() or ())
- if has_return_value:
- scopes.append(_FinishScopeReference("Locals", "locals", frame, locs))
- elif locs:
+ if locs:
scopes.append(_ScopeReference("Locals", "locals", frame, locs))
scopes.append(_RegisterReference("Registers", frame))
+ if has_return_value:
+ scopes.append(_FinishScopeReference(frame))
frame_to_scope[frameId] = scopes
global_scope = get_global_scope(frame)
if global_scope is not None: