public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM]  archer-pmuldoon-python-backtrace: Add show python frame-filter priority.  Convert set/show frame-filter enable to enable/disable frame-filter.  Clean up some interface changes to internal workers, and add tests.  Fix non Python compile issue.
@ 2012-10-22 13:01 pmuldoon
  0 siblings, 0 replies; only message in thread
From: pmuldoon @ 2012-10-22 13:01 UTC (permalink / raw)
  To: archer-commits

The branch, archer-pmuldoon-python-backtrace has been updated
       via  04437f1d987cf165f40a57449fe1de78041bb9eb (commit)
      from  c77c423e819ce42fc776b3ada0cb369f17312c30 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 04437f1d987cf165f40a57449fe1de78041bb9eb
Author: Phil Muldoon <pmuldoon@redhat.com>
Date:   Mon Oct 22 13:59:25 2012 +0100

    Add show python frame-filter priority.  Convert set/show frame-filter
    enable to enable/disable frame-filter.  Clean up some interface
    changes to internal workers, and add tests.  Fix non Python compile
    issue.

-----------------------------------------------------------------------

Summary of changes:
 gdb/gdb-gdb.gdb.in                          |   10 --
 gdb/python/lib/gdb/command/frame_filters.py |  184 +++++++++++++++++++++------
 gdb/python/py-framefilter.c                 |   10 +-
 gdb/testsuite/gdb.python/py-framefilter.exp |   24 +++-
 gdb/testsuite/gdb.python/py-framefilter.py  |    2 +-
 5 files changed, 174 insertions(+), 56 deletions(-)

First 500 lines of diff:
diff --git a/gdb/gdb-gdb.gdb.in b/gdb/gdb-gdb.gdb.in
index a2e7e94..ffb7f53 100644
--- a/gdb/gdb-gdb.gdb.in
+++ b/gdb/gdb-gdb.gdb.in
@@ -1,15 +1,5 @@
 echo Setting up the environment for debugging gdb.\n
 
-# Set up the Python library and "require" command.
-python
-from os.path import abspath
-gdb.datadir = abspath ('@srcdir@/python/lib')
-gdb.pythonlibdir = gdb.datadir
-gdb.__path__ = [gdb.datadir + '/gdb']
-sys.path.insert(0, gdb.datadir)
-end
-source @srcdir@/python/lib/gdb/__init__.py
-
 set complaints 1
 
 b internal_error
diff --git a/gdb/python/lib/gdb/command/frame_filters.py b/gdb/python/lib/gdb/command/frame_filters.py
index c6992da..42a994f 100644
--- a/gdb/python/lib/gdb/command/frame_filters.py
+++ b/gdb/python/lib/gdb/command/frame_filters.py
@@ -43,24 +43,39 @@ def _parse_arg (cmd_name, arg):
 
     return (object_list, argument)
 
-def _get_priority(filter_item):
-    """ Internal Worker function to return the frame-filter's priority.
+def _get_sort_priority(filter_item):
+    """ Internal Worker function to return the frame-filter's priority
+    for a List's sort function
 
     Arguments:
         filter_item: A tuple, with the first element being the name,
         and the second being the frame-filter object.
     """
+    # Do not fail here, as the sort will fail.  If a filter has not
+    # (incorrectly) set a priority, set it to zero.
     if hasattr(filter_item[1], "priority"):
         return filter_item[1].priority
     else:
-        return 1000
+        return 0
+
+def _get_priority(filter_item):
+    """ Internal Worker function to return the frame-filter's priority.
+
+    Arguments:
+        filter_item: An object conforming to the frame filter
+        interface.
+    """
+    if hasattr(filter_item, "priority"):
+        return filter_item.priority
+    else:
+        raise gdb.GdbError("Cannot find class attribute 'priority'")
 
 def _set_priority(filter_item, priority):
     """ Internal Worker function to set the frame-filter's priority.
 
     Arguments:
-        filter_item: A tuple, with the first element being the name,
-        and the second being the frame-filter object.
+        filter_item: An object conforming to the frame filter
+        interface.
         priority: The priority to assign as an integer.
     """
 
@@ -74,22 +89,39 @@ def _get_enabled(filter_item):
     state.
 
     Arguments:
-        filter_item: A tuple, with the first element being the name,
-        and the second being the frame-filter object.
+        filter_item: An object conforming to the frame filter
+        interface.
     """
 
-    if hasattr(filter_item[1], "enabled"):
-        return filter_item[1].enabled
+    if hasattr(filter_item, "enabled"):
+        return filter_item.enabled
     else:
         raise gdb.GdbError("Cannot find class attribute 'enabled'")
 
