public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-pmuldoon-python-backtrace: Use python FrameIterator. Remove list lookup references. Write invoke method in Python. Add testsuite changes to include insertion of a dummy frame.
@ 2012-06-21 19:25 pmuldoon
0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-06-21 19:25 UTC (permalink / raw)
To: archer-commits
The branch, archer-pmuldoon-python-backtrace has been updated
via 94426f022d3e5a4e9c7b7d0a25c57a334ab6497d (commit)
from 9970e390718512d3b4ff0d315bedb787dd497c0b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 94426f022d3e5a4e9c7b7d0a25c57a334ab6497d
Author: Phil Muldoon <pmuldoon@redhat.com>
Date: Thu Jun 21 20:24:57 2012 +0100
Use python FrameIterator. Remove list lookup references. Write
invoke method in Python. Add testsuite changes to include insertion
of a dummy frame.
-----------------------------------------------------------------------
Summary of changes:
gdb/data-directory/Makefile.in | 3 +-
gdb/python/lib/gdb/FrameIterator.py | 12 +-
gdb/python/lib/gdb/FrameWrapper.py | 3 +
gdb/python/lib/gdb/command/frame_filters.py | 6 +-
gdb/python/py-framefilter.c | 250 +++------------------------
gdb/testsuite/gdb.python/py-framefilter.exp | 7 +-
gdb/testsuite/gdb.python/py-framefilter.py | 71 +++++++-
7 files changed, 109 insertions(+), 243 deletions(-)
First 500 lines of diff:
diff --git a/gdb/data-directory/Makefile.in b/gdb/data-directory/Makefile.in
index 7dc7fb3..ea2c682 100644
--- a/gdb/data-directory/Makefile.in
+++ b/gdb/data-directory/Makefile.in
@@ -56,8 +56,9 @@ PYTHON_FILES = \
gdb/types.py \
gdb/printing.py \
gdb/prompt.py \
- gdb/FrameWrapper.py \
gdb/FrameFilter.py \
+ gdb/FrameIterator.py \
+ gdb/FrameWrapper.py \
gdb/command/__init__.py \
gdb/command/frame_filters.py \
gdb/command/pretty_printers.py \
diff --git a/gdb/python/lib/gdb/FrameIterator.py b/gdb/python/lib/gdb/FrameIterator.py
index 4f14e8a..5816c57 100644
--- a/gdb/python/lib/gdb/FrameIterator.py
+++ b/gdb/python/lib/gdb/FrameIterator.py
@@ -1,17 +1,23 @@
+import gdb
+import itertools
+
class FrameIterator(object):
"""A frame iterator. Iterates over gdb.Frames or objects that
conform to that interface."""
def __init__ (self, frame_obj):
- "Initialize a FrameIterator. FRAME_OBJ is the starting
- frame."
+ """Initialize a FrameIterator. FRAME_OBJ is the starting
+ frame."""
super(FrameIterator, self).__init__()
- self.frame = frame
+ self.frame = frame_obj
def __iter__ (self):
return self
+ def __getitem__(self,index):
+ return next(itertools.islice(self.frame,index,index+1))
+
def next (self):
result = self.frame
if result is None:
diff --git a/gdb/python/lib/gdb/FrameWrapper.py b/gdb/python/lib/gdb/FrameWrapper.py
index 11f69ed..0aa7870 100644
--- a/gdb/python/lib/gdb/FrameWrapper.py
+++ b/gdb/python/lib/gdb/FrameWrapper.py
@@ -79,3 +79,6 @@ class FrameWrapper:
def inferior_frame (self):
return self.frame
+
+ def older(self):
+ return self.frame.older()
diff --git a/gdb/python/lib/gdb/command/frame_filters.py b/gdb/python/lib/gdb/command/frame_filters.py
index c1ea05c..3b76bf4 100644
--- a/gdb/python/lib/gdb/command/frame_filters.py
+++ b/gdb/python/lib/gdb/command/frame_filters.py
@@ -19,6 +19,7 @@
import gdb
import copy
import gdb.FrameFilter
+from gdb.FrameIterator import FrameIterator
def _parse_arg (cmd_name, arg):
""" Internal Worker function to take an argument and return a
@@ -151,14 +152,15 @@ def _sort_list ():
sorted_frame_filters = filter (_get_enabled, sorted_frame_filters)
return sorted_frame_filters
-def invoke (frame_iterator):
+def invoke (frame):
""" Public internal function that will execute the chain of frame
filters. Each filter is executed in priority order.
Arguments:
frame_iterator: An iterator of frames.
"""
- sorted_list = sort_list()
+ sorted_list = _sort_list()
+ frame_iterator = FrameIterator (frame)
for ff in sorted_list:
frame_iterator = ff[1].filter (frame_iterator)
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index 2991364..96a41a5 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -32,196 +32,6 @@
#ifdef HAVE_PYTHON
#include "python-internal.h"
-/* Helper function for find_frame_filter which iterates over a list,
- calls each function and inspects output. This will return a filter
- object if one of the filters registers interest in FRAME. If no
- frame filter is found, it will return None. On error, it will set
- the Python error and return NULL. */
-
-static PyObject *
-search_frame_filter_list (PyObject *list, PyObject *frame,
- int limit)
-
-{
- Py_ssize_t list_size, list_index;
- PyObject *filter = NULL;
- PyObject *slimit = PyLong_FromLong (limit);
-
- if (! slimit)
- return NULL;
-
- list_size = PyList_Size (list);
- for (list_index = 0; list_index < list_size; list_index++)
- {
- PyObject *function;
-
- function = PyList_GetItem (list, list_index);
- if (! function)
- return NULL;
-
- /* Skip if disabled. */
- if (PyObject_HasAttr (function, gdbpy_enabled_cst))
- {
- PyObject *attr = PyObject_GetAttr (function, gdbpy_enabled_cst);
- int cmp;
-
- if (!attr)
- return NULL;
- cmp = PyObject_IsTrue (attr);
-
- Py_DECREF (attr);
- if (cmp == -1)
- return NULL;
-
- if (!cmp)
- continue;
- }
-
- filter = PyObject_CallFunctionObjArgs (function, frame, slimit, NULL);
-
- Py_DECREF (slimit);
- if (! filter)
- {
- Py_DECREF (slimit);
- return NULL;
- }
- else if (filter != Py_None)
- {
- Py_DECREF (slimit);
- return filter;
- }
-
- Py_DECREF (filter);
- }
-
- Py_RETURN_NONE;
-}
-
-
-/* Subroutine of find_frame_filter to simplify it. Look for a frame
- filter for FRAME in the gdb module. The result is NULL if there's
- an error and the search should be terminated. The result is
- Py_None, if no frame filter is found. Otherwise the result is the
- frame filter function, suitably inc-ref'd. */
-
-static PyObject *
-find_frame_filter_from_gdb (PyObject *frame, int limit)
-{
- PyObject *filter_list;
- PyObject *function;
-
- /* Fetch the global frame filter list. */
- if (! PyObject_HasAttrString (gdb_module, "frame_filters"))
- Py_RETURN_NONE;
-
- filter_list = PyObject_GetAttrString (gdb_module, "frame_filters");
- if (filter_list == NULL || ! PyList_Check (filter_list))
- {
- Py_XDECREF (filter_list);
- Py_RETURN_NONE;
- }
-
- function = search_frame_filter_list (filter_list, frame, limit);
- Py_XDECREF (filter_list);
- return function;
-}
-/* Subroutine of find_frame_filter to simplify it. Look for a frame
- filter for FRAME in all objfiles. The result is NULL if there's an
- error and the search should be terminated. The result is Py_None
- if no frame filter found. Otherwise the result is the
- pretty-printer function. */
-
-static PyObject *
-find_frame_filter_from_objfiles (PyObject *frame, int limit)
-{
- PyObject *filter_list;
- PyObject *function;
- struct objfile *obj;
-
- ALL_OBJFILES (obj)
- {
- PyObject *objf = objfile_to_objfile_object (obj);
- if (!objf)
- {
- /* Ignore the error and continue. */
- PyErr_Clear ();
- continue;
- }
-
- filter_list = objfpy_get_frame_filters (objf, NULL);
-
- function = search_frame_filter_list (filter_list, frame, limit);
-
- Py_XDECREF (filter_list);
-
- /* If there is an error in any objfile list, abort the search and exit. */
- if (! function)
- return NULL;
-
- if (function != Py_None)
- return function;
-
- Py_DECREF (function);
- }
-
- Py_RETURN_NONE;
-}
-
-/* Subroutine of find_pretty_printer to simplify it. Look for a frame
- filter for FRAME in the current program space. The result is NULL
- if there's an error and the search should be terminated. The
- result is Py_None, no frame filter was found. Otherwise the result
- is the pretty-printer function. */
-
-static PyObject *
-find_frame_filter_from_progspace (PyObject *frame, int limit)
-{
- PyObject *filter_list;
- PyObject *function;
- PyObject *obj = pspace_to_pspace_object (current_program_space);
-
- if (!obj)
- return NULL;
- filter_list = pspy_get_frame_filters (obj, NULL);
-
- function = search_frame_filter_list (filter_list, frame, limit);
-
- Py_XDECREF (filter_list);
- return function;
-}
-
-
-/* Find the frame filter constructor function for FRAME. If no
- frame filter exists, return None. If one exists, return a new
- reference. On error, set the Python error and return NULL. */
-
-static PyObject *
-find_frame_filter (PyObject *frame, int limit)
-{
- PyObject *function = NULL;
-
- /* Look at the frame filter list for each objfile
- in the current program-space. */
- function = find_frame_filter_from_objfiles (frame, limit);
-
- if (function == NULL || function != Py_None)
- goto exit_func;
- Py_DECREF (function);
-
- /* Look at the frame filter list for the current program-space. */
- function = find_frame_filter_from_progspace (frame, limit);
-
- if (function == NULL || function != Py_None)
- goto exit_func;
- Py_DECREF (function);
-
- /* Look at the frame filter list in the gdb module. */
- function = find_frame_filter_from_gdb (frame, limit) ;
-
-exit_func:
- return function;
-}
-
static int
py_print_locals (PyObject *filter,
struct value_print_options opts)
@@ -541,22 +351,22 @@ py_print_frame (PyObject *filter,
if (! result)
goto error;
- frame = frame_object_to_frame_info (result);
- if (! frame)
+ if (result == Py_None)
+ gdbarch = target_gdbarch;
+ else
{
- Py_DECREF (result);
- goto error;
+ frame = frame_object_to_frame_info (result);
+ if (! frame)
+ {
+ Py_DECREF (result);
+ goto error;
+ }
+ gdbarch = get_frame_arch (frame);
}
-
Py_DECREF (result);
- gdbarch = get_frame_arch (frame);
}
else
- {
- PyErr_SetString (PyExc_RuntimeError,
- _("frame filter must implement inferior_frame callback."));
- goto error;
- }
+ gdbarch = target_gdbarch;
if (PyObject_HasAttrString (filter, "elide"))
{
@@ -743,46 +553,38 @@ apply_frame_filter (struct frame_info *frame, int print_level,
{
struct gdbarch *gdbarch = get_frame_arch (frame);
struct cleanup *cleanups;
- PyObject *frame_obj, *filter, *frame_iter, *iterable;
int result = 0;
int print_result = 0;
struct value_print_options opts;
int success = 0;
- PyObject *filter_list;
- PyObject *sort_func;
- PyObject *sort;
PyObject *module;
+ PyObject *sort_func;
+ PyObject *iterable;
+ PyObject *frame_obj;
cleanups = ensure_python_env (gdbarch, current_language);
frame_obj = frame_info_to_frame_object (frame);
if (! frame_obj)
goto done;
- module = PyImport_AddModule ("__main__");
- sort_func = PyObject_GetAttrString (module, "sort_list");
- filter_list = PyObject_GetAttrString (gdb_module, "frame_filters");
- sort = PyObject_CallFunctionObjArgs (sort_func, filter_list, NULL);
- if (PyErr_Occurred())
+
+ module = PyImport_AddModule ("gdb.command.frame_filters");
+
+ sort_func = PyObject_GetAttrString (module, "invoke");
+ if (!sort_func)
{
- gdbpy_print_stack ();
- return 0;
+ Py_DECREF (module);
+ goto done;
}
- /* Build the filter list ordered by priority. */
-
- /* Find the constructor. */
- filter = find_frame_filter (frame_obj, count);
+ iterable = PyObject_CallFunctionObjArgs (sort_func, frame_obj, NULL);
+ Py_DECREF (sort_func);
Py_DECREF (frame_obj);
-
- make_cleanup_py_decref (filter);
- if (! filter || filter == Py_None)
+ Py_DECREF (module);
+ if (!iterable || PyErr_Occurred())
goto done;
-
+
get_user_print_options (&opts);
- iterable = PyObject_CallMethod (filter, "invoke", NULL);
- if (! iterable)
- goto done;
-
make_cleanup_py_decref (iterable);
/* Is it an iterator */
diff --git a/gdb/testsuite/gdb.python/py-framefilter.exp b/gdb/testsuite/gdb.python/py-framefilter.exp
index 362be5b..7fd44d7 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.exp
+++ b/gdb/testsuite/gdb.python/py-framefilter.exp
@@ -37,12 +37,11 @@ if ![runto_main ] then {
}
set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
-gdb_test_no_output "set python print-stack full"
gdb_test_no_output "python execfile ('${remote_python_file}')"
-gdb_test_no_output "python gdb.frame_filters.append(FrameFilter)"
gdb_breakpoint [gdb_get_line_number "Backtrace end breakpoint"]
gdb_continue_to_breakpoint "Backtrace end breakpoint"
-gdb_test "bt" "#0.*in end_func.*#22.*in func1.*Composite frame func3.*#27.*in main ().*"
-gdb_test "bt full" "#0.*in end_func.*#22.*in func1.*Composite frame func3.*#27.*in main ().*"
+
+gdb_test "bt" "#-1.*in Dummy function.*#22.*in 1cnuf.*#27.*in niam ().*"
+gdb_test "bt" "#-1.*in Dummy function.*#22.*in 1cnuf.*#27.*in niam ().*"
remote_file host delete ${remote_python_file}
diff --git a/gdb/testsuite/gdb.python/py-framefilter.py b/gdb/testsuite/gdb.python/py-framefilter.py
index b876805..15f7a74 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.py
+++ b/gdb/testsuite/gdb.python/py-framefilter.py
@@ -37,16 +37,69 @@ class Reverse_Function (FrameWrapper):
else:
return False
+class Dummy:
+ def __init__(self, nextframe):
+ self.nextframe = nextframe
+
+ def omit (self):
+ return False
+
+ def elide (self):
+ return False
+
+ def function (self):
+ return "Dummy function"
+
+ def address (self):
+ return 0x123
+
+ def filename (self):
+ return "Dummy filename"
+
+ def frame_args (self):
+ return []
+
+ def frame_locals (self):
+ return []
+
+ def line (self):
+ return 0
+
+ def older (self):
+ return self.nextframe
+
+ def inferior_frame (self):
+ return None
+
+class FrameAdd ():
+
+ def __init__ (self):
+ self.name = "Add"
+ self.priority = 10
+ self.enabled = True
+ gdb.frame_filters [self.name] = self
+
+ def filter (self, frame_iter):
+ for f in frame_iter:
+ nextv = f
+ break
+ dummies = [Dummy(nextv)]
+ frame_iter = itertools.chain (dummies,
+ frame_iter)
+ return frame_iter
+
class FrameFilter ():
- def __init__ (self, iterator, limit):
- self.iterator = iterator
- self.limit = limit
+ def __init__ (self):
+ self.name = "Reverse"
+ self.priority = 100
+ self.enabled = True
+ gdb.frame_filters [self.name] = self
- def __new__ (self):
- return self;
+ def filter (self, frame_iter):
+ frame_iter = itertools.imap (Reverse_Function,
+ frame_iter)
+ return frame_iter
- def invoke (self):
- iter = itertools.imap (Reverse_Function,
- self.iterator)
- return iter
+FrameAdd()
+FrameFilter()
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-06-21 19:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-21 19:25 [SCM] archer-pmuldoon-python-backtrace: Use python FrameIterator. Remove list lookup references. Write invoke method in Python. Add testsuite changes to include insertion of a dummy frame 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).