diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-07 11:22:47 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-07 11:22:47 +0100 |
commit | cfd86b747d32ac22246a1aa908eaa720c63a88c1 (patch) | |
tree | 24d68c6f61c464ecba1e05670b80390ea3b0e50c /Tools/lldb | |
parent | 69d7c744c9de19d152dbe2d8e46eb7dfd4511d1a (diff) | |
download | qtwebkit-cfd86b747d32ac22246a1aa908eaa720c63a88c1.tar.gz |
Imported WebKit commit 20271caf2e2c016d5cef40184cddeefeac4f1876 (http://svn.webkit.org/repository/webkit/trunk@133733)
New snapshot that contains all previous fixes as well as build fix for latest QtMultimedia API changes.
Diffstat (limited to 'Tools/lldb')
-rw-r--r-- | Tools/lldb/lldb_webkit.py | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/Tools/lldb/lldb_webkit.py b/Tools/lldb/lldb_webkit.py new file mode 100644 index 000000000..37844f89b --- /dev/null +++ b/Tools/lldb/lldb_webkit.py @@ -0,0 +1,192 @@ +# Copyright (C) 2012 Apple. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. + +""" + LLDB Support for WebKit Types + + Add the following to your .lldbinit file to add WebKit Type summaries in LLDB and Xcode: + + command script import {Path to WebKit Root}/Tools/lldb/lldb_webkit.py + +""" + +import lldb + + +def __lldb_init_module(debugger, dict): + debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFString_SummaryProvider WTF::String') + debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFStringImpl_SummaryProvider WTF::StringImpl') + debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFAtomicString_SummaryProvider WTF::AtomicString') + debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFVector_SummaryProvider -x "WTF::Vector<.+>$"') + debugger.HandleCommand('type synthetic add -x "WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider') + + +def WTFString_SummaryProvider(valobj, dict): + provider = WTFStringProvider(valobj, dict) + return "{ length = %d, contents = '%s' }" % (provider.get_length(), provider.to_string()) + + +def WTFStringImpl_SummaryProvider(valobj, dict): + provider = WTFStringImplProvider(valobj, dict) + return "{ length = %d, is8bit = %d, contents = '%s' }" % (provider.get_length(), provider.is_8bit(), provider.to_string()) + + +def WTFAtomicString_SummaryProvider(valobj, dict): + return WTFString_SummaryProvider(valobj.GetChildMemberWithName('m_string'), dict) + + +def WTFVector_SummaryProvider(valobj, dict): + provider = WTFVectorProvider(valobj, dict) + return "{ size = %d, capacity = %d }" % (provider.size, provider.capacity) + +# FIXME: Provide support for the following types: +# def WTFVector_SummaryProvider(valobj, dict): +# def WTFCString_SummaryProvider(valobj, dict): +# def WebCoreKURLGooglePrivate_SummaryProvider(valobj, dict): +# def WebCoreQualifiedName_SummaryProvider(valobj, dict): +# def JSCIdentifier_SummaryProvider(valobj, dict): +# def JSCJSString_SummaryProvider(valobj, dict): + + +def guess_string_length(valobj, error): + if not valobj.GetValue(): + return 0 + + for i in xrange(0, 2048): + if valobj.GetPointeeData(i, 1).GetUnsignedInt16(error, 0) == 0: + return i + + return 256 + + +def ustring_to_string(valobj, error, length=None): + if length is None: + length = guess_string_length(valobj, error) + else: + length = int(length) + + out_string = u"" + for i in xrange(0, length): + char_value = valobj.GetPointeeData(i, 1).GetUnsignedInt16(error, 0) + out_string = out_string + unichr(char_value) + + return out_string.encode('utf-8') + + +def lstring_to_string(valobj, error, length=None): + if length is None: + length = guess_string_length(valobj, error) + else: + length = int(length) + + out_string = u"" + for i in xrange(0, length): + char_value = valobj.GetPointeeData(i, 1).GetUnsignedInt8(error, 0) + out_string = out_string + unichr(char_value) + + return out_string.encode('utf-8') + + +class WTFStringImplProvider: + def __init__(self, valobj, dict): + self.valobj = valobj + + def get_length(self): + return self.valobj.GetChildMemberWithName('m_length').GetValueAsUnsigned(0) + + def get_data8(self): + return self.valobj.GetChildAtIndex(2).GetChildMemberWithName('m_data8') + + def get_data16(self): + return self.valobj.GetChildAtIndex(2).GetChildMemberWithName('m_data16') + + def to_string(self): + error = lldb.SBError() + if self.is_8bit(): + return lstring_to_string(self.get_data8(), error, self.get_length()) + return ustring_to_string(self.get_data16(), error, self.get_length()) + + def is_8bit(self): + # FIXME: find a way to access WTF::StringImpl::s_hashFlag8BitBuffer + return bool(self.valobj.GetChildMemberWithName('m_hashAndFlags').GetValueAsUnsigned(0) \ + & 1 << 6) + + +class WTFStringProvider: + def __init__(self, valobj, dict): + self.valobj = valobj + + def stringimpl(self): + impl_ptr = self.valobj.GetChildMemberWithName('m_impl').GetChildMemberWithName('m_ptr') + return WTFStringImplProvider(impl_ptr, dict) + + def get_length(self): + impl = self.stringimpl() + if not impl: + return 0 + return impl.get_length() + + def to_string(self): + impl = self.stringimpl() + if not impl: + return u"" + return impl.to_string() + + +class WTFVectorProvider: + def __init__(self, valobj, internal_dict): + self.valobj = valobj + self.update() + + def num_children(self): + return self.size + 2 + + def get_child_index(self, name): + if name == "m_size": + return self.size + elif name == "m_buffer": + return self.size + 1 + else: + return int(name.lstrip('[').rstrip(']')) + + def get_child_at_index(self, index): + if index == self.size: + return self.valobj.GetChildMemberWithName("m_size") + elif index == self.size + 1: + return self.vector_buffer + elif index < self.size: + offset = index * self.data_size + child = self.buffer.CreateChildAtOffset('[' + str(index) + ']', offset, self.data_type) + return child + else: + return None + + def update(self): + self.vector_buffer = self.valobj.GetChildMemberWithName('m_buffer') + self.buffer = self.vector_buffer.GetChildMemberWithName('m_buffer') + self.size = self.valobj.GetChildMemberWithName('m_size').GetValueAsUnsigned(0) + self.capacity = self.vector_buffer.GetChildMemberWithName('m_capacity').GetValueAsUnsigned(0) + self.data_type = self.buffer.GetType().GetPointeeType() + self.data_size = self.data_type.GetByteSize() + + def has_children(self): + return True |