Handle supportsVariablePaging in DAP
authorTom Tromey <tromey@adacore.com>
Fri, 26 May 2023 19:35:52 +0000 (13:35 -0600)
committerTom Tromey <tromey@adacore.com>
Thu, 22 Jun 2023 15:46:23 +0000 (09:46 -0600)
A bug report about the supportsVariablePaging capability in DAP
resulted in a clarification: when this capability is not present, DAP
implementations should ignore the paging parameters to the "variables"
request.  This patch implements this clarification.

gdb/python/lib/gdb/dap/evaluate.py
gdb/testsuite/gdb.dap/scopes.exp
gdb/testsuite/lib/dap-support.exp

index af7bf43afd0e135f0107d275c3764258c40d0510..a0b199a1ed43224dc2980250f396aed54dd0cbc4 100644 (file)
@@ -20,7 +20,7 @@ import gdb.printing
 from typing import Optional
 
 from .frames import frame_for_id
-from .server import capability, request
+from .server import capability, request, client_bool_capability
 from .startup import send_gdb_with_response, in_gdb_thread
 from .varref import find_variable, VariableReference
 
@@ -98,6 +98,11 @@ def _variables(ref, start, count):
 # Note that we ignore the 'filter' field.  That seems to be
 # specific to javascript.
 def variables(*, variablesReference: int, start: int = 0, count: int = 0, **args):
+    # This behavior was clarified here:
+    # https://github.com/microsoft/debug-adapter-protocol/pull/394
+    if not client_bool_capability("supportsVariablePaging"):
+        start = 0
+        count = 0
     result = send_gdb_with_response(
         lambda: _variables(variablesReference, start, count)
     )
index cf9174f06a289d7f020f09d18043d9b390809d36..6937badcca02f4120ef9faddb69c69387fec1022 100644 (file)
@@ -67,13 +67,23 @@ gdb_assert {[dict get $reg_scope presentationHint] == "registers"} \
 gdb_assert {[dict get $reg_scope namedVariables] > 0} "at least one register"
 
 set num [dict get $scope variablesReference]
-set refs [lindex [dap_check_request_and_response "fetch variables" \
-                     "variables" \
-                     [format {o variablesReference [i %d] count [i 3]} \
-                          $num]] \
-             0]
-
-foreach var [dict get $refs body variables] {
+# Send two requests and combine them, to verify that using a range
+# works.
+set refs1 [lindex [dap_check_request_and_response "fetch variables 0,1" \
+                      "variables" \
+                      [format {o variablesReference [i %d] count [i 2]} \
+                           $num]] \
+              0]
+set refs2 [lindex [dap_check_request_and_response "fetch variables 2" \
+                      "variables" \
+                      [format {o variablesReference [i %d] \
+                                   start [i 2] count [i 1]} \
+                           $num]] \
+              0]
+
+set vars [concat [dict get $refs1 body variables] \
+             [dict get $refs2 body variables]]
+foreach var $vars {
     set name [dict get $var name]
 
     if {$name != "dei"} {
index 92484bfdb8de2b48666dd4b199f6bb4b3b14eb16..e3750e1d0162e59b7f1c0431429491a8bd0a4527 100644 (file)
@@ -232,7 +232,8 @@ proc _dap_initialize {name} {
     }
     return [dap_check_request_and_response $name initialize \
                {o clientID [s "gdb testsuite"] \
-                    supportsVariableType [l true]}]
+                    supportsVariableType [l true] \
+                    supportsVariablePaging [l true]}]
 }
 
 # Start gdb, send a DAP initialize request, and then a launch request