From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8704 invoked by alias); 17 Jan 2010 19:40:16 -0000 Mailing-List: contact archer-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: List-Id: Received: (qmail 8695 invoked by uid 22791); 17 Jan 2010 19:40:15 -0000 X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org From: Matt McCormick To: archer@sourceware.org Cc: Matt McCormick Subject: [PATCH] [python] Add gdb.value_history_count() Date: Sun, 17 Jan 2010 19:40:00 -0000 Message-Id: <1263757180-4438-1-git-send-email-matt@mmmccormick.com> In-Reply-To: <1262754692-28749-1-git-send-email-matt@mmmccormick.com> References: <1262754692-28749-1-git-send-email-matt@mmmccormick.com> X-SW-Source: 2010-q1/txt/msg00016.txt.bz2 An example use cause is trying to log related data with a pretty-printer. For example, save a file with the same name as the current history number. gdb/ChangeLog 2009-30-12 Matt McCormick * value.c (get_value_history_count): New function. * value.h: Likewise. * python/py-value.c (gdbpy_value_history_count): New function. * python/python.c (GdbMethods): Register in module methods. * python/python-internal.h: Python extension definition. gdb/doc/ChangeLog 2009-30-12 Matt McCormick * gdb.texinfo (Basic Python): Document gdb.value_history_count. gdb/testsuite/ChangeLog 2009-30-12 Matt McCormick * gdb.python/py-value.exp (test_value_history_count): Test gdb.value_history_count. --- This patch has been rebased against archer-tromey python and regression tested. gdb/doc/gdb.texinfo | 6 ++++++ gdb/python/py-value.c | 7 +++++++ gdb/python/python-internal.h | 1 + gdb/python/python.c | 5 +++++ gdb/testsuite/gdb.python/py-value.exp | 17 +++++++++++++++++ gdb/value.c | 6 ++++++ gdb/value.h | 4 ++++ 7 files changed, 46 insertions(+), 0 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 6d73fc5..1cd7908 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -19515,6 +19515,12 @@ If no exception is raised, the return value is always an instance of @code{gdb.Value} (@pxref{Values From Inferior}). @end defun +@findex gdb.value_history_count +@defun value_history_count +Return an int corresponding to the number of entries in the value history. +(@pxref{Value History}). +@end defun + @findex gdb.parse_and_eval @defun parse_and_eval expression Parse @var{expression} as an expression in the current language, diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 2896f7d..4c684bb 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -435,6 +435,13 @@ valpy_get_is_optimized_out (PyObject *self, void *closure) Py_RETURN_FALSE; } +/* Implementation of gdb.value_history_count. */ +PyObject * +gdbpy_value_history_count (PyObject *self, PyObject *args) +{ + return PyInt_FromLong ((long) get_value_history_count ()); +} + enum valpy_opcode { VALPY_ADD, diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index 5230a8c..9d842f4 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -95,6 +95,7 @@ PyObject *gdbpy_block_for_pc (PyObject *self, PyObject *args); PyObject *gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw); PyObject *gdbpy_create_lazy_string_object (CORE_ADDR address, long length, const char *encoding, struct type *type); +PyObject *gdbpy_value_history_count (PyObject *self, PyObject* args); PyObject *gdbpy_inferiors (PyObject *unused, PyObject *unused2); PyObject *gdbpy_selected_thread (PyObject *self, PyObject *args); diff --git a/gdb/python/python.c b/gdb/python/python.c index 171cd5b..1154cd3 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -1012,6 +1012,11 @@ Return a string explaining unwind stop reason." }, "lookup_type (name [, block]) -> type\n\ Return a Type corresponding to the given name." }, + { "value_history_count", (PyCFunction) gdbpy_value_history_count, + METH_VARARGS, + "value_history_count () -> int.\n\ +Return an int corresponding to the number of entries in the value history." }, + { "lookup_symbol", (PyCFunction) gdbpy_lookup_symbol, METH_VARARGS | METH_KEYWORDS, "lookup_symbol (name [, block] [, domain]) -> (symbol, is_field_of_this)\n\ diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp index f87277d..d201f25 100644 --- a/gdb/testsuite/gdb.python/py-value.exp +++ b/gdb/testsuite/gdb.python/py-value.exp @@ -278,6 +278,22 @@ proc test_objfiles {} { "pretty_printers attribute must be a list.*Error while executing Python code." } +# Test the python interface to the value history count. +proc test_value_history_count {} { + global srcdir subdir binfile + + # Start with a fresh gdb so we have a fresh value history count.. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + gdb_load ${binfile} + + gdb_test "print 1" " = 1" + gdb_test "print 2" " = 2" + gdb_test "print 3" " = 3" + gdb_test "python print gdb.value_history_count()" "3" +} + proc test_value_after_death {} { # Construct a type while the inferior is still running. gdb_py_test_silent_cmd "python ptrtype = gdb.lookup_type('PTR')" \ @@ -422,6 +438,7 @@ test_value_boolean test_value_compare test_objfiles test_parse_and_eval +test_value_history_count # The following tests require execution. diff --git a/gdb/value.c b/gdb/value.c index 1839216..c7141f3 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -350,6 +350,12 @@ allocate_computed_value (struct type *type, /* Accessor methods. */ +int +get_value_history_count () +{ + return value_history_count; +} + struct value * value_next (struct value *value) { diff --git a/gdb/value.h b/gdb/value.h index eea0cc9..54026ee 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -48,6 +48,10 @@ struct value; struct value *value_next (struct value *); +/* This returns the number of entries in the value history. */ + +int get_value_history_count (); + /* Type of the value. */ extern struct type *value_type (struct value *); -- 1.6.6