Handle supportsVariablePaging in DAP
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.
This commit is contained in:
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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]
|
||||
# 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]
|
||||
|
||||
foreach var [dict get $refs body variables] {
|
||||
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"} {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user