Index: gdb/python/lib/gdb/printing.py |
diff --git a/gdb/python/lib/gdb/printing.py b/gdb/python/lib/gdb/printing.py |
index 98cfd274623300e39b4fbeb35ce96b94ce1458a7..b4e798da231177e55de01ac32f4f018052d79991 100644 |
--- a/gdb/python/lib/gdb/printing.py |
+++ b/gdb/python/lib/gdb/printing.py |
@@ -206,3 +206,53 @@ class RegexpCollectionPrettyPrinter(PrettyPrinter): |
# Cannot find a pretty printer. Return None. |
return None |
+ |
+# A helper class for printing enum types. This class is instantiated |
+# with a list of enumerators to print a particular Value. |
+class _EnumInstance: |
+ def __init__(self, enumerators, val): |
+ self.enumerators = enumerators |
+ self.val = val |
+ |
+ def to_string(self): |
+ flag_list = [] |
+ v = long(self.val) |
+ any_found = False |
+ for (e_name, e_value) in self.enumerators: |
+ if v & e_value != 0: |
+ flag_list.append(e_name) |
+ v = v & ~e_value |
+ any_found = True |
+ if not any_found or v != 0: |
+ # Leftover value. |
+ flag_list.append('<unknown: 0x%x>' % v) |
+ return "0x%x [%s]" % (self.val, " | ".join(flag_list)) |
+ |
+class FlagEnumerationPrinter(PrettyPrinter): |
+ """A pretty-printer which can be used to print a flag-style enumeration. |
+ A flag-style enumeration is one where the enumerators are or'd |
+ together to create values. The new printer will print these |
+ symbolically using '|' notation. The printer must be registered |
+ manually. This printer is most useful when an enum is flag-like, |
+ but has some overlap. GDB's built-in printing will not handle |
+ this case, but this printer will attempt to.""" |
+ |
+ def __init__(self, enum_type): |
+ super(FlagEnumerationPrinter, self).__init__(enum_type) |
+ self.initialized = False |
+ |
+ def __call__(self, val): |
+ if not self.initialized: |
+ self.initialized = True |
+ flags = gdb.lookup_type(self.name) |
+ self.enumerators = [] |
+ for field in flags.fields(): |
+ self.enumerators.append((field.name, field.enumval)) |
+ # Sorting the enumerators by value usually does the right |
+ # thing. |
+ self.enumerators.sort(key = lambda x: x.enumval) |
+ |
+ if self.enabled: |
+ return _EnumInstance(self.enumerators, val) |
+ else: |
+ return None |