From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23757 invoked by alias); 22 Oct 2012 13:01:23 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 23728 invoked by uid 9514); 22 Oct 2012 13:01:21 -0000 Date: Mon, 22 Oct 2012 13:01:00 -0000 Message-ID: <20121022130121.23713.qmail@sourceware.org> From: pmuldoon@sourceware.org To: archer-commits@sourceware.org Subject: [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. X-Git-Refname: refs/heads/archer-pmuldoon-python-backtrace X-Git-Reftype: branch X-Git-Oldrev: c77c423e819ce42fc776b3ada0cb369f17312c30 X-Git-Newrev: 04437f1d987cf165f40a57449fe1de78041bb9eb X-SW-Source: 2012-q4/txt/msg00002.txt.bz2 List-Id: 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 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.