Changeset 251813 in webkit
- Timestamp:
- Oct 30, 2019 3:21:06 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r251736 r251813 1 2019-10-30 Daniel Bates <dabates@apple.com> 2 3 Add pretty printer for CompactPointerTuple 4 https://bugs.webkit.org/show_bug.cgi?id=203495 5 6 Reviewed by Jer Noble. 7 8 #include <wtf/FastMalloc.h> for the definition of WTF_MAKE_FAST_ALLOCATED. 9 10 * wtf/CompactPointerTuple.h: 11 1 12 2019-10-29 Yusuke Suzuki <ysuzuki@apple.com> 2 13 -
trunk/Source/WTF/wtf/CompactPointerTuple.h
r251008 r251813 27 27 28 28 #include <type_traits> 29 #include <wtf/FastMalloc.h> 29 30 #include <wtf/StdLibExtras.h> 30 31 -
trunk/Tools/ChangeLog
r251808 r251813 1 2019-10-30 Daniel Bates <dabates@apple.com> 2 3 Add pretty printer for CompactPointerTuple 4 https://bugs.webkit.org/show_bug.cgi?id=203495 5 6 Reviewed by Jer Noble. 7 8 Make it easy to see the state of a CompactPointerTuple. Now we will print something like: 9 10 (WTF::CompactPointerTuple<WTF::String *, unsigned char>) $0 = { type = 7 } { 11 [0] = 0x00007ffeefbff220 { length = 8, contents = 'résumé' } 12 [1] = 7 13 } 14 15 for aCompactPointerTuple defined like this: 16 17 String aString { "résumé" }; 18 CompactPointerTuple<String*, uint8_t> aCompactPointerTuple { &aString, 7 }; 19 20 * lldb/lldbWebKitTester/main.cpp: 21 (testSummaryProviders): 22 * lldb/lldb_webkit.py: 23 (__lldb_init_module): 24 (__lldb_init_module.lldb_webkit): 25 (WTFCompactPointerTuple_SummaryProvider): 26 (WTFCompactPointerTupleProvider): 27 (WTFCompactPointerTupleProvider.__init__): 28 29 (WTFCompactPointerTupleProvider.type_as_string): 30 (WTFCompactPointerTupleProvider.is_human_readable_type): 31 The majority of the time CompactPointerTuple will be used with non-character type data. So, 32 I optimize for this use case and consider the integral value as more readable than than LLDB's 33 default summary provider that emits the character or equivalent C escape sequence. 34 35 (WTFCompactPointerTupleProvider.has_children): 36 (WTFCompactPointerTupleProvider.num_children): 37 (WTFCompactPointerTupleProvider.get_child_index): 38 (WTFCompactPointerTupleProvider.get_child_at_index): 39 (WTFCompactPointerTupleProvider.update): 40 * lldb/lldb_webkit_unittest.py: 41 (TestSummaryProviders.serial_test_WTFOptionSetProvider_aliased_flag): 42 (TestSummaryProviders): 43 (TestSummaryProviders.serial_test_WTFCompactPointerTuple_SummaryProvider_empty): 44 (TestSummaryProviders.serial_test_WTFCompactPointerTuple_SummaryProvider_simple): 45 (TestSummaryProviders.serial_test_WTFCompactPointerTuple_SummaryProvider_max_type_value): 46 (TestSummaryProviders.serial_test_WTFCompactPointerTuple_SummaryProvider_bool): 47 (TestSummaryProviders.serial_test_WTFCompactPointerTupleProvider_empty): 48 (TestSummaryProviders.serial_test_WTFCompactPointerTupleProvider_simple): 49 (TestSummaryProviders.serial_test_WTFCompactPointerTupleProvider_max_type_value): 50 (TestSummaryProviders.serial_test_WTFCompactPointerTupleProvider_simple_bool): 51 1 52 2019-10-30 Jonathan Bedard <jbedard@apple.com> 2 53 -
trunk/Tools/lldb/lldbWebKitTester/main.cpp
r237564 r251813 26 26 #include "DumpClassLayoutTesting.h" 27 27 #include <stdio.h> 28 #include <wtf/CompactPointerTuple.h> 28 29 #include <wtf/HashMap.h> 29 30 #include <wtf/HashSet.h> … … 87 88 OptionSet<ExampleFlags> exampleFlagsAliasedFlag { ExampleFlags::AAlias, ExampleFlags::D }; 88 89 90 CompactPointerTuple<String*, uint8_t> exampleCompactPointerTupleEmpty; 91 CompactPointerTuple<String*, uint8_t> exampleCompactPointerTupleSimple { &an8BitString, 7 }; 92 CompactPointerTuple<String*, uint8_t> exampleCompactPointerTupleMaxTypeValue { &an8BitString, 255 }; 93 CompactPointerTuple<String*, bool> exampleCompactPointerTupleSimpleBool { &an8BitString, true }; 94 89 95 breakForTestingSummaryProviders(); 90 96 } -
trunk/Tools/lldb/lldb_webkit.py
r251220 r251813 67 67 debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFMediaTime_SummaryProvider WTF::MediaTime') 68 68 debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFOptionSet_SummaryProvider -x "^WTF::OptionSet<.+>$"') 69 debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFCompactPointerTuple_SummaryProvider -x "^WTF::CompactPointerTuple<.+,.+>$"') 69 70 70 71 debugger.HandleCommand('type summary add -F lldb_webkit.WTFURL_SummaryProvider WTF::URL') … … 94 95 debugger.HandleCommand('type synthetic add -x "^WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider') 95 96 debugger.HandleCommand('type synthetic add -x "^WTF::OptionSet<.+>$" --python-class lldb_webkit.WTFOptionSetProvider') 97 debugger.HandleCommand('type synthetic add -x "^WTF::CompactPointerTuple<.+,.+>$" --python-class lldb_webkit.WTFCompactPointerTupleProvider') 96 98 97 99 addSummaryAndSyntheticFormattersForRawBitmaskType(debugger, "WebEventFlags", { … … 167 169 return "{ %f }" % (provider.timeValueAsDouble()) 168 170 return "{ %d/%d, %f }" % (provider.timeValue(), provider.timeScale(), float(provider.timeValue()) / provider.timeScale()) 171 172 173 def WTFCompactPointerTuple_SummaryProvider(valobj, dict): 174 provider = WTFCompactPointerTupleProvider(valobj, dict) 175 return "{ type = %s }" % provider.type_as_string() 169 176 170 177 … … 843 850 def _bitmask(self): 844 851 return self.valobj.GetValueAsUnsigned(0) 852 853 854 class WTFCompactPointerTupleProvider(object): 855 856 TYPE_MASK = 0xF800000000000007 857 POINTER_MASK = ~TYPE_MASK 858 859 def __init__(self, valobj, internal_dict): 860 self.valobj = valobj 861 self._is32Bit = valobj.GetTarget().GetAddressByteSize() == 4 862 self._pointer = None 863 self._type = None 864 self.update() 865 866 def type_as_string(self): 867 if not self.is_human_readable_type(): 868 return "%s" % self._type.GetValueAsUnsigned(0) 869 return "%s" % self._type.GetValue() 870 871 def is_human_readable_type(self): 872 # The default summary provider for uint8_t, unsigned char emits the ASCII printable character or equivalent 873 # C escape sequence (e.g. \a = 0x07). Typically the CompactPointerTuple is used to encode non-character integral 874 # data. In this context it is less readable to use the default summary provider. So, we don't. 875 return self.valobj.GetType().GetTemplateArgumentType(1).GetBasicType() != lldb.eBasicTypeUnsignedChar 876 877 # LLDB overrides 878 def has_children(self): 879 return self._type is not None and self._pointer is not None 880 881 def num_children(self): 882 if not self.has_children: 883 return 0 884 return 2 885 886 def get_child_index(self, name): 887 if name == '[0]': 888 return 0 889 if name == '[1]': 890 return 1 891 if self._is32Bit: 892 if name == 'm_pointer': 893 return 2 894 if name == 'm_type': 895 return 3 896 else: 897 if name == 'm_data': 898 return 2 899 return None 900 901 def get_child_at_index(self, index): 902 if index < 0 or not self.valobj.IsValid(): 903 return None 904 if index == 0: 905 return self._pointer 906 if index == 1: 907 return self._type 908 if self._is32Bit: 909 if index == 2: 910 return self._pointer 911 if index == 3: 912 return self._type 913 else: 914 if index == 2: 915 return self.valobj.GetChildMemberWithName('m_data') 916 return None 917 918 def update(self): 919 if self._is32Bit: 920 self._pointer = self.valobj.GetChildMemberWithName('m_pointer') 921 self._type = self.valobj.GetChildMemberWithName('m_type') 922 else: 923 data = self.valobj.GetChildMemberWithName('m_data').GetValueAsUnsigned(0) 924 byte_order = self.valobj.GetTarget().GetByteOrder() 925 address_byte_size = self.valobj.GetTarget().GetAddressByteSize() 926 927 pointer_data = lldb.SBData.CreateDataFromUInt64Array(byte_order, address_byte_size, [data & self.POINTER_MASK]) 928 self._pointer = self.valobj.CreateValueFromData('[0]', pointer_data, self.valobj.GetType().GetTemplateArgumentType(0)) 929 930 type_data = lldb.SBData.CreateDataFromUInt64Array(byte_order, address_byte_size, [(data >> 59 | data << 5) & 0xFF]) 931 type_to_use = self.valobj.GetType().GetTemplateArgumentType(1) 932 if not self.is_human_readable_type(): 933 type_to_use = self.valobj.GetTarget().GetBasicType(lldb.eBasicTypeUnsignedInt) 934 self._type = self.valobj.CreateValueFromData('[1]', type_data, type_to_use) 845 935 846 936 -
trunk/Tools/lldb/lldb_webkit_unittest.py
r249030 r251813 205 205 self.assertEqual(provider.get_child_at_index(1).GetName(), 'D') 206 206 self.assertEqual(provider.get_child_at_index(1).GetValue(), '8') 207 208 # MARK: WTFCompactPointerTuple test cases 209 210 def serial_test_WTFCompactPointerTuple_SummaryProvider_empty(self): 211 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleEmpty') 212 summary = lldb_webkit.WTFCompactPointerTuple_SummaryProvider(variable, {}) 213 self.assertEqual(summary, "{ type = 0 }") 214 215 def serial_test_WTFCompactPointerTuple_SummaryProvider_simple(self): 216 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleSimple') 217 summary = lldb_webkit.WTFCompactPointerTuple_SummaryProvider(variable, {}) 218 self.assertEqual(summary, "{ type = 7 }") 219 220 def serial_test_WTFCompactPointerTuple_SummaryProvider_max_type_value(self): 221 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleMaxTypeValue') 222 summary = lldb_webkit.WTFCompactPointerTuple_SummaryProvider(variable, {}) 223 self.assertEqual(summary, "{ type = 255 }") 224 225 def serial_test_WTFCompactPointerTuple_SummaryProvider_bool(self): 226 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleSimpleBool') 227 summary = lldb_webkit.WTFCompactPointerTuple_SummaryProvider(variable, {}) 228 self.assertEqual(summary, "{ type = true }") 229 230 def serial_test_WTFCompactPointerTupleProvider_empty(self): 231 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleEmpty') 232 provider = lldb_webkit.WTFCompactPointerTupleProvider(variable, {}) 233 self.assertEqual(provider.get_child_at_index(0).GetName(), '[0]') 234 self.assertEqual(provider.get_child_at_index(0).GetValueAsUnsigned(), 0) 235 self.assertEqual(provider.get_child_at_index(1).GetName(), '[1]') 236 self.assertEqual(provider.get_child_at_index(1).GetValueAsUnsigned(), 0) 237 238 def serial_test_WTFCompactPointerTupleProvider_simple(self): 239 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleSimple') 240 provider = lldb_webkit.WTFCompactPointerTupleProvider(variable, {}) 241 self.assertEqual(provider.get_child_at_index(0).GetName(), '[0]') 242 self.assertNotEqual(provider.get_child_at_index(0).GetValueAsUnsigned(), 0) 243 self.assertEqual(provider.get_child_at_index(1).GetName(), '[1]') 244 self.assertEqual(provider.get_child_at_index(1).GetValueAsUnsigned(), 7) 245 246 def serial_test_WTFCompactPointerTupleProvider_max_type_value(self): 247 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleMaxTypeValue') 248 provider = lldb_webkit.WTFCompactPointerTupleProvider(variable, {}) 249 self.assertEqual(provider.get_child_at_index(0).GetName(), '[0]') 250 self.assertNotEqual(provider.get_child_at_index(0).GetValueAsUnsigned(), 0) 251 self.assertEqual(provider.get_child_at_index(1).GetName(), '[1]') 252 self.assertEqual(provider.get_child_at_index(1).GetValueAsUnsigned(), 255) 253 254 def serial_test_WTFCompactPointerTupleProvider_simple_bool(self): 255 variable = self._sbFrame.FindVariable('exampleCompactPointerTupleSimpleBool') 256 provider = lldb_webkit.WTFCompactPointerTupleProvider(variable, {}) 257 self.assertEqual(provider.get_child_at_index(0).GetName(), '[0]') 258 self.assertNotEqual(provider.get_child_at_index(0).GetValueAsUnsigned(), 0) 259 self.assertEqual(provider.get_child_at_index(1).GetName(), '[1]') 260 self.assertEqual(provider.get_child_at_index(1).GetValue(), 'true')
Note: See TracChangeset
for help on using the changeset viewer.