summaryrefslogtreecommitdiff
path: root/Tools/lldb
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-11-07 11:22:47 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2012-11-07 11:22:47 +0100
commitcfd86b747d32ac22246a1aa908eaa720c63a88c1 (patch)
tree24d68c6f61c464ecba1e05670b80390ea3b0e50c /Tools/lldb
parent69d7c744c9de19d152dbe2d8e46eb7dfd4511d1a (diff)
downloadqtwebkit-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.py192
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