* RFA: add gdb.newest_frame method
@ 2011-01-06 20:55 Tom Tromey
2011-01-06 21:00 ` Eli Zaretskii
0 siblings, 1 reply; 2+ messages in thread
From: Tom Tromey @ 2011-01-06 20:55 UTC (permalink / raw)
To: gdb-patches
I needed a "newest_frame" method to go along with "selected_frame".
This patch adds this method, documentation, and a test case.
This needs a doc review.
Built and regtested on x86-64 (compile farm).
Ok?
Tom
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.
2011-01-06 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Frames In Python): Document gdb.newest_thread.
2011-01-06 Tom Tromey <tromey@redhat.com>
* gdb.python/py-frame.exp: Test gdb.newest_frame.
diff --git a/gdb/NEWS b/gdb/NEWS
index 7c2b494..1f02dfc 100644
--- 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
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index f6a3747..6a27e9d 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -22514,6 +22514,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
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index 3e11db1..a52c8c7 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -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. */
diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h
index c9630c3..80d0763 100644
--- a/gdb/python/python-internal.h
+++ b/gdb/python/python-internal.h
@@ -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);
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 770744e..375042c 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -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." },
diff --git a/gdb/testsuite/gdb.python/py-frame.exp b/gdb/testsuite/gdb.python/py-frame.exp
index 0956398..e3b5629 100644
--- a/gdb/testsuite/gdb.python/py-frame.exp
+++ b/gdb/testsuite/gdb.python/py-frame.exp
@@ -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)"
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: RFA: add gdb.newest_frame method
2011-01-06 20:55 RFA: add gdb.newest_frame method Tom Tromey
@ 2011-01-06 21:00 ` Eli Zaretskii
0 siblings, 0 replies; 2+ messages in thread
From: Eli Zaretskii @ 2011-01-06 21:00 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
> From: Tom Tromey <tromey@redhat.com>
> Date: Thu, 06 Jan 2011 13:55:09 -0700
>
> This needs a doc review.
The doc parts are approved.
Thanks.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-01-06 21:00 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-06 20:55 RFA: add gdb.newest_frame method Tom Tromey
2011-01-06 21:00 ` Eli Zaretskii
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox