| Index: gdb/python/lib/gdb/types.py | 
| diff --git a/gdb/python/lib/gdb/types.py b/gdb/python/lib/gdb/types.py | 
| index 66c952896bbf41289f73649a7974751af72bd177..ffc817cd07ccb9714c0f8f546c40ea42c90c3dc1 100644 | 
| --- a/gdb/python/lib/gdb/types.py | 
| +++ b/gdb/python/lib/gdb/types.py | 
| @@ -1,5 +1,5 @@ | 
| # Type utilities. | 
| -# Copyright (C) 2010-2012 Free Software Foundation, Inc. | 
| +# 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 | 
| @@ -109,3 +109,68 @@ def deep_items (type_): | 
| else: | 
| for i in deep_items (v.type): | 
| yield i | 
| + | 
| +class TypePrinter(object): | 
| +    """The base class for type printers. | 
| + | 
| +    Instances of this type can be used to substitute type names during | 
| +    'ptype'. | 
| + | 
| +    A type printer must have at least 'name' and 'enabled' attributes, | 
| +    and supply an 'instantiate' method. | 
| + | 
| +    The 'instantiate' method must either return None, or return an | 
| +    object which has a 'recognize' method.  This method must accept a | 
| +    gdb.Type argument and either return None, meaning that the type | 
| +    was not recognized, or a string naming the type. | 
| +    """ | 
| + | 
| +    def __init__(self, name): | 
| +        self.name = name | 
| +        self.enabled = True | 
| + | 
| +    def instantiate(self): | 
| +        return None | 
| + | 
| +# Helper function for computing the list of type recognizers. | 
| +def _get_some_type_recognizers(result, plist): | 
| +    for printer in plist: | 
| +        if printer.enabled: | 
| +            inst = printer.instantiate() | 
| +            if inst is not None: | 
| +                result.append(inst) | 
| +    return None | 
| + | 
| +def get_type_recognizers(): | 
| +    "Return a list of the enabled type recognizers for the current context." | 
| +    result = [] | 
| + | 
| +    # First try the objfiles. | 
| +    for objfile in gdb.objfiles(): | 
| +        _get_some_type_recognizers(result, objfile.type_printers) | 
| +    # Now try the program space. | 
| +    _get_some_type_recognizers(result, gdb.current_progspace().type_printers) | 
| +    # Finally, globals. | 
| +    _get_some_type_recognizers(result, gdb.type_printers) | 
| + | 
| +    return result | 
| + | 
| +def apply_type_recognizers(recognizers, type_obj): | 
| +    """Apply the given list of type recognizers to the type TYPE_OBJ. | 
| +    If any recognizer in the list recognizes TYPE_OBJ, returns the name | 
| +    given by the recognizer.  Otherwise, this returns None.""" | 
| +    for r in recognizers: | 
| +        result = r.recognize(type_obj) | 
| +        if result is not None: | 
| +            return result | 
| +    return None | 
| + | 
| +def register_type_printer(locus, printer): | 
| +    """Register a type printer. | 
| +    PRINTER is the type printer instance. | 
| +    LOCUS is either an objfile, a program space, or None, indicating | 
| +    global registration.""" | 
| + | 
| +    if locus is None: | 
| +        locus = gdb | 
| +    locus.type_printers.insert(0, printer) | 
|  |