gdb/python: add gdb.history_count function
authorAndrew Burgess <aburgess@redhat.com>
Mon, 24 Jan 2022 15:19:43 +0000 (15:19 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Wed, 26 Jan 2022 21:58:12 +0000 (21:58 +0000)
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.

gdb/NEWS
gdb/doc/python.texi
gdb/python/py-value.c
gdb/python/python-internal.h
gdb/python/python.c
gdb/testsuite/gdb.python/py-value.exp
gdb/value.c
gdb/value.h

index 31dff785d4e1908405e91abcb263354835365d07..e1900596ca74b9dfcbd428558af314b0ef0edcae 100644 (file)
--- 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
index 39bf6e8884dc1907268a95a40931524543e4b3f5..f1d182729634d9fda821fa83c1eb452fdf858158 100644 (file)
@@ -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
index d6ceb54fed8b3adc3e0f3616ec8881b547ea8ef9..6401d96897f40d9b8e1477856bed3fcf8f8eea73 100644 (file)
@@ -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)
index ccea5c4a9cd94d97d67a92291b3fbf9dfb78742f..5e15f62f74578b6509f2716349f8fc657349695e 100644 (file)
@@ -412,6 +412,7 @@ extern enum ext_lang_rc gdbpy_get_matching_xmethod_workers
 \f
 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 *);
index 7ddc170904cce2baf72fff4c41b78a79b096e128..2c8081e1b07e38150782a930bc695480c161332f 100644 (file)
@@ -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\
index 9ee3c5f223d2d9234436a400089b8fd489628c71..60039c9373f72741bd45f5ef5fb4245150a108da 100644 (file)
@@ -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
index 37c949f0853cbfb07e45cc5091ce8e388b379c5b..7bd9891b3e97a7c101d59433d12853dd43ede900 100644 (file)
@@ -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)
 {
index f91c5a561448b4dc730de3106e0f9bf297e28a89..0de4b5f3aefcd3273238c171e435cfe7103195c6 100644 (file)
@@ -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);