Index: gdb/python/lib/gdb/command/type_printers.py |
diff --git a/gdb/python/lib/gdb/command/type_printers.py b/gdb/python/lib/gdb/command/type_printers.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..81f2ea162248010b1f0457ff8994f499d920ffe7 |
--- /dev/null |
+++ b/gdb/python/lib/gdb/command/type_printers.py |
@@ -0,0 +1,125 @@ |
+# Type printer commands. |
+# Copyright (C) 2010-2013 Free Software Foundation, Inc. |
+ |
+# This program is free software; you can redistribute it and/or modify |
+# it under the terms of the GNU General Public License as published by |
+# the Free Software Foundation; either version 3 of the License, or |
+# (at your option) any later version. |
+# |
+# This program is distributed in the hope that it will be useful, |
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
+# GNU General Public License for more details. |
+# |
+# You should have received a copy of the GNU General Public License |
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
+ |
+import copy |
+import gdb |
+ |
+"""GDB commands for working with type-printers.""" |
+ |
+class InfoTypePrinter(gdb.Command): |
+ """GDB command to list all registered type-printers. |
+ |
+ Usage: info type-printers |
+ """ |
+ |
+ def __init__ (self): |
+ super(InfoTypePrinter, self).__init__("info type-printers", |
+ gdb.COMMAND_DATA) |
+ |
+ def list_type_printers(self, type_printers): |
+ """Print a list of type printers.""" |
+ # A potential enhancement is to provide an option to list printers in |
+ # "lookup order" (i.e. unsorted). |
+ sorted_type_printers = sorted (copy.copy(type_printers), |
+ key = lambda x: x.name) |
+ for printer in sorted_type_printers: |
+ if printer.enabled: |
+ enabled = '' |
+ else: |
+ enabled = " [disabled]" |
+ print (" %s%s" % (printer.name, enabled)) |
+ |
+ def invoke(self, arg, from_tty): |
+ """GDB calls this to perform the command.""" |
+ sep = '' |
+ for objfile in gdb.objfiles(): |
+ if objfile.type_printers: |
+ print ("%sType printers for %s:" % (sep, objfile.name)) |
+ self.list_type_printers(objfile.type_printers) |
+ sep = '\n' |
+ if gdb.current_progspace().type_printers: |
+ print ("%sType printers for program space:" % sep) |
+ self.list_type_printers(gdb.current_progspace().type_printers) |
+ sep = '\n' |
+ if gdb.type_printers: |
+ print ("%sGlobal type printers:" % sep) |
+ self.list_type_printers(gdb.type_printers) |
+ |
+class _EnableOrDisableCommand(gdb.Command): |
+ def __init__(self, setting, name): |
+ super(_EnableOrDisableCommand, self).__init__(name, gdb.COMMAND_DATA) |
+ self.setting = setting |
+ |
+ def set_some(self, name, printers): |
+ result = False |
+ for p in printers: |
+ if name == p.name: |
+ p.enabled = self.setting |
+ result = True |
+ return result |
+ |
+ def invoke(self, arg, from_tty): |
+ """GDB calls this to perform the command.""" |
+ for name in arg.split(): |
+ ok = False |
+ for objfile in gdb.objfiles(): |
+ if self.set_some(name, objfile.type_printers): |
+ ok = True |
+ if self.set_some(name, gdb.current_progspace().type_printers): |
+ ok = True |
+ if self.set_some(name, gdb.type_printers): |
+ ok = True |
+ if not ok: |
+ print ("No type printer named '%s'" % name) |
+ |
+ def add_some(self, result, word, printers): |
+ for p in printers: |
+ if p.name.startswith(word): |
+ result.append(p.name) |
+ |
+ def complete(self, text, word): |
+ result = [] |
+ for objfile in gdb.objfiles(): |
+ self.add_some(result, word, objfile.type_printers) |
+ self.add_some(result, word, gdb.current_progspace().type_printers) |
+ self.add_some(result, word, gdb.type_printers) |
+ return result |
+ |
+class EnableTypePrinter(_EnableOrDisableCommand): |
+ """GDB command to enable the specified type printer. |
+ |
+ Usage: enable type-printer NAME |
+ |
+ NAME is the name of the type-printer. |
+ """ |
+ |
+ def __init__(self): |
+ super(EnableTypePrinter, self).__init__(True, "enable type-printer") |
+ |
+class DisableTypePrinter(_EnableOrDisableCommand): |
+ """GDB command to disable the specified type-printer. |
+ |
+ Usage: disable type-printer NAME |
+ |
+ NAME is the name of the type-printer. |
+ """ |
+ |
+ def __init__(self): |
+ super(DisableTypePrinter, self).__init__(False, "disable type-printer") |
+ |
+InfoTypePrinter() |
+EnableTypePrinter() |
+DisableTypePrinter() |