diff options
author | Kristian Monsen <kristianm@google.com> | 2010-07-30 10:46:49 +0100 |
---|---|---|
committer | Kristian Monsen <kristianm@google.com> | 2010-08-04 13:01:34 +0100 |
commit | 0617145a89917ae7735fe1c9538688ab9a577df5 (patch) | |
tree | 56206078694427c37ed7bdf27eb5221398b833c0 /WebKitTools/gdb | |
parent | ef1adcdfc805d4d13103f6f15cc5b4d96828a60f (diff) | |
download | external_webkit-0617145a89917ae7735fe1c9538688ab9a577df5.zip external_webkit-0617145a89917ae7735fe1c9538688ab9a577df5.tar.gz external_webkit-0617145a89917ae7735fe1c9538688ab9a577df5.tar.bz2 |
Merge WebKit at r64264 : Initial merge by git.
Change-Id: Ic42bef02efef8217a0f84c47176a9c617c28d1f1
Diffstat (limited to 'WebKitTools/gdb')
-rw-r--r-- | WebKitTools/gdb/wtf.py | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/WebKitTools/gdb/wtf.py b/WebKitTools/gdb/wtf.py new file mode 100644 index 0000000..cf4b59b --- /dev/null +++ b/WebKitTools/gdb/wtf.py @@ -0,0 +1,133 @@ +# Copyright (C) 2010, Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""GDB support for WebKit WTF types. + +Add this to your gdb by amending your ~/.gdbinit as follows: + python + import sys + sys.path.insert(0, "/path/to/tools/gdb/") + import wtf + +See http://sourceware.org/gdb/current/onlinedocs/gdb/Python.html for GDB's +Python API. +""" + +import gdb +import re + + +class WTFVectorPrinter: + """Pretty Printer for a WTF::Vector. + + The output of this pretty printer is similar to the output of std::vector's + pretty printer, which is bundled in gcc. + + Example gdb session should look like: + (gdb) p v + $3 = WTF::Vector of length 7, capacity 16 = {7, 17, 27, 37, 47, 57, 67} + (gdb) set print elements 3 + (gdb) p v + $6 = WTF::Vector of length 7, capacity 16 = {7, 17, 27...} + (gdb) set print array + (gdb) p v + $7 = WTF::Vector of length 7, capacity 16 = { + 7, + 17, + 27 + ... + } + (gdb) set print elements 200 + (gdb) p v + $8 = WTF::Vector of length 7, capacity 16 = { + 7, + 17, + 27, + 37, + 47, + 57, + 67 + } + """ + + class Iterator: + def __init__(self, start, finish): + self.item = start + self.finish = finish + self.count = 0 + + def __iter__(self): + return self + + def next(self): + if self.item == self.finish: + raise StopIteration + count = self.count + self.count += 1 + element = self.item.dereference() + self.item += 1 + return ('[%d]' % count, element) + + def __init__(self, val): + self.val = val + + def children(self): + start = self.val['m_buffer']['m_buffer'] + return self.Iterator(start, start + self.val['m_size']) + + def to_string(self): + return ('%s of length %d, capacity %d' + % ('WTF::Vector', self.val['m_size'], self.val['m_buffer']['m_capacity'])) + + def display_hint(self): + return 'array' + + +def lookup_function(val): + type = val.type + if type.code == gdb.TYPE_CODE_REF: + type = type.target() + type = type.unqualified().strip_typedefs() + typename = type.tag + if not typename: + return None + for function, pretty_printer in pretty_printers_dict.items(): + if function.search(typename): + return pretty_printer(val) + return None + + +def build_pretty_printers_dict(): + pretty_printers_dict[re.compile('^WTF::Vector<.*>$')] = WTFVectorPrinter + + +pretty_printers_dict = {} + +build_pretty_printers_dict() + +gdb.pretty_printers.append(lookup_function) |