diff --git a/gdb/NEWS b/gdb/NEWS index 31dff785d4e..e1900596ca7 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 39bf6e8884d..f1d18272963 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 d6ceb54fed8..6401d96897f 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 ccea5c4a9cd..5e15f62f745 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 7ddc170904c..2c8081e1b07 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 9ee3c5f223d..60039c9373f 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 37c949f0853..7bd9891b3e9 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 f91c5a56144..0de4b5f3aef 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);