aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-01-24 15:19:43 +0000
committerAndrew Burgess <aburgess@redhat.com>2022-01-26 21:58:12 +0000
commit30a87e90be195dcce555a0904cc5dbd960349271 (patch)
tree0d2c98c5a8416afabe6a39e141928b1fb15d0a56 /gdb
parent51d185a65f3679f887d456e20d22475ac8586938 (diff)
downloadfsf-binutils-gdb-30a87e90be195dcce555a0904cc5dbd960349271.zip
fsf-binutils-gdb-30a87e90be195dcce555a0904cc5dbd960349271.tar.gz
fsf-binutils-gdb-30a87e90be195dcce555a0904cc5dbd960349271.tar.bz2
gdb/python: add gdb.history_count function
Add a new function gdb.history_count to the Python api, this function returns an integer, the number of items in GDB's value history. This is useful if you want to pull items from the history by their absolute number, for example, if you wanted to show a complete history list. Previously we could figure out how many items are in the history list by trying to fetch the items, and then catching the exception when the item is not available, but having this function seems nicer.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/NEWS3
-rw-r--r--gdb/doc/python.texi5
-rw-r--r--gdb/python/py-value.c8
-rw-r--r--gdb/python/python-internal.h1
-rw-r--r--gdb/python/python.c2
-rw-r--r--gdb/testsuite/gdb.python/py-value.exp12
-rw-r--r--gdb/value.c8
-rw-r--r--gdb/value.h4
8 files changed, 43 insertions, 0 deletions
diff --git a/gdb/NEWS b/gdb/NEWS
index 31dff78..e190059 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -109,6 +109,9 @@ show debug lin-lwp
integer, the index of the new item in the history list, is
returned.
+ ** New function gdb.history_count(), which returns the number of
+ values in GDB's value history.
+
** New gdb.events.gdb_exiting event. This event is called with a
gdb.GdbExitingEvent object which has the read-only attribute
'exit_code', which contains the value of the GDB exit code. This
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index 39bf6e8..f1d1827 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -387,6 +387,11 @@ 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
+@defun gdb.history_count ()
+Return an integer indicating the number of values in @value{GDBN}'s
+value history (@pxref{Value History}).
+@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 d6ceb54..6401d96 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -2012,6 +2012,14 @@ gdbpy_add_history (PyObject *self, PyObject *args)
return nullptr;
}
+/* Return an integer, the number of items in GDB's history. */
+
+PyObject *
+gdbpy_history_count (PyObject *self, PyObject *args)
+{
+ return gdb_py_object_from_ulongest (value_history_count ()).release ();
+}
+
/* 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 ccea5c4..5e15f62 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);
+extern PyObject *gdbpy_history_count (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 7ddc170..2c8081e 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -2212,6 +2212,8 @@ PyMethodDef python_GdbMethods[] =
"Get a value from history" },
{ "add_history", gdbpy_add_history, METH_VARARGS,
"Add a value to the value history list" },
+ { "history_count", gdbpy_history_count, METH_NOARGS,
+ "Return an integer, the number of values in GDB's value history" },
{ "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 9ee3c5f..60039c9 100644
--- a/gdb/testsuite/gdb.python/py-value.exp
+++ b/gdb/testsuite/gdb.python/py-value.exp
@@ -647,6 +647,17 @@ proc test_value_sub_classes {} {
"check printing of MyValue when initiaized with a type"
}
+# Test the history count. This must be the first thing called after
+# starting GDB as it depends on there being nothing in the value
+# history.
+proc test_history_count {} {
+ for { set i 0 } { $i < 5 } { incr i } {
+ gdb_test "python print('history count is %d' % gdb.history_count())" \
+ "history count is $i" "history count is $i"
+ gdb_test "print $i" " = $i"
+ }
+}
+
# Build C version of executable. C++ is built later.
if { [build_inferior "${binfile}" "c"] < 0 } {
return -1
@@ -658,6 +669,7 @@ clean_restart ${binfile}
# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }
+test_history_count
test_value_creation
test_value_reinit
test_value_numeric_ops
diff --git a/gdb/value.c b/gdb/value.c
index 37c949f..7bd9891 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -1909,6 +1909,14 @@ access_value_history (int num)
return value_copy (value_history[absnum].get ());
}
+/* See value.h. */
+
+ULONGEST
+value_history_count ()
+{
+ return value_history.size ();
+}
+
static void
show_values (const char *num_exp, int from_tty)
{
diff --git a/gdb/value.h b/gdb/value.h
index f91c5a5..0de4b5f 100644
--- a/gdb/value.h
+++ b/gdb/value.h
@@ -948,6 +948,10 @@ extern void binop_promote (const struct language_defn *language,
extern struct value *access_value_history (int num);
+/* Return the number of items in the value history. */
+
+extern ULONGEST value_history_count ();
+
extern struct value *value_of_internalvar (struct gdbarch *gdbarch,
struct internalvar *var);