15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2012 Apple. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# are met:
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 1.  Redistributions of source code must retain the above copyright
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     notice, this list of conditions and the following disclaimer.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# 2.  Redistributions in binary form must reproduce the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     notice, this list of conditions and the following disclaimer in the
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     documentation and/or other materials provided with the distribution.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"""
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LLDB Support for WebKit Types
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Add the following to your .lldbinit file to add WebKit Type summaries in LLDB and Xcode:
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    command script import {Path to WebKit Root}/Tools/lldb/lldb_webkit.py
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)"""
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import lldb
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def __lldb_init_module(debugger, dict):
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFString_SummaryProvider WTF::String')
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFStringImpl_SummaryProvider WTF::StringImpl')
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFAtomicString_SummaryProvider WTF::AtomicString')
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFVector_SummaryProvider -x "WTF::Vector<.+>$"')
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFHashTable_SummaryProvider -x "WTF::HashTable<.+>$"')
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    debugger.HandleCommand('type synthetic add -x "WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider')
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    debugger.HandleCommand('type synthetic add -x "WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider')
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreLayoutUnit_SummaryProvider WebCore::LayoutUnit')
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreLayoutSize_SummaryProvider WebCore::LayoutSize')
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreLayoutPoint_SummaryProvider WebCore::LayoutPoint')
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def WTFString_SummaryProvider(valobj, dict):
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    provider = WTFStringProvider(valobj, dict)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return "{ length = %d, contents = '%s' }" % (provider.get_length(), provider.to_string())
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def WTFStringImpl_SummaryProvider(valobj, dict):
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    provider = WTFStringImplProvider(valobj, dict)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return "{ length = %d, is8bit = %d, contents = '%s' }" % (provider.get_length(), provider.is_8bit(), provider.to_string())
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def WTFAtomicString_SummaryProvider(valobj, dict):
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WTFString_SummaryProvider(valobj.GetChildMemberWithName('m_string'), dict)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def WTFVector_SummaryProvider(valobj, dict):
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    provider = WTFVectorProvider(valobj, dict)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return "{ size = %d, capacity = %d }" % (provider.size, provider.capacity)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)def WTFHashTable_SummaryProvider(valobj, dict):
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    provider = WTFHashTableProvider(valobj, dict)
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "{ tableSize = %d, keyCount = %d }" % (provider.tableSize(), provider.keyCount())
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)def WebCoreLayoutUnit_SummaryProvider(valobj, dict):
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    provider = WebCoreLayoutUnitProvider(valobj, dict)
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return "{ %s }" % provider.to_string()
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)def WebCoreLayoutSize_SummaryProvider(valobj, dict):
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    provider = WebCoreLayoutSizeProvider(valobj, dict)
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return "{ width = %s, height = %s }" % (provider.get_width(), provider.get_height())
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)def WebCoreLayoutPoint_SummaryProvider(valobj, dict):
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    provider = WebCoreLayoutPointProvider(valobj, dict)
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return "{ x = %s, y = %s }" % (provider.get_x(), provider.get_y())
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# FIXME: Provide support for the following types:
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# def WTFCString_SummaryProvider(valobj, dict):
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# def WebCoreKURLGooglePrivate_SummaryProvider(valobj, dict):
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# def WebCoreQualifiedName_SummaryProvider(valobj, dict):
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# def JSCIdentifier_SummaryProvider(valobj, dict):
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# def JSCJSString_SummaryProvider(valobj, dict):
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def guess_string_length(valobj, error):
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if not valobj.GetValue():
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for i in xrange(0, 2048):
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if valobj.GetPointeeData(i, 1).GetUnsignedInt16(error, 0) == 0:
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return i
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 256
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def ustring_to_string(valobj, error, length=None):
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if length is None:
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = guess_string_length(valobj, error)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else:
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = int(length)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    out_string = u""
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for i in xrange(0, length):
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char_value = valobj.GetPointeeData(i, 1).GetUnsignedInt16(error, 0)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out_string = out_string + unichr(char_value)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return out_string.encode('utf-8')
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)def lstring_to_string(valobj, error, length=None):
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if length is None:
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = guess_string_length(valobj, error)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else:
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        length = int(length)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    out_string = u""
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for i in xrange(0, length):
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char_value = valobj.GetPointeeData(i, 1).GetUnsignedInt8(error, 0)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        out_string = out_string + unichr(char_value)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return out_string.encode('utf-8')
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WTFStringImplProvider:
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def __init__(self, valobj, dict):
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.valobj = valobj
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def get_length(self):
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return self.valobj.GetChildMemberWithName('m_length').GetValueAsUnsigned(0)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def get_data8(self):
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return self.valobj.GetChildAtIndex(2).GetChildMemberWithName('m_data8')
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def get_data16(self):
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return self.valobj.GetChildAtIndex(2).GetChildMemberWithName('m_data16')
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def to_string(self):
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        error = lldb.SBError()
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if self.is_8bit():
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return lstring_to_string(self.get_data8(), error, self.get_length())
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return ustring_to_string(self.get_data16(), error, self.get_length())
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def is_8bit(self):
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        # FIXME: find a way to access WTF::StringImpl::s_hashFlag8BitBuffer
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return bool(self.valobj.GetChildMemberWithName('m_hashAndFlags').GetValueAsUnsigned(0) \
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            & 1 << 6)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WTFStringProvider:
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def __init__(self, valobj, dict):
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.valobj = valobj
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def stringimpl(self):
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        impl_ptr = self.valobj.GetChildMemberWithName('m_impl').GetChildMemberWithName('m_ptr')
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return WTFStringImplProvider(impl_ptr, dict)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def get_length(self):
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        impl = self.stringimpl()
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if not impl:
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return impl.get_length()
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def to_string(self):
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        impl = self.stringimpl()
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if not impl:
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return u""
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return impl.to_string()
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class WebCoreLayoutUnitProvider:
18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    "Print a WebCore::LayoutUnit"
18109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def __init__(self, valobj, dict):
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        self.valobj = valobj
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def to_string(self):
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return "%gpx" % (self.valobj.GetChildMemberWithName('m_value').GetValueAsUnsigned(0) / 64.0)
18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class WebCoreLayoutSizeProvider:
18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    "Print a WebCore::LayoutSize"
19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def __init__(self, valobj, dict):
19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        self.valobj = valobj
19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def get_width(self):
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return WebCoreLayoutUnitProvider(self.valobj.GetChildMemberWithName('m_width'), dict).to_string()
19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def get_height(self):
19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return WebCoreLayoutUnitProvider(self.valobj.GetChildMemberWithName('m_height'), dict).to_string()
19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class WebCoreLayoutPointProvider:
20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    "Print a WebCore::LayoutPoint"
20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def __init__(self, valobj, dict):
20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        self.valobj = valobj
20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def get_x(self):
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return WebCoreLayoutUnitProvider(self.valobj.GetChildMemberWithName('m_x'), dict).to_string()
20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
20809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    def get_y(self):
20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return WebCoreLayoutUnitProvider(self.valobj.GetChildMemberWithName('m_y'), dict).to_string()
21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class WTFVectorProvider:
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def __init__(self, valobj, internal_dict):
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.valobj = valobj
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.update()
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def num_children(self):
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return self.size + 3
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def get_child_index(self, name):
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if name == "m_size":
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return self.size
223d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        elif name == "m_capacity":
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return self.size + 1
225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        elif name == "m_buffer":
226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return self.size + 2
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else:
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return int(name.lstrip('[').rstrip(']'))
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def get_child_at_index(self, index):
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if index == self.size:
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return self.valobj.GetChildMemberWithName("m_size")
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        elif index == self.size + 1:
234d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return self.valobj.GetChildMemberWithName("m_capacity")
235d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        elif index == self.size + 2:
236d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            return self.buffer
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        elif index < self.size:
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            offset = index * self.data_size
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child = self.buffer.CreateChildAtOffset('[' + str(index) + ']', offset, self.data_type)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return child
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else:
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return None
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def update(self):
245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        self.buffer = self.valobj.GetChildMemberWithName('m_buffer')
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.size = self.valobj.GetChildMemberWithName('m_size').GetValueAsUnsigned(0)
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        self.capacity = self.buffer.GetChildMemberWithName('m_capacity').GetValueAsUnsigned(0)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.data_type = self.buffer.GetType().GetPointeeType()
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self.data_size = self.data_type.GetByteSize()
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    def has_children(self):
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return True
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class WTFHashTableProvider:
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def __init__(self, valobj, internal_dict):
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        self.valobj = valobj
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        self.update()
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def num_children(self):
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return self.tableSize() + 5
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def get_child_index(self, name):
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if name == "m_table":
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.tableSize()
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif name == "m_tableSize":
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.tableSize() + 1
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif name == "m_tableSizeMask":
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.tableSize() + 2
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif name == "m_keyCount":
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.tableSize() + 3
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif name == "m_deletedCount":
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.tableSize() + 4
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else:
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return int(name.lstrip('[').rstrip(']'))
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def get_child_at_index(self, index):
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if index == self.tableSize():
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.valobj.GetChildMemberWithName('m_table')
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif index == self.tableSize() + 1:
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.valobj.GetChildMemberWithName('m_tableSize')
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif index == self.tableSize() + 2:
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.valobj.GetChildMemberWithName('m_tableSizeMask')
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif index == self.tableSize() + 3:
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.valobj.GetChildMemberWithName('m_keyCount')
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif index == self.tableSize() + 4:
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return self.valobj.GetChildMemberWithName('m_deletedCount')
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        elif index < self.tableSize():
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            table = self.valobj.GetChildMemberWithName('m_table')
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return table.CreateChildAtOffset('[' + str(index) + ']', index * self.data_size, self.data_type)
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else:
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return None
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def tableSize(self):
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return self.valobj.GetChildMemberWithName('m_tableSize').GetValueAsUnsigned(0)
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def keyCount(self):
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return self.valobj.GetChildMemberWithName('m_keyCount').GetValueAsUnsigned(0)
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def update(self):
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        self.data_type = self.valobj.GetType().GetTemplateArgumentType(0)
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        self.data_size = self.data_type.GetByteSize()
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    def has_children(self):
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return True
306