gdb
authorTom Tromey <tromey@redhat.com>
Thu, 6 Jan 2011 21:10:53 +0000 (21:10 +0000)
committerTom Tromey <tromey@redhat.com>
Thu, 6 Jan 2011 21:10:53 +0000 (21:10 +0000)
PR python/12367:
* NEWS: Add item.
* python/python.c (GdbMethods): Add "newest_frame" method.
* python/python-internal.h (gdbpy_newest_frame): Declare.
* python/py-frame.c (gdbpy_newest_frame): New function.
gdb/doc
* gdb.texinfo (Frames In Python): Document gdb.newest_thread.
gdb/testsuite
* gdb.python/py-frame.exp: Test gdb.newest_frame.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/python/py-frame.c
gdb/python/python-internal.h
gdb/python/python.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-frame.exp

index bed9bce..b1edadf 100644 (file)
@@ -1,3 +1,11 @@
+2011-01-06  Tom Tromey  <tromey@redhat.com>
+
+       PR python/12367:
+       * NEWS: Add item.
+       * python/python.c (GdbMethods): Add "newest_frame" method.
+       * python/python-internal.h (gdbpy_newest_frame): Declare.
+       * python/py-frame.c (gdbpy_newest_frame): New function.
+
 2010-01-06  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        * jit.h (struct jit_code_entry): use ULONGEST for symfile_size.
index 7c2b494..1f02dfc 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -43,6 +43,9 @@
 
   ** gdb.parameter("directories") is now available.
 
+  ** New function gdb.newest_frame returns the newest frame in the
+     selected thread.
+
 * C++ Improvements:
 
   ** GDB now puts template parameters in scope when debugging in an
index 9924768..8835a31 100644 (file)
@@ -1,3 +1,7 @@
+2011-01-06  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.texinfo (Frames In Python): Document gdb.newest_thread.
+
 2010-01-06  Paul Pluzhnikov  <ppluzhnikov@google.com>
 
        * gdb.texinfo (Debugging Output): Document "set debug jit".
index a16cf83..d47a484 100644 (file)
@@ -22519,6 +22519,11 @@ The following frame-related functions are available in the @code{gdb} module:
 Return the selected frame object.  (@pxref{Selection,,Selecting a Frame}).
 @end defun
 
+@findex gdb.newest_frame
+@defun newest_frame
+Return the newest frame object for the selected thread.
+@end defun
+
 @defun frame_stop_reason_string reason
 Return a string explaining the reason why @value{GDBN} stopped unwinding
 frames, as expressed by the given @var{reason} code (an integer, see the
index 3e11db1..a52c8c7 100644 (file)
@@ -498,6 +498,26 @@ frapy_select (PyObject *self, PyObject *args)
   Py_RETURN_NONE;
 }
 
+/* Implementation of gdb.newest_frame () -> gdb.Frame.
+   Returns the newest frame object.  */
+
+PyObject *
+gdbpy_newest_frame (PyObject *self, PyObject *args)
+{
+  struct frame_info *frame;
+  PyObject *frame_obj = NULL;   /* Initialize to appease gcc warning.  */
+  volatile struct gdb_exception except;
+
+  TRY_CATCH (except, RETURN_MASK_ALL)
+    {
+      frame = get_current_frame ();
+      frame_obj = frame_info_to_frame_object (frame);
+    }
+  GDB_PY_HANDLE_EXCEPTION (except);
+
+  return frame_obj;
+}
+
 /* Implementation of gdb.selected_frame () -> gdb.Frame.
    Returns the selected frame object.  */
 
index c9630c3..80d0763 100644 (file)
@@ -110,6 +110,7 @@ PyObject *gdbpy_history (PyObject *self, PyObject *args);
 PyObject *gdbpy_breakpoints (PyObject *, PyObject *);
 PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *);
 PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw);
+PyObject *gdbpy_newest_frame (PyObject *self, PyObject *args);
 PyObject *gdbpy_selected_frame (PyObject *self, PyObject *args);
 PyObject *gdbpy_block_for_pc (PyObject *self, PyObject *args);
 PyObject *gdbpy_lookup_type (PyObject *self, PyObject *args, PyObject *kw);
index 770744e..375042c 100644 (file)
@@ -1121,6 +1121,9 @@ static PyMethodDef GdbMethods[] =
   { "objfiles", gdbpy_objfiles, METH_NOARGS,
     "Return a sequence of all loaded objfiles." },
 
+  { "newest_frame", gdbpy_newest_frame, METH_NOARGS,
+    "newest_frame () -> gdb.Frame.\n\
+Return the newest frame object." },
   { "selected_frame", gdbpy_selected_frame, METH_NOARGS,
     "selected_frame () -> gdb.Frame.\n\
 Return the selected frame object." },
index 3675e27..7ba15ac 100644 (file)
@@ -1,3 +1,7 @@
+2011-01-06  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.python/py-frame.exp: Test gdb.newest_frame.
+
 2011-01-06  Joel Brobecker  <brobecker@adacore.com>
 
         * gdb.ada/array_bounds.exp, gdb.ada/array_return.exp,
index 0956398..e3b5629 100644 (file)
@@ -73,11 +73,18 @@ gdb_test "python print bf1.read_var(\"i\", sb).type" "int" "test int i"
 
 gdb_breakpoint "f2"
 gdb_continue_to_breakpoint "breakpoint at f2"
+gdb_py_test_silent_cmd "python bframe = gdb.selected_frame()" \
+    "get bottommost frame" 0
 gdb_test "up" ".*" ""
 
 gdb_py_test_silent_cmd "python f1 = gdb.selected_frame ()" "get second frame" 0
 gdb_py_test_silent_cmd "python f0 = f1.newer ()" "get first frame" 0
 
+gdb_test "python print f1 == gdb.newest_frame()" False \
+    "selected frame -vs- newest frame"
+gdb_test "python print bframe == gdb.newest_frame()" True \
+    "newest frame -vs- newest frame"
+
 gdb_test "python print 'result =', f0 == f1" " = False" "test equality comparison (false)"
 gdb_test "python print 'result =', f0 == f0" " = True" "test equality comparison (true)"
 gdb_test "python print 'result =', f0 != f1" " = True" "test inequality comparison (true)"