From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id fZS9BJJ9JmFwCAAAWB0awg (envelope-from ) for ; Wed, 25 Aug 2021 13:27:46 -0400 Received: by simark.ca (Postfix, from userid 112) id 01EA01EE1A; Wed, 25 Aug 2021 13:27:45 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED, MAILING_LIST_MULTI,T_DKIM_INVALID,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id BECF81E79C for ; Wed, 25 Aug 2021 13:27:44 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 13CB2385AC2D for ; Wed, 25 Aug 2021 17:27:44 +0000 (GMT) Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by sourceware.org (Postfix) with ESMTPS id 4C5CC385742D for ; Wed, 25 Aug 2021 17:27:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4C5CC385742D Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wr1-x42b.google.com with SMTP id u9so394260wrg.8 for ; Wed, 25 Aug 2021 10:27:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Tfa9jM3bRa2Jo63jwFPBHBnkrjXhP2aWHIPhqh5EOfI=; b=CmoEmfd0rdJ4B0fo/yTrBcXQPXoj6SMmnSEwlYjWnrGpLqHHzwut+H6fVgtqjcWlsc wGL9bILSNroHxWj1YpHxvaml16oQJ4CoTRRqVdMsmOnfqFDJdLIKNt1jmT57MQwhvbuz 5GjPUFmCYQdhlGyLGN+xBmR6asYppFzaX0n4Oj7uynCTEJf4Az6xPMZ1dySjHoAJX/XK p+IYPnbLJd+pdZCCIFymXzccTscyp9C/DV2/GzqmY3VJF7bevKVeN7ZAqbBHMG+W3Lb2 MjVzCW5rgvEcJQ5emq/6pn66WNGoYKd2NsXSB5wMLfUmDrM+CjSGq8NRp5c9+IhUI5TH m5Pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Tfa9jM3bRa2Jo63jwFPBHBnkrjXhP2aWHIPhqh5EOfI=; b=E9t7xB7dNcPbMPrvjlEDR7koTlj6dBiTucWjg+RXP8WyUtBvBLx41Isp7Er2xLgQRk x0MBrlZ1GQ0KlPw2l9Qa8Iyo+RpJD1EVw9GxbR5QSXKkwuZUk4ytX8hVubKfCq3dqsox Qx3V/oGdGIzANbshA5cTzwyMCvy9Zy1FIHHS3GyeylEzRPf1HiX9M/xTfkvqu3LoiJ/R 3BeeRY8tDVKqydEsWvwTD/PsZb3nSD1BXQL/GxJZx8n7PaPQMMDxhpwzFVQdNYlvsrif s6K9/1n3d1hJgrDAG5tm500jKH1u7/7+8mfYKseFzAI8lGZyQtzaf2G8naPPh/M88Htu ObNg== X-Gm-Message-State: AOAM532mny9UNrsNbl9jDMGM9dPRzQwbXo2x7ZGv67ICQbUmZ9E4HucU 5lsQhEO13F7y2D6vixRp8CHTT2OLjTCxSA== X-Google-Smtp-Source: ABdhPJyLXLWWSXxPtMTcF7AeIRZgBfsiwpoEiL/gm5Hov3M0uHkLGvM5WTUX3bDpG3jlrwXANx2Hpg== X-Received: by 2002:adf:c501:: with SMTP id q1mr103281wrf.150.1629912442146; Wed, 25 Aug 2021 10:27:22 -0700 (PDT) Received: from localhost (host86-188-49-44.range86-188.btcentralplus.com. [86.188.49.44]) by smtp.gmail.com with ESMTPSA id s13sm6172136wmc.47.2021.08.25.10.27.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Aug 2021 10:27:21 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCHv2] gdb/python: add facility to add values into the history Date: Wed, 25 Aug 2021 18:27:19 +0100 Message-Id: <20210825172719.3814152-1-andrew.burgess@embecosm.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <874kbfaon0.fsf@tromey.com> References: <874kbfaon0.fsf@tromey.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" Tom, Thanks for the feedback. I've changed history_add to add_history throughout. Nothing else has changed, so it probably doesn't need a code review. I'll just wait for a docs review before merging. Thanks, Andrew --- The guile API has (history-append! ) to add values into GDB's history list. There is currently no equivalent in the Python API. This commit adds gdb.add_history() to the Python API, this function adds into the history list, and returns the index of the new item in the history list. The can be a gdb.Value object, or anything that can be passed to the constructor of gdb.Value. --- gdb/NEWS | 6 ++++++ gdb/doc/python.texi | 14 ++++++++++++++ gdb/python/py-value.c | 27 +++++++++++++++++++++++++++ gdb/python/python-internal.h | 1 + gdb/python/python.c | 2 ++ gdb/testsuite/gdb.python/py-value.exp | 26 ++++++++++++++++++++++++++ 6 files changed, 76 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index ec3058ea118..08a7651b08a 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -10,6 +10,12 @@ maint show backtrace-on-fatal-signal fatal signal. This only supported on some platforms where the backtrace and backtrace_symbols_fd functions are available. +* Python API + + ** New function gdb.add_history(), which takes a gdb.Value object + and adds the value to GDB's history list. An integer, the index + of the new item in the history list is returned. + *** Changes in GDB 11 * The 'set disassembler-options' command now supports specifying options diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi index f4865b3d6a6..1363c539e08 100644 --- a/gdb/doc/python.texi +++ b/gdb/doc/python.texi @@ -346,6 +346,20 @@ @code{gdb.Value} (@pxref{Values From Inferior}). @end defun +@findex gdb.add_history +@defun gdb.add_history (value) +Append @var{value}, an instance of @code{gdb.Value} (@pxref{Values +From Inferior}), to @value{GDBN}'s value history (@pxref{Value +History}) and return an integer, its history number. If @var{value} +is not a @code{gdb.Value}, it is is converted using the +@code{gdb.Value} constructor. If @var{value} can't be converted to a +@code{gdb.Value} then a @code{TypeError} is raised. + +When a command implemented in Python prints a single @code{gdb.Value} +as its result, then placing the value into the history will allow the +user convenient access to those values via CLI history facilities. +@end defun + @findex gdb.convenience_variable @defun gdb.convenience_variable (name) Return the value of the convenience variable (@pxref{Convenience diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 8df8a15f8d6..26d5940f842 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1960,6 +1960,33 @@ gdbpy_history (PyObject *self, PyObject *args) return value_to_value_object (res_val); } +/* Add a gdb.Value into GDB's history, and return (as an integer) the + position of the newly added value. */ +PyObject * +gdbpy_add_history (PyObject *self, PyObject *args) +{ + PyObject *value_obj; + + if (!PyArg_ParseTuple (args, "O", &value_obj)) + return nullptr; + + struct value *value = convert_value_from_python (value_obj); + if (value == nullptr) + return nullptr; + + try + { + int idx = record_latest_value (value); + return gdb_py_object_from_longest (idx).release (); + } + catch (const gdb_exception &except) + { + GDB_PY_HANDLE_EXCEPTION (except); + } + + return nullptr; +} + /* Return the value of a convenience variable. */ PyObject * gdbpy_convenience_variable (PyObject *self, PyObject *args) diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 690d2fb43c0..0e140f1af61 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -412,6 +412,7 @@ extern enum ext_lang_rc gdbpy_get_matching_xmethod_workers PyObject *gdbpy_history (PyObject *self, PyObject *args); +PyObject *gdbpy_add_history (PyObject *self, PyObject *args); PyObject *gdbpy_convenience_variable (PyObject *self, PyObject *args); PyObject *gdbpy_set_convenience_variable (PyObject *self, PyObject *args); PyObject *gdbpy_breakpoints (PyObject *, PyObject *); diff --git a/gdb/python/python.c b/gdb/python/python.c index e42cbc4fd5e..6af9c722e7b 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -2076,6 +2076,8 @@ PyMethodDef python_GdbMethods[] = { { "history", gdbpy_history, METH_VARARGS, "Get a value from history" }, + { "add_history", gdbpy_add_history, METH_VARARGS, + "Add a value to the value history list" }, { "execute", (PyCFunction) execute_gdb_command, METH_VARARGS | METH_KEYWORDS, "execute (command [, from_tty] [, to_string]) -> [String]\n\ Evaluate command, a string, as a gdb CLI command. Optionally returns\n\ diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp index eca4a474727..d9f1a76a388 100644 --- a/gdb/testsuite/gdb.python/py-value.exp +++ b/gdb/testsuite/gdb.python/py-value.exp @@ -575,6 +575,31 @@ proc test_value_from_buffer {} { "attempt to construct value with string as type" } +# Test the gdb.add_history API. +proc test_add_to_history {} { + # Add a gdb.Value to the value history list. + gdb_test_no_output "python idx = gdb.add_history(gdb.Value(42))" \ + "add value 42 to the history list" + gdb_test "python print (\"$%d = %s\" % (idx, gdb.history (idx)))" \ + " = 42" "print value 42 from the history list" + set idx [get_python_valueof "idx" "**DEFAULT**" "get idx for value 42"] + gdb_test "print \$${idx}" " = 42" + + # Add something to the history list that can be converted into a + # gdb.Value. + gdb_test_no_output "python idx = gdb.add_history(84)" \ + "add value to 84 to the history list" + gdb_test "python print (\"$%d = %s\" % (idx, gdb.history (idx)))" \ + " = 84" "print value 84 from the history list" + set idx [get_python_valueof "idx" "**DEFAULT**" "get idx for value 84"] + gdb_test "print \$${idx}" " = 84" + + # Try adding something that can't be converted to a gdb.Value, + # this should give an error. + gdb_test "python idx = gdb.add_history(gdb.GdbError(\"an error\"))" \ + "TypeError: Could not convert Python object: .*" +} + # Build C version of executable. C++ is built later. if { [build_inferior "${binfile}" "c"] < 0 } { return -1 @@ -594,6 +619,7 @@ test_objfiles test_parse_and_eval test_value_hash test_float_conversion +test_add_to_history # The following tests require execution. -- 2.25.4