diff options
Diffstat (limited to 'Tools/lldb/lldb_webkit.py')
-rw-r--r-- | Tools/lldb/lldb_webkit.py | 265 |
1 files changed, 0 insertions, 265 deletions
diff --git a/Tools/lldb/lldb_webkit.py b/Tools/lldb/lldb_webkit.py deleted file mode 100644 index 7fb31585a..000000000 --- a/Tools/lldb/lldb_webkit.py +++ /dev/null @@ -1,265 +0,0 @@ -# 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 -import struct - -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 summary add --expand -F lldb_webkit.WTFHashTable_SummaryProvider -x "WTF::HashTable<.+>$"') - debugger.HandleCommand('type synthetic add -x "WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider') - debugger.HandleCommand('type synthetic add -x "WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider') - -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) - - -def WTFHashTable_SummaryProvider(valobj, dict): - provider = WTFHashTableProvider(valobj, dict) - return "{ tableSize = %d, keyCount = %d }" % (provider.tableSize(), provider.keyCount()) - -# 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, charSize, error): - if not valobj.GetValue(): - return 0 - - maxLength = 256 - - pointer = valobj.GetValueAsUnsigned() - contents = valobj.GetProcess().ReadMemory(pointer, maxLength * charSize, lldb.SBError()) - format = 'B' if charSize == 1 else 'H' - - for i in xrange(0, maxLength): - if not struct.unpack_from(format, contents, i * charSize)[0]: - return i - - return maxLength - -def ustring_to_string(valobj, error, length=None): - if length is None: - length = guess_string_length(valobj, 2, error) - else: - length = int(length) - - pointer = valobj.GetValueAsUnsigned() - contents = valobj.GetProcess().ReadMemory(pointer, length * 2, lldb.SBError()) - - # lldb does not (currently) support returning unicode from python summary providers, - # so potentially convert this to ascii by escaping - string = contents.decode('utf16') - try: - return str(string) - except: - return string.encode('unicode_escape') - -def lstring_to_string(valobj, error, length=None): - if length is None: - length = guess_string_length(valobj, 1, error) - else: - length = int(length) - - pointer = valobj.GetValueAsUnsigned() - contents = valobj.GetProcess().ReadMemory(pointer, length, lldb.SBError()) - - # lldb does not (currently) support returning unicode from python summary providers, - # so potentially convert this to ascii by escaping - string = contents.decode('utf8') - try: - return str(string) - except: - return string.encode('unicode_escape') - -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 + 3 - - def get_child_index(self, name): - if name == "m_size": - return self.size - elif name == "m_capacity": - return self.size + 1 - elif name == "m_buffer": - return self.size + 2 - 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.valobj.GetChildMemberWithName("m_capacity") - elif index == self.size + 2: - return self.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.buffer = self.valobj.GetChildMemberWithName('m_buffer') - self.size = self.valobj.GetChildMemberWithName('m_size').GetValueAsUnsigned(0) - self.capacity = self.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 - - -class WTFHashTableProvider: - def __init__(self, valobj, internal_dict): - self.valobj = valobj - self.update() - - def num_children(self): - return self.tableSize() + 5 - - def get_child_index(self, name): - if name == "m_table": - return self.tableSize() - elif name == "m_tableSize": - return self.tableSize() + 1 - elif name == "m_tableSizeMask": - return self.tableSize() + 2 - elif name == "m_keyCount": - return self.tableSize() + 3 - elif name == "m_deletedCount": - return self.tableSize() + 4 - else: - return int(name.lstrip('[').rstrip(']')) - - def get_child_at_index(self, index): - if index == self.tableSize(): - return self.valobj.GetChildMemberWithName('m_table') - elif index == self.tableSize() + 1: - return self.valobj.GetChildMemberWithName('m_tableSize') - elif index == self.tableSize() + 2: - return self.valobj.GetChildMemberWithName('m_tableSizeMask') - elif index == self.tableSize() + 3: - return self.valobj.GetChildMemberWithName('m_keyCount') - elif index == self.tableSize() + 4: - return self.valobj.GetChildMemberWithName('m_deletedCount') - elif index < self.tableSize(): - table = self.valobj.GetChildMemberWithName('m_table') - return table.CreateChildAtOffset('[' + str(index) + ']', index * self.data_size, self.data_type) - else: - return None - - def tableSize(self): - return self.valobj.GetChildMemberWithName('m_tableSize').GetValueAsUnsigned(0) - - def keyCount(self): - return self.valobj.GetChildMemberWithName('m_keyCount').GetValueAsUnsigned(0) - - def update(self): - self.data_type = self.valobj.GetType().GetTemplateArgumentType(0) - self.data_size = self.data_type.GetByteSize() - - def has_children(self): - return True |