diff options
-rw-r--r-- | gdb/python/lib/gdb/dap/evaluate.py | 24 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dap/basic-dap.exp | 5 |
2 files changed, 26 insertions, 3 deletions
diff --git a/gdb/python/lib/gdb/dap/evaluate.py b/gdb/python/lib/gdb/dap/evaluate.py index d04ac16..55d41b0 100644 --- a/gdb/python/lib/gdb/dap/evaluate.py +++ b/gdb/python/lib/gdb/dap/evaluate.py @@ -38,12 +38,30 @@ def _evaluate(expr, frame_id): return ref.to_object() +# Helper function to evaluate a gdb command in a certain frame. +@in_gdb_thread +def _repl(command, frame_id): + if frame_id is not None: + frame = frame_for_id(frame_id) + frame.select() + val = gdb.execute(command, from_tty=True, to_string=True) + return { + "result": val, + "variablesReference": 0, + } + + # FIXME 'format' & hex # FIXME supportsVariableType handling -# FIXME "repl" @request("evaluate") -def eval_request(*, expression, frameId=None, **args): - return send_gdb_with_response(lambda: _evaluate(expression, frameId)) +def eval_request(*, expression, frameId=None, context="variables", **args): + if context in ("watch", "variables"): + # These seem to be expression-like. + return send_gdb_with_response(lambda: _evaluate(expression, frameId)) + elif context == "repl": + return send_gdb_with_response(lambda: _repl(expression, frameId)) + else: + raise Exception(f'unknown evaluate context "{context}"') @in_gdb_thread diff --git a/gdb/testsuite/gdb.dap/basic-dap.exp b/gdb/testsuite/gdb.dap/basic-dap.exp index 6f14df5..5e6e1b5 100644 --- a/gdb/testsuite/gdb.dap/basic-dap.exp +++ b/gdb/testsuite/gdb.dap/basic-dap.exp @@ -163,4 +163,9 @@ set obj [dap_check_request_and_response "disassemble one instruction" \ set response [lindex $obj 0] gdb_assert { [dict exists $response body instructions] } "instructions in disassemble output" +set obj [dap_check_request_and_response "command repl" \ + evaluate {o expression [s {output 23}] context [s repl]}] +set response [lindex $obj 0] +gdb_assert {[dict get $response body result] == 23} + dap_shutdown |