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
# 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)
)
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"} {
}
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