diff options
Diffstat (limited to 'solenv/gdb/libreoffice/cppu.py')
-rw-r--r-- | solenv/gdb/libreoffice/cppu.py | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/solenv/gdb/libreoffice/cppu.py b/solenv/gdb/libreoffice/cppu.py new file mode 100644 index 000000000..5114dbe12 --- /dev/null +++ b/solenv/gdb/libreoffice/cppu.py @@ -0,0 +1,156 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +import six + +from libreoffice.util import printing +from libreoffice.util.uno import TypeClass, make_uno_type, uno_cast + +class UnoAnyPrinter(object): + '''Prints UNO any''' + + def __init__(self, typename, value): + self.value = value + self.typename = typename.replace('com::sun::star::', '') + + def to_string(self): + type_desc = self.value['pType'] + assert type_desc + type = make_uno_type(type_desc.dereference()) + assert type + if type_desc.dereference()['eTypeClass'] == TypeClass.VOID: + return ('%s(%s)' % (self.typename, type.tag)) + else: + ptr = self.value['pData'] + assert ptr + return ('%s(%s: %s)' % (self.typename, type.tag, str(uno_cast(type, ptr).dereference()))) + +class UnoReferencePrinter(object): + '''Prints reference to a UNO interface''' + + def __init__(self, typename, value): + self.value = value + self.typename = typename.replace('com::sun::star::', '') + + def to_string(self): + iface = self.value['_pInterface'] + if iface: + try: + return '%s to (%s) %s' % (self.typename, str(iface.dynamic_type), str(iface)) + except: + # fallback for potential problem: + # base class 'com::sun::star::uno::XInterface' is ambiguous + return '%s to (XInterface) %s' % (self.typename, str(iface)) + + else: + return "empty %s" % self.typename + +class UnoSequencePrinter(object): + '''Prints UNO Sequence''' + + class iterator(six.Iterator): + '''Sequence iterator''' + + def __init__(self, first, size): + self.item = first + self.size = size + self.count = 0 + + def __iter__(self): + return self + + def __next__(self): + if self.count == self.size: + raise StopIteration + count = self.count + self.count = self.count + 1 + elem = self.item.dereference() + self.item = self.item + 1 + return ('[%d]' % count, elem) + + + def __init__(self, typename, value): + self.value = value + self.typename = typename.replace('com::sun::star::', '') + + def to_string(self): + pimpl = self.value['_pSequence'] + if pimpl: + impl = pimpl.dereference() + elems = impl['nElements'] + if elems == 0: + return "empty %s" % self.typename + else: + return "%s of length %d" % (self.typename, elems) + else: + return "uninitialized %s" % self.typename + + def children(self): + pimpl = self.value['_pSequence'] + if pimpl: + impl = pimpl.dereference() + elemtype = self.value.type.template_argument(0) + elements = impl['elements'].cast(elemtype.pointer()) + return self.iterator(elements, int(impl['nElements'])) + else: + # TODO is that the best thing to do here? + return None + + def display_hint(self): + if self.value['_pSequence']: + return 'array' + else: + return None + +class UnoTypePrinter(object): + '''Prints UNO Type''' + + def __init__(self, typename, value): + self.value = value + self.typename = typename.replace('com::sun::star::', '') + + def to_string(self): + uno = make_uno_type(self.value) + if uno: + return "%s %s" % (self.typename, uno.tag) + # return "%s %s" % (self.typename, uno.typename) + else: + return "invalid %s" % self.typename + +class CppuThreadpoolThreadPoolPrinter(object): + '''Prints cppu_threadpool::ThreadPool objects (a hack to avoid infinite recursion through sal.RtlReferencePrinter when printing an rtl::Reference<cppu_threadpool::ThreadPool> whose std::list<cppu_threadpool::WaitingThread*> m_lstThreads member, via rtl::Reference<cppu_threadpool::ORequestThread> thread member, via rtl::Reference<cppu_threadpool::ThreadPool> m_aThreadPool member, has a circular reference back)''' + + def __init__(self, typename, value): + self.typename = typename + self.value = value + + def to_string(self): + return '%s@%s' % (self.typename, self.value.address) + +printer = None + +def build_pretty_printers(): + global printer + + printer = printing.Printer("libreoffice/cppu") + + # basic UNO stuff + printer.add('_uno_Any', UnoAnyPrinter) + printer.add('com::sun::star::uno::Any', UnoAnyPrinter) + printer.add('com::sun::star::uno::Reference', UnoReferencePrinter) + printer.add('com::sun::star::uno::Sequence', UnoSequencePrinter) + printer.add('com::sun::star::uno::Type', UnoTypePrinter) + printer.add('cppu_threadpool::ThreadPool', CppuThreadpoolThreadPoolPrinter) + +def register_pretty_printers(obj): + printing.register_pretty_printer(printer, obj) + +build_pretty_printers() + +# vim:set shiftwidth=4 softtabstop=4 expandtab: |