From patchwork Wed May 24 16:37:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 69981 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 917E5388981F for ; Wed, 24 May 2023 16:40:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 917E5388981F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1684946444; bh=0ltZs90hJVadHb2k2EY7EOXd9nQnKQxP+VV/0ttKABo=; h=Date:Subject:References:In-Reply-To:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=BJQmuUln8BIBB0nSO6e4/PVXLDTATsZh1cLafwEeAvhNNC/DMT5BiBzea5GO02Ulj MYgiyDGhRZMu3PRKemoPRe8MWdc8ZTA62o3eZOcu1qYRpl6JISq0q8HTK/0FNDfygY Ojwcz2UBBcHeamXlUfuWHCeeMyhveX3+M/tUn+hQ= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-io1-xd31.google.com (mail-io1-xd31.google.com [IPv6:2607:f8b0:4864:20::d31]) by sourceware.org (Postfix) with ESMTPS id 45FBC3857359 for ; Wed, 24 May 2023 16:37:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 45FBC3857359 Received: by mail-io1-xd31.google.com with SMTP id ca18e2360f4ac-77480507360so31077339f.3 for ; Wed, 24 May 2023 09:37:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684946255; x=1687538255; h=to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0ltZs90hJVadHb2k2EY7EOXd9nQnKQxP+VV/0ttKABo=; b=gQ96IE2PiuxaO8es5toSxw9gadjGF5Stf9W7IppLGwx4J8wZZPrXXmyHH7WiTnlRZQ 4iGO0v07XnbCU3RoC0Nxwlz4EwDQr1M10No5ObBI+wHLrgIbUS6hFADBCJHRWgt5B9pP 0WiKRFCJe2viDcg5DHg+C0Zp5Bq469goWDTlGE281PlDlT++Zd3v+1XqPffQr/3yK/RR EFjfM7Qk1oWk3z5BJqhZ52K2TJiTh0H4eISN4bBeCHCTkFq0IzeVW3VDlKIgnMHSM4wP GNdBkSmyh3YfHEk5gXmcbd7wS++jHye1Ai2AH+7yuE6wWdcZwe7sFhb/JsqIh4RmEUxO 31JA== X-Gm-Message-State: AC+VfDy5UYIfBVevT3+kXu4qg7P/7dKlLYv7CoE7jXW6wPKLYWZTjuOC n8n1kZnbuuE1iGhl4FdcjWTKO3HSedjV0A+gACVPzA== X-Google-Smtp-Source: ACHHUZ5/P/rjf6DqY8jrTzWQRPyIGbQOrBSmaQlncTX97QOSTkqmD9MAEgIg8D+ML0aGmEa2GNBs3w== X-Received: by 2002:a5d:8ad7:0:b0:76c:6382:8d5b with SMTP id e23-20020a5d8ad7000000b0076c63828d5bmr12169194iot.10.1684946255626; Wed, 24 May 2023 09:37:35 -0700 (PDT) Received: from localhost.localdomain (71-211-130-244.hlrn.qwest.net. [71.211.130.244]) by smtp.gmail.com with ESMTPSA id o22-20020a6bcf16000000b0076c81bf2731sm3397266ioa.20.2023.05.24.09.37.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 24 May 2023 09:37:35 -0700 (PDT) Date: Wed, 24 May 2023 10:37:10 -0600 Subject: [PATCH 19/25] Implement DAP setExpression request MIME-Version: 1.0 Message-Id: <20230427-ada-catch-exception-v1-19-947caa9905e3@adacore.com> References: <20230427-ada-catch-exception-v1-0-947caa9905e3@adacore.com> In-Reply-To: <20230427-ada-catch-exception-v1-0-947caa9905e3@adacore.com> To: gdb-patches@sourceware.org X-Mailer: b4 0.12.2 X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tom Tromey via Gdb-patches From: Tom Tromey Reply-To: Tom Tromey Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" This implements the DAP setExpression request. --- gdb/python/lib/gdb/dap/evaluate.py | 24 +++++++++++++++++++++++- gdb/testsuite/gdb.dap/basic-dap.exp | 5 +++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/gdb/python/lib/gdb/dap/evaluate.py b/gdb/python/lib/gdb/dap/evaluate.py index 4fc0f31486c..1db6962f8e0 100644 --- a/gdb/python/lib/gdb/dap/evaluate.py +++ b/gdb/python/lib/gdb/dap/evaluate.py @@ -20,7 +20,7 @@ import gdb.printing from typing import Optional from .frames import frame_for_id -from .server import request +from .server import capability, request from .startup import send_gdb_with_response, in_gdb_thread from .varref import find_variable, VariableReference @@ -43,6 +43,20 @@ def _evaluate(expr, frame_id): return ref.to_object() +# Helper function to perform an assignment. +@in_gdb_thread +def _set_expression(expression, value, frame_id): + global_context = True + if frame_id is not None: + frame = frame_for_id(frame_id) + frame.select() + global_context = False + lhs = gdb.parse_and_eval(expression, global_context=global_context) + rhs = gdb.parse_and_eval(value, global_context=global_context) + lhs.assign(rhs) + return EvaluateResult(lhs).to_object() + + # Helper function to evaluate a gdb command in a certain frame. @in_gdb_thread def _repl(command, frame_id): @@ -89,3 +103,11 @@ def variables(*, variablesReference: int, start: int = 0, count: int = 0, **args lambda: _variables(variablesReference, start, count) ) return {"variables": result} + + +@capability("supportsSetExpression") +@request("setExpression") +def set_expression( + *, expression: str, value: str, frameId: Optional[int] = None, **args +): + return send_gdb_with_response(lambda: _set_expression(expression, value, frameId)) diff --git a/gdb/testsuite/gdb.dap/basic-dap.exp b/gdb/testsuite/gdb.dap/basic-dap.exp index ce739875404..9aaa94051e6 100644 --- a/gdb/testsuite/gdb.dap/basic-dap.exp +++ b/gdb/testsuite/gdb.dap/basic-dap.exp @@ -159,6 +159,11 @@ set obj [dap_check_request_and_response "evaluate global in main" \ dap_match_values "global value in main" [lindex $obj 0] \ "body result" 25 +set obj [dap_check_request_and_response "set global in main" \ + setExpression {o expression [s global_variable] value [s 23]}] +dap_match_values "global value in main after set" [lindex $obj 0] \ + "body result" 23 + set obj [dap_request_and_response \ evaluate {o expression [s nosuchvariable]}] set response [lindex $obj 0]