Modified: trunk/Tools/ChangeLog (133210 => 133211)
--- trunk/Tools/ChangeLog 2012-11-01 19:13:25 UTC (rev 133210)
+++ trunk/Tools/ChangeLog 2012-11-01 19:16:08 UTC (rev 133211)
@@ -1,3 +1,33 @@
+2012-11-01 Jer Noble <jer.no...@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 <pe...@chromium.org>
[Chromium-Android] Apache doesn't properly clean up ipc semaphores after a layout test run
Added: trunk/Tools/lldb/lldb_webkit.py (0 => 133211)
--- trunk/Tools/lldb/lldb_webkit.py (rev 0)
+++ trunk/Tools/lldb/lldb_webkit.py 2012-11-01 19:16:08 UTC (rev 133211)
@@ -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()