+def _get_filter_enabled (filter_item):
+    """ Internal Worker function to return the frame-filter's enabled
+    state for filter operations.
+
+    Arguments:
+        filter_item: A tuple, with the first element being the name,
+        and the second being the frame-filter object.
+    """
+    # If the filter class is badly implemented, do not cease filter
+    # operations, just set enabled to False.
+    try:
+        enabled = _get_enabled (filter_item[1])
+    except gdbError as e:
+        enabled = False
+
+    return enabled
+
 def _set_enabled(filter_item, state):
     """ Internal Worker function to set the frame-filter's enabled
     state.
 
     Arguments:
-        filter_item: A tuple, with the first element being the name,
-        and the second being the frame-filter object.
+        filter_item: An object conforming to the frame filter
+        interface.
         state: True or False, depending on desired state.
     """
     if hasattr(filter_item, "enabled"):
@@ -102,8 +134,8 @@ def _get_name (frame_filter):
     frame-filter.
 
     Arguments:
-        filter_item: A tuple, with the first element being the name,
-        and the second being the frame-filter object.
+        filter_item: An object conforming to the frame filter
+        interface.
     """
     if hasattr(frame_filter, "name"):
         return frame_filter.name
@@ -147,9 +179,9 @@ def _sort_list ():
     all_filters = all_filters + gdb.frame_filters.items()
 
     sorted_frame_filters = copy.copy(all_filters)
-    sorted_frame_filters.sort(key = _get_priority,
+    sorted_frame_filters.sort(key = _get_sort_priority,
                                    reverse = True)
-    sorted_frame_filters = filter (_get_enabled, sorted_frame_filters)
+    sorted_frame_filters = filter (_get_filter_enabled, sorted_frame_filters)
     return sorted_frame_filters
 
 def invoke (frame):
@@ -194,19 +226,29 @@ class InfoFrameFilter(gdb.Command):
     def __init__ (self):
         super(InfoFrameFilter, self).__init__("info frame-filter",
                                               gdb.COMMAND_DATA)
+
     def list_frame_filters(self, frame_filters):
         """Print a list of frame_filters."""
 
         sorted_frame_filters = frame_filters.items()
-        sorted_frame_filters.sort(key = _get_priority, reverse = True)
+        sorted_frame_filters.sort(key = _get_sort_priority, reverse = True)
 
         print "  Priority  Enabled  Name"
         print "  ========  =======  ===="
-        for frame_filter in sorted_frame_filters:
-            priority = '{:<8}'.format(str(_get_priority (frame_filter)))
-            name = frame_filter[0]
-            enabled = '{:<7}'.format(self.enabled_string(_get_enabled(frame_filter)))
-            print "  %s  %s  %s" % (priority, enabled, name)
+        if len(sorted_frame_filters) == 0:
+            print "  No frame filters registered."
+        else:
+            for frame_filter in sorted_frame_filters:
+                name = frame_filter[0]
+                try:
+                    priority = '{:<8}'.format(
+                        str(_get_priority (frame_filter[1])))
+                    enabled = '{:<7}'.format(
+                        self.enabled_string(_get_enabled(frame_filter[1])))
+                except Exception as e:
+                    print "  Error printing filter '"+name+"': ",e
+                else:
+                    print "  %s  %s  %s" % (priority, enabled, name)
 
     def print_list(self, title, filter_list):
         """Print a list."""
@@ -251,16 +293,21 @@ def do_enable_frame_filter (command_tuple, flag):
     op_list = _return_list(list_op)
     do_enable_frame_filter_1(op_list, frame_filter, flag)
 
-class FilterPrefixCmd (gdb.Command):
+class SetFilterPrefixCmd (gdb.Command):
     def __init__ (self):
-        super (FilterPrefixCmd, self).__init__ ("set python frame-filter",
-                                                gdb.COMMAND_DATA,
-                                                gdb.COMPLETE_COMMAND, True)
+        super (SetFilterPrefixCmd, self).__init__ ("set python frame-filter",
+                                                   gdb.COMMAND_DATA,
+                                                   gdb.COMPLETE_COMMAND, True)
+class ShowFilterPrefixCmd (gdb.Command):
+    def __init__ (self):
+        super (ShowFilterPrefixCmd, self).__init__ ("show python frame-filter",
+                                                    gdb.COMMAND_DATA,
+                                                    gdb.COMPLETE_COMMAND, True)
 
 class EnableFrameFilter (gdb.Command):
     """GDB command to disable the specified frame-filter.
 
-    Usage: set python frame-filter enable [list] [name]
+    Usage: enable frame-filter enable [list] [name]
 
     LIST is the name of the frame-filter list to operate.  Named lists
     are: "global" for the global frame-filter list, "progspace" for
