Respect supportsMemoryReferences in DAP

I noticed that the support for memoryReference in the "variables"
output is gated on the client "supportsMemoryReferences" capability.

This patch implements this and makes some other changes to the DAP
memory reference code:

* Remove the memoryReference special case from _SetResult.
  Upstream DAP fixed this oversight in response to
  https://github.com/microsoft/debug-adapter-protocol/issues/414

* Don't use the address of a variable as its memoryReference -- only
  emit this for pointer types.  There's no spec support for the
  previous approach.

* Use strip_typedefs to handle typedefs of pointers.
This commit is contained in:
Tom Tromey
2023-07-27 13:06:38 -06:00
parent af93035b27
commit 2128d888b8
5 changed files with 13 additions and 12 deletions

View File

@ -55,13 +55,6 @@ class _SetResult(VariableReference):
def __init__(self, value): def __init__(self, value):
super().__init__(None, value, "value") super().__init__(None, value, "value")
def to_object(self):
result = super().to_object()
# This is not specified in the setExpression result.
if "memoryReference" in result:
del result["memoryReference"]
return result
# Helper function to perform an assignment. # Helper function to perform an assignment.
@in_gdb_thread @in_gdb_thread

View File

@ -162,10 +162,13 @@ class VariableReference(BaseReference):
result["indexedVariables"] = num_children result["indexedVariables"] = num_children
else: else:
result["namedVariables"] = num_children result["namedVariables"] = num_children
if self.value.type.code == gdb.TYPE_CODE_PTR: if client_bool_capability("supportsMemoryReferences"):
# https://github.com/microsoft/debug-adapter-protocol/issues/414
# changed DAP to allow memory references for any of the
# variable response requests, and to lift the restriction
# to pointer-to-function from Variable.
if self.value.type.strip_typedefs().code == gdb.TYPE_CODE_PTR:
result["memoryReference"] = hex(int(self.value)) result["memoryReference"] = hex(int(self.value))
elif self.value.address is not None:
result["memoryReference"] = hex(int(self.value.address))
if client_bool_capability("supportsVariableType"): if client_bool_capability("supportsVariableType"):
result["type"] = str(self.value.type) result["type"] = str(self.value.type)
return result return result

View File

@ -19,6 +19,8 @@
uint32_t thirty_two = 7; uint32_t thirty_two = 7;
uint32_t *thirty_two_p = &thirty_two;
int main () int main ()
{ {
return 0; /* BREAK */ return 0; /* BREAK */

View File

@ -47,6 +47,8 @@ set obj [dap_check_request_and_response "evaluate global" \
evaluate {o expression [s thirty_two]}] evaluate {o expression [s thirty_two]}]
dap_match_values "global value" [lindex $obj 0] "body result" 7 dap_match_values "global value" [lindex $obj 0] "body result" 7
set obj [dap_check_request_and_response "evaluate global pointer" \
evaluate {o expression [s thirty_two_p]}]
set addr [dict get [lindex $obj 0] body memoryReference] set addr [dict get [lindex $obj 0] body memoryReference]
set obj [dap_check_request_and_response "read memory" \ set obj [dap_check_request_and_response "read memory" \

View File

@ -233,7 +233,8 @@ proc _dap_initialize {name} {
return [dap_check_request_and_response $name initialize \ return [dap_check_request_and_response $name initialize \
{o clientID [s "gdb testsuite"] \ {o clientID [s "gdb testsuite"] \
supportsVariableType [l true] \ supportsVariableType [l true] \
supportsVariablePaging [l true]}] supportsVariablePaging [l true] \
supportsMemoryReferences [l true]}]
} }
# Start gdb, send a DAP initialize request, and then a launch request # Start gdb, send a DAP initialize request, and then a launch request