public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-pmuldoon-python-backtrace: Add frapy_frame_locals, and frapy_frame_arguments helper functions. These functions return lists of symbols that represent locals and arguments for that frame respectivley. Also, reset FrameIterator on iteration end, and error.
@ 2012-04-04 15:04 pmuldoon
0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-04-04 15:04 UTC (permalink / raw)
To: archer-commits
The branch, archer-pmuldoon-python-backtrace has been updated
via 0846ff85a01a83ec8c1d8089a6f22813298d2db1 (commit)
from 313ec1898851d0162bb917768a2fa517220649fa (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 0846ff85a01a83ec8c1d8089a6f22813298d2db1
Author: Phil Muldoon <pmuldoon@redhat.com>
Date: Wed Apr 4 16:01:57 2012 +0100
Add frapy_frame_locals, and frapy_frame_arguments helper functions.
These functions return lists of symbols that represent locals and
arguments for that frame respectivley. Also, reset FrameIterator on
iteration end, and error.
-----------------------------------------------------------------------
Summary of changes:
gdb/python/py-frame.c | 167 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 166 insertions(+), 1 deletions(-)
First 500 lines of diff:
diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c
index f02c9a1..c5ab2fd 100644
--- a/gdb/python/py-frame.c
+++ b/gdb/python/py-frame.c
@@ -28,6 +28,7 @@
#include "python-internal.h"
#include "symfile.h"
#include "objfiles.h"
+#include "dictionary.h"
typedef struct frapy_type_object {
PyObject_HEAD
@@ -528,6 +529,159 @@ gdbpy_newest_frame (PyObject *self, PyObject *args)
return frame_obj;
}
+
+/* Implementation of gdb.arguments () -> List
+ Returns a list of gdb.Symbols that constitute this frame's
+ arguments. */
+
+static PyObject *
+frapy_frame_args (PyObject *self, PyObject *args)
+{
+ struct frame_info *fi;
+ struct symbol *func = NULL;
+ volatile struct gdb_exception except;
+ PyObject *list = NULL;
+ int err = 0, size = 0;
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ FRAPY_REQUIRE_VALID (self, fi);
+
+ func = find_pc_function (get_frame_address_in_block (fi));
+
+ if (func)
+ {
+ list = PyList_New (0);
+
+ if (! list)
+ err = 1;
+ else
+ {
+ struct dict_iterator iter;
+ struct block *b = SYMBOL_BLOCK_VALUE (func);
+ struct symbol *arg_sym;
+
+ for (arg_sym = dict_iterator_first (BLOCK_DICT (b), &iter);
+ arg_sym != NULL;
+ arg_sym = dict_iterator_next (&iter))
+ {
+ PyObject *arg_obj = NULL;
+
+ if (!SYMBOL_IS_ARGUMENT (arg_sym))
+ continue;
+
+ if (*SYMBOL_LINKAGE_NAME (arg_sym))
+ {
+ struct symbol *nsym;
+
+ nsym = lookup_symbol (SYMBOL_LINKAGE_NAME (arg_sym),
+ b, VAR_DOMAIN, NULL);
+ if (SYMBOL_CLASS (nsym) == LOC_REGISTER
+ && !SYMBOL_IS_ARGUMENT (nsym))
+ {
+ continue;
+ /* skip. */
+ }
+ else
+ arg_sym = nsym;
+ }
+
+ size++;
+ /* Cannot "return" in a exception handler. */
+ arg_obj = symbol_to_symbol_object (arg_sym);
+ if (! arg_obj)
+ {
+ err = 1;
+ break;
+ }
+ if (PyList_Append (list, arg_obj) == -1)
+ {
+ err = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ GDB_PY_HANDLE_EXCEPTION (except);
+
+ if (err)
+ {
+ Py_XDECREF (list);
+ return NULL;
+ }
+
+ /* No arguments, return None. */
+ if (size ==0)
+ {
+ Py_XDECREF (list);
+ Py_RETURN_NONE;
+ }
+
+ return list;
+}
+
+static void
+do_build_locals_list (const char *print_name,
+ struct symbol *sym,
+ void *cb_data)
+{
+ PyObject *llist = (PyObject *) cb_data;
+ PyObject *psym = symbol_to_symbol_object (sym);
+
+ if (psym)
+ PyList_Append (llist, psym);
+}
+
+/* Implementation of gdb.locals () -> List
+ Returns a list of gdb.Symbols that constitute this frame's
+ local variables. */
+
+static PyObject *
+frapy_frame_locals (PyObject *self, PyObject *args)
+{
+ struct frame_info *fi;
+ volatile struct gdb_exception except;
+ PyObject *list = NULL;
+ int err = 0;
+ struct block *b;
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ FRAPY_REQUIRE_VALID (self, fi);
+
+ list = PyList_New (0);
+
+ if (! list)
+ err = 1;
+ else
+ {
+ b = get_frame_block (fi, 0);
+ iterate_over_block_local_vars (b,
+ do_build_locals_list,
+ list);
+ if (PyErr_Occurred ())
+ err = 1;
+ }
+ }
+ GDB_PY_HANDLE_EXCEPTION (except);
+
+ if (err)
+ {
+ Py_XDECREF (list);
+ return NULL;
+ }
+
+ /* No arguments, return None. */
+ if (PyList_Size (list) <= 0)
+ {
+ Py_XDECREF (list);
+ Py_RETURN_NONE;
+ }
+
+ return list;
+}
+
/* Implementation of gdb.selected_frame () -> gdb.Frame.
Returns the selected frame object. */
@@ -603,6 +757,7 @@ frapy_iter (PyObject *self)
{
struct frame_info *fi;
frame_iterator_object *frame_iter_obj;
+
FRAPY_REQUIRE_VALID (self, fi);
frame_iter_obj = PyObject_New (frame_iterator_object,
@@ -635,7 +790,11 @@ frapy_iternext (PyObject *self)
/* Iteration stops on error (preserve the exception), or when
frapy_older returns None. */
if (result == NULL)
- return NULL;
+ {
+ /* Reset the iterator. */
+ iter_obj->current = NULL;
+ return NULL;
+ }
iter_obj->current = (frame_object *)result;
if (result == Py_None)
@@ -749,6 +908,12 @@ Return the frame's code block." },
{ "function", frapy_function, METH_NOARGS,
"function () -> gdb.Symbol.\n\
Returns the symbol for the function corresponding to this frame." },
+ { "arguments", frapy_frame_args, METH_NOARGS,
+ "arguments () -> List.\n\
+Returns a List containing symbols of all frame arguments, or None." },
+ { "locals", frapy_frame_locals, METH_NOARGS,
+ "locals () -> List.\n\
+Returns a List containing symbols of all frame locals, or None." },
{ "older", frapy_older, METH_NOARGS,
"older () -> gdb.Frame.\n\
Return the frame that called this frame." },
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-04-04 15:04 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-04 15:04 [SCM] archer-pmuldoon-python-backtrace: Add frapy_frame_locals, and frapy_frame_arguments helper functions. These functions return lists of symbols that represent locals and arguments for that frame respectivley. Also, reset FrameIterator on iteration end, and error pmuldoon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).