@@ -271,20 +318,19 @@ class EnableFrameFilter (gdb.Command):
     NAME matches the name of the frame-filter to operate on.
     """
     def __init__(self):
-        super(EnableFrameFilter, self).__init__("set python frame-filter " \
-                                                "enable", gdb.COMMAND_DATA,
-                  gdb.COMPLETE_COMMAND)
+        super(EnableFrameFilter, self).__init__("enable frame-filter",
+                                                 gdb.COMMAND_DATA)
 
     def invoke(self, arg, from_tty):
         """GDB calls this to perform the command."""
-        command_tuple = _parse_arg("set python frame-filter disable", arg)
+        command_tuple = _parse_arg("enable frame-filter", arg)
         do_enable_frame_filter(command_tuple, True)
 
 
 class DisableFrameFilter (gdb.Command):
     """GDB command to disable the specified frame-filter.
 
-    Usage: set python frame-filter disable [list] [name]
+    Usage: disable frame-filter disable [list] [name]
 
     LIST is the name of the frame-filter list to operate.  Named lists
     are: "global" for the global frame-filter list, "progspace" for
@@ -295,19 +341,18 @@ class DisableFrameFilter (gdb.Command):
     NAME matches the name of the frame-filter to operate on.
     """
     def __init__(self):
-        super(DisableFrameFilter, self).__init__("set python frame-filter " \
-                                                 "disable", gdb.COMMAND_DATA,
-                                                 gdb.COMPLETE_COMMAND)
+        super(DisableFrameFilter, self).__init__("disable frame-filter",
+                                                  gdb.COMMAND_DATA)
 
     def invoke(self, arg, from_tty):
         """GDB calls this to perform the command."""
-        command_tuple = _parse_arg("set python frame-filter disable", arg)
+        command_tuple = _parse_arg("disable frame-filter", arg)
         do_enable_frame_filter(command_tuple, False)
 
 class SetFrameFilterPriority (gdb.Command):
-    """GDB command to set the priority of the  specified frame-filter.
+    """GDB command to set the priority of the specified frame-filter.
 
-    Usage: set python frame-filter priority [list] [name] [priority]
+    Usage: set python frame-filter priority list name priority
 
     LIST is the name of the frame-filter list to operate.  Named lists
     are: "global" for the global frame-filter list, "progspace" for
@@ -370,12 +415,75 @@ class SetFrameFilterPriority (gdb.Command):
         command_tuple = self._parse_pri_arg(arg)
         self._set_filter_priority (command_tuple)
 
+class ShowFrameFilterPriority (gdb.Command):
+    """GDB command to show the priority of the specified frame-filter.
+
+    Usage: show python frame-filter priority list name
+
+    LIST is the name of the frame-filter list to operate.  Named lists
+    are: "global" for the global frame-filter list, "progspace" for
+    the program space's file frame-filter list.  If either of these
+    two are not specified, the list name is assumed to be the name of
+    the object-file name.
+
+    NAME matches the name of the frame-filter to operate on.
+    """
+
+    def __init__(self):
+        super(ShowFrameFilterPriority, self).__init__("show python " \
+                                                      "frame-filter priority",
+                                                      gdb.COMMAND_DATA,
+                                                      gdb.COMPLETE_COMMAND)
+    def _parse_pri_arg (self, arg):
+        argv = gdb.string_to_argv(arg);
+        argc = len(argv)
+        if argc != 2:
+            raise SyntaxError("show python frame-filter priority " \
+                              "takes exactly two arguments.")
+
+        object_list = argv[0]
+        name = argv[1]
+        return (object_list, name)
+
+    def get_filter_priority (self, frame_filters, name):
+        """Worker for retrieving the priority of frame_filters.
+
+        Arguments:
+
+        frame_filters: name of frame filter list.
+        name: object to select printers.
+        """
+        op_list = _return_list (frame_filters)
+
+        try:
+            ff = op_list[name]
+        except KeyError:
+            msg = "frame-filter '" + str(name) + "' not found."
+            raise gdb.GdbError(msg)
+
+        return _get_priority(ff)
+
+    def invoke(self, arg, from_tty):
+        """GDB calls this to perform the command."""
+        command_tuple = self._parse_pri_arg(arg)
+        filter_name = command_tuple[1]
+        list_name = command_tuple[0]
+        try:
+            priority = self.get_filter_priority (list_name, filter_name);
+        except Exception as e:
+            print "Error printing filter priority for '"+name+"':",e
+        else:
+            print "Priority of filter '" + filter_name + "' in list '" \
+                + list_name + "' is: " + str(priority)
+
 def register_frame_filter_commands():
     """Call from a top level script to install the frame-filter commands."""
     InfoFrameFilter()
-    FilterPrefixCmd()
+    SetFilterPrefixCmd()
+    ShowFilterPrefixCmd()
     EnableFrameFilter()
     DisableFrameFilter()
     SetFrameFilterPriority ()
+    ShowFrameFilterPriority ()
 
 register_frame_filter_commands()
diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c
index d806ceb..a508a4b 100644
--- a/gdb/python/py-framefilter.c
+++ b/gdb/python/py-framefilter.c
@@ -1315,7 +1315,7 @@ int apply_frame_filter (struct frame_info *frame, int flags,
   else
     {
       Py_DECREF (iterable);
-      error (_("Frame filter must support iteration protocol"));
+      error (_("Frame filter must support iteration protocol."));
     }
 
  done:
@@ -1327,10 +1327,10 @@ int apply_frame_filter (struct frame_info *frame, int flags,
 
 #else /* HAVE_PYTHON */
 int
-int apply_frame_filter (struct frame_info *frame, int flags,
-			enum print_values mi_print_args_type,
-			const char *cli_print_args_type,
-			struct ui_out *out, int count)
+apply_frame_filter (struct frame_info *frame, int flags,
+		    enum print_values mi_print_args_type,
+		    const char *cli_print_args_type,
+		    struct ui_out *out, int count)
 {
   return PY_BT_NO_FILTERS;
 }
diff --git a/gdb/testsuite/gdb.python/py-framefilter.exp b/gdb/testsuite/gdb.python/py-framefilter.exp
index d3da491..98f2d79 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.exp
+++ b/gdb/testsuite/gdb.python/py-framefilter.exp
@@ -52,7 +52,7 @@ if ![runto_main ] then {
     perror "couldn't run to breakpoint"
     return
 }
-
+gdb_test_no_output "set python print-stack full"
 # Load global frame-filters
 set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
 gdb_test_no_output "python execfile ('${remote_python_file}')"
@@ -61,7 +61,27 @@ gdb_breakpoint [gdb_get_line_number "Backtrace end breakpoint"]
 gdb_continue_to_breakpoint "Backtrace end breakpoint"
 
 gdb_test "info frame-filter" \
+    ".*900.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+
+# Test set/show
+gdb_test "show python frame-filter priority global Elider" \
+    "Priority of filter 'Elider' in list 'global' is: 900"
+gdb_test_no_output  "set python frame-filter priority global Elider 1000"
+gdb_test "show python frame-filter priority global Elider" \
+        "Priority of filter 'Elider' in list 'global' is: 1000"
+gdb_test "info frame-filter" \
+    ".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+
+# Test enable/disable
+gdb_test "info frame-filter" \
     ".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+gdb_test_no_output  "disable frame-filter global Elider"
+gdb_test "info frame-filter" \
+    ".*1000.*No.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+gdb_test_no_output  "enable frame-filter global Elider"
+gdb_test "info frame-filter" \
+    ".*1000.*Yes.*Elider.*100.*Yes.*Reverse.*10.*.*No.*Object.*1.*"
+
 # Test raw
 gdb_test "bt raw" \
     ".*#0.*end_func.*#22.*in func1.*#27.*in main \\(\\).*"
@@ -71,7 +91,7 @@ gdb_test "bt" \
     ".*#0.*cnuf_dne.*#22.*in 1cnuf.*#27.*in niam \\(\\).*"
 
 # Disable Reverse
-gdb_test_no_output "set python frame-filter disable global Reverse"
+gdb_test_no_output "disable frame-filter global Reverse"
 gdb_test "bt" \
     ".*#0.*end_func.*#22.*in func1.*#27.*in main \\(\\).*"
 
diff --git a/gdb/testsuite/gdb.python/py-framefilter.py b/gdb/testsuite/gdb.python/py-framefilter.py
index d44cb84..86cb017 100644
--- a/gdb/testsuite/gdb.python/py-framefilter.py
+++ b/gdb/testsuite/gdb.python/py-framefilter.py
@@ -107,7 +107,7 @@ class FrameElider ():
 
     def __init__ (self):
         self.name = "Elider"
-        self.priority = 1000
+        self.priority = 900
         self.enabled = True
         gdb.frame_filters [self.name] = self
 


hooks/post-receive
--
Repository for Project Archer.


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2012-10-22 13:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-22 13:01 [SCM] archer-pmuldoon-python-backtrace: Add show python frame-filter priority. Convert set/show frame-filter enable to enable/disable frame-filter. Clean up some interface changes to internal workers, and add tests. Fix non Python compile issue 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).