Add LLDB-Python scripts to support WebKit data types.
authorjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 1 Nov 2012 19:16:08 +0000 (19:16 +0000)
committerjer.noble@apple.com <jer.noble@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 1 Nov 2012 19:16:08 +0000 (19:16 +0000)
https://bugs.webkit.org/show_bug.cgi?id=100898

Reviewed by Anders Carlsson.

Add Summary providers for common WebKit string types.

* lldb/lldb_webkit.py: Added.
(__lldb_init_module): Register these providers with the debugger.
(WTFString_SummaryProvider): Wrapper around WTFStringProvider.
(WTFStringImpl_SummaryProvider): Wrapper around WTFStringImplProvider.
(WTFAtomicString_SummaryProvider): Ditto.
(guess_string_length): Walk through the string looking for a null-byte(s).
(ustring_to_string): Walk through the string, extracting two-byte values, and concatenate them.
(lstring_to_string): Walk through the string, extracting byte values, and concatenate them.
(WTFStringImplProvider):
(WTFStringImplProvider.__init__):
(WTFStringImplProvider.get_length): Extract the m_length variable.
(WTFStringImplProvider.get_data8): Extract the m_data8 variable.
(WTFStringImplProvider.get_data16): Extract the m_data16 variable.
(WTFStringImplProvider.to_string): Pass the appropriate data variable to {u,l}string_to_string.
(WTFStringImplProvider.is_8bit): Check the m_hashAndFlags variable.
(WTFStringProvider):
(WTFStringProvider.__init__):
(WTFStringProvider.stringimpl): Extract the m_impl variable.
(WTFStringProvider.get_length): Pass through to WTFStringImplProvider.
(WTFStringProvider.to_string): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@133211 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/lldb/lldb_webkit.py [new file with mode: 0644]

index f07e018..5a309dc 100644 (file)
@@ -1,3 +1,33 @@
+2012-11-01  Jer Noble  <jer.noble@apple.com>
+
+        Add LLDB-Python scripts to support WebKit data types.
+        https://bugs.webkit.org/show_bug.cgi?id=100898
+
+        Reviewed by Anders Carlsson.
+
+        Add Summary providers for common WebKit string types.
+
+        * lldb/lldb_webkit.py: Added.
+        (__lldb_init_module): Register these providers with the debugger.
+        (WTFString_SummaryProvider): Wrapper around WTFStringProvider.
+        (WTFStringImpl_SummaryProvider): Wrapper around WTFStringImplProvider.
+        (WTFAtomicString_SummaryProvider): Ditto.
+        (guess_string_length): Walk through the string looking for a null-byte(s).
+        (ustring_to_string): Walk through the string, extracting two-byte values, and concatenate them.
+        (lstring_to_string): Walk through the string, extracting byte values, and concatenate them.
+        (WTFStringImplProvider): 
+        (WTFStringImplProvider.__init__):
+        (WTFStringImplProvider.get_length): Extract the m_length variable.
+        (WTFStringImplProvider.get_data8): Extract the m_data8 variable.
+        (WTFStringImplProvider.get_data16): Extract the m_data16 variable.
+        (WTFStringImplProvider.to_string): Pass the appropriate data variable to {u,l}string_to_string.
+        (WTFStringImplProvider.is_8bit): Check the m_hashAndFlags variable.
+        (WTFStringProvider):
+        (WTFStringProvider.__init__):
+        (WTFStringProvider.stringimpl): Extract the m_impl variable.
+        (WTFStringProvider.get_length): Pass through to WTFStringImplProvider.
+        (WTFStringProvider.to_string): Ditto.
+
 2012-11-01  Peter Beverloo  <peter@chromium.org>
 
         [Chromium-Android] Apache doesn't properly clean up ipc semaphores after a layout test run
diff --git a/Tools/lldb/lldb_webkit.py b/Tools/lldb/lldb_webkit.py
new file mode 100644 (file)
index 0000000..86f3483
--- /dev/null
@@ -0,0 +1,145 @@
+# 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')
+
+
+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)
+
+# 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()