Title: [234088] trunk/Tools
Revision
234088
Author
[email protected]
Date
2018-07-21 21:56:33 -0700 (Sat, 21 Jul 2018)

Log Message

Fix lldb summarizers for HashMaps and HashSets
https://bugs.webkit.org/show_bug.cgi?id=187883

Reviewed by Dan Bates.

HashMap and HashSet summarizers were broken in various ways.

The 'type summary add -x' regexp needs to match at the start and end of the string
to avoid finding types nested inside other templates.

The HashTable synthetic child code incorrectly used the type of the key, rather than
the value when synthesizing children.

Add HashMap and HashSet summarizers.

I tried to get synthetic children working directly for HashMap and HashSet, but was unable.

* lldb/lldbWebKitTester/main.cpp:
(testSummaryProviders):
* lldb/lldb_webkit.py:
(__lldb_init_module):
(__lldb_init_module.lldb_webkit):
(WTFHashMap_SummaryProvider):
(WTFHashSet_SummaryProvider):
(WebCoreColorProvider._to_string_extended):
(WebCoreURLProvider.to_string):
(WTFHashMapProvider):
(WTFHashMapProvider.__init__):
(WTFHashMapProvider.tableSize):
(WTFHashMapProvider.keyCount):
(WTFHashSetProvider):
(WTFHashSetProvider.__init__):
(WTFHashSetProvider.tableSize):
(WTFHashSetProvider.keyCount):
(WTFHashTableProvider.tableSize):
(WTFHashTableProvider):
(WTFHashTableProvider.keyCount):
(WTFHashTableProvider.get_child_at_index):
(WTFHashTableProvider.update):
* lldb/lldb_webkit_unittest.py:
(TestSummaryProviders.serial_test_WTFVectorProvider_empty_vector):
(TestSummaryProviders.serial_test_WTFVectorProvider_vector_size_and_capacity):
(TestSummaryProviders):
(TestSummaryProviders.serial_test_WTFHashMap_tablesize_and_size):
(TestSummaryProviders.serial_test_WTFHashMap_of_vectors_tablesize_and_size):
(TestSummaryProviders.serial_test_WTFHashSet_tablesize_and_size):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (234087 => 234088)


--- trunk/Tools/ChangeLog	2018-07-22 04:09:44 UTC (rev 234087)
+++ trunk/Tools/ChangeLog	2018-07-22 04:56:33 UTC (rev 234088)
@@ -1,5 +1,54 @@
 2018-07-21  Simon Fraser  <[email protected]>
 
+        Fix lldb summarizers for HashMaps and HashSets
+        https://bugs.webkit.org/show_bug.cgi?id=187883
+
+        Reviewed by Dan Bates.
+        
+        HashMap and HashSet summarizers were broken in various ways.
+        
+        The 'type summary add -x' regexp needs to match at the start and end of the string
+        to avoid finding types nested inside other templates.
+        
+        The HashTable synthetic child code incorrectly used the type of the key, rather than
+        the value when synthesizing children.
+        
+        Add HashMap and HashSet summarizers.
+
+        I tried to get synthetic children working directly for HashMap and HashSet, but was unable.
+
+        * lldb/lldbWebKitTester/main.cpp:
+        (testSummaryProviders):
+        * lldb/lldb_webkit.py:
+        (__lldb_init_module):
+        (__lldb_init_module.lldb_webkit):
+        (WTFHashMap_SummaryProvider):
+        (WTFHashSet_SummaryProvider):
+        (WebCoreColorProvider._to_string_extended):
+        (WebCoreURLProvider.to_string):
+        (WTFHashMapProvider):
+        (WTFHashMapProvider.__init__):
+        (WTFHashMapProvider.tableSize):
+        (WTFHashMapProvider.keyCount):
+        (WTFHashSetProvider):
+        (WTFHashSetProvider.__init__):
+        (WTFHashSetProvider.tableSize):
+        (WTFHashSetProvider.keyCount):
+        (WTFHashTableProvider.tableSize):
+        (WTFHashTableProvider):
+        (WTFHashTableProvider.keyCount):
+        (WTFHashTableProvider.get_child_at_index):
+        (WTFHashTableProvider.update):
+        * lldb/lldb_webkit_unittest.py:
+        (TestSummaryProviders.serial_test_WTFVectorProvider_empty_vector):
+        (TestSummaryProviders.serial_test_WTFVectorProvider_vector_size_and_capacity):
+        (TestSummaryProviders):
+        (TestSummaryProviders.serial_test_WTFHashMap_tablesize_and_size):
+        (TestSummaryProviders.serial_test_WTFHashMap_of_vectors_tablesize_and_size):
+        (TestSummaryProviders.serial_test_WTFHashSet_tablesize_and_size):
+
+2018-07-21  Simon Fraser  <[email protected]>
+
         Add lldb formatters for WebCore geometry types
         https://bugs.webkit.org/show_bug.cgi?id=187884
 

Modified: trunk/Tools/lldb/lldbWebKitTester/main.cpp (234087 => 234088)


--- trunk/Tools/lldb/lldbWebKitTester/main.cpp	2018-07-22 04:09:44 UTC (rev 234087)
+++ trunk/Tools/lldb/lldbWebKitTester/main.cpp	2018-07-22 04:56:33 UTC (rev 234088)
@@ -25,6 +25,9 @@
 
 #include "DumpClassLayoutTesting.h"
 #include <stdio.h>
+#include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
+#include <wtf/Vector.h>
 #include <wtf/text/StringBuilder.h>
 #include <wtf/text/WTFString.h>
 
@@ -55,12 +58,21 @@
     String a16BitString = utf16String(u"\u1680Cappuccino\u1680");
     StringImpl* a16BitStringImpl = a16BitString.impl();
 
-
     Vector<int> anEmptyVector;
     Vector<int> aVectorWithOneItem;
     aVectorWithOneItem.reserveCapacity(16);
     aVectorWithOneItem.append(1);
 
+    HashMap<unsigned, int> hashMapOfInts;
+    hashMapOfInts.add(12, 23);
+    hashMapOfInts.add(34, 45);
+
+    HashSet<unsigned> hashSetOfInts;
+    hashSetOfInts.add(42);
+
+    HashMap<unsigned, Vector<int>> hashMapOfVectors;
+    hashMapOfVectors.add(1, Vector<int>({2, 3}));
+
     breakForTestingSummaryProviders();
 }
 

Modified: trunk/Tools/lldb/lldb_webkit.py (234087 => 234088)


--- trunk/Tools/lldb/lldb_webkit.py	2018-07-22 04:09:44 UTC (rev 234087)
+++ trunk/Tools/lldb/lldb_webkit.py	2018-07-22 04:56:33 UTC (rev 234088)
@@ -39,14 +39,13 @@
     debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFStringImpl_SummaryProvider WTF::StringImpl')
     debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFStringView_SummaryProvider WTF::StringView')
     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 summary add --expand -F lldb_webkit.WTFHashTable_SummaryProvider -x "WTF::HashTable<.+>$"')
+    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFVector_SummaryProvider -x "^WTF::Vector<.+>$"')
+    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFHashTable_SummaryProvider -x "^WTF::HashTable<.+>$"')
+    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFHashMap_SummaryProvider -x "^WTF::HashMap<.+>$"')
+    debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFHashSet_SummaryProvider -x "^WTF::HashSet<.+>$"')
     debugger.HandleCommand('type summary add --expand -F lldb_webkit.WTFMediaTime_SummaryProvider WTF::MediaTime')
-    debugger.HandleCommand('type synthetic add -x "WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider')
-    debugger.HandleCommand('type synthetic add -x "WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider')
 
     debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreURL_SummaryProvider WebCore::URL')
-
     debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreColor_SummaryProvider WebCore::Color')
 
     debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreLayoutUnit_SummaryProvider WebCore::LayoutUnit')
@@ -62,7 +61,11 @@
     debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreFloatPoint_SummaryProvider WebCore::FloatPoint')
     debugger.HandleCommand('type summary add -F lldb_webkit.WebCoreFloatRect_SummaryProvider WebCore::FloatRect')
 
+    # synthetic types (see <https://lldb.llvm.org/varformats.html>)
+    debugger.HandleCommand('type synthetic add -x "^WTF::Vector<.+>$" --python-class lldb_webkit.WTFVectorProvider')
+    debugger.HandleCommand('type synthetic add -x "^WTF::HashTable<.+>$" --python-class lldb_webkit.WTFHashTableProvider')
 
+
 def WTFString_SummaryProvider(valobj, dict):
     provider = WTFStringProvider(valobj, dict)
     return "{ length = %d, contents = '%s' }" % (provider.get_length(), provider.to_string())
@@ -94,6 +97,16 @@
     return "{ tableSize = %d, keyCount = %d }" % (provider.tableSize(), provider.keyCount())
 
 
+def WTFHashMap_SummaryProvider(valobj, dict):
+    provider = WTFHashMapProvider(valobj, dict)
+    return "{ tableSize = %d, keyCount = %d }" % (provider.tableSize(), provider.keyCount())
+
+
+def WTFHashSet_SummaryProvider(valobj, dict):
+    provider = WTFHashSetProvider(valobj, dict)
+    return "{ tableSize = %d, keyCount = %d }" % (provider.tableSize(), provider.keyCount())
+
+
 def WTFMediaTime_SummaryProvider(valobj, dict):
     provider = WTFMediaTimeProvider(valobj, dict)
     if provider.isInvalid():
@@ -560,6 +573,7 @@
     def to_string(self):
         return WTFStringProvider(self.valobj.GetChildMemberWithName('m_string'), dict).to_string()
 
+
 class WTFVectorProvider:
     def __init__(self, valobj, internal_dict):
         self.valobj = valobj
@@ -603,11 +617,44 @@
         return True
 
 
+class WTFHashMapProvider:
+    def __init__(self, valobj, internal_dict):
+        self.valobj = valobj
+        impl_ptr = self.valobj.GetChildMemberWithName('m_impl')
+        self._hash_table_provider = WTFHashTableProvider(impl_ptr, dict)
+
+    def tableSize(self):
+        return self._hash_table_provider.tableSize()
+
+    def keyCount(self):
+        return self._hash_table_provider.keyCount()
+
+
+class WTFHashSetProvider:
+    def __init__(self, valobj, internal_dict):
+        self.valobj = valobj
+        impl_ptr = self.valobj.GetChildMemberWithName('m_impl')
+        self._hash_table_provider = WTFHashTableProvider(impl_ptr, dict)
+
+    def tableSize(self):
+        return self._hash_table_provider.tableSize()
+
+    def keyCount(self):
+        return self._hash_table_provider.keyCount()
+
+
 class WTFHashTableProvider:
     def __init__(self, valobj, internal_dict):
         self.valobj = valobj
         self.update()
 
+    def tableSize(self):
+        return self.valobj.GetChildMemberWithName('m_tableSize').GetValueAsUnsigned(0)
+
+    def keyCount(self):
+        return self.valobj.GetChildMemberWithName('m_keyCount').GetValueAsUnsigned(0)
+
+    # Synthetic children provider methods.
     def num_children(self):
         return self.tableSize() + 5
 
@@ -642,14 +689,8 @@
         else:
             return None
 
-    def tableSize(self):
-        return self.valobj.GetChildMemberWithName('m_tableSize').GetValueAsUnsigned(0)
-
-    def keyCount(self):
-        return self.valobj.GetChildMemberWithName('m_keyCount').GetValueAsUnsigned(0)
-
     def update(self):
-        self.data_type = self.valobj.GetType().GetTemplateArgumentType(0)
+        self.data_type = self.valobj.GetType().GetTemplateArgumentType(1)
         self.data_size = self.data_type.GetByteSize()
 
     def has_children(self):

Modified: trunk/Tools/lldb/lldb_webkit_unittest.py (234087 => 234088)


--- trunk/Tools/lldb/lldb_webkit_unittest.py	2018-07-22 04:09:44 UTC (rev 234087)
+++ trunk/Tools/lldb/lldb_webkit_unittest.py	2018-07-22 04:56:33 UTC (rev 234088)
@@ -143,12 +143,27 @@
 
     def serial_test_WTFVectorProvider_empty_vector(self):
         variable = self._sbFrame.FindVariable('anEmptyVector');
-        self.assertIsNotNone(variable)
         summary = lldb_webkit.WTFVector_SummaryProvider(variable, {})
         self.assertEqual(summary, "{ size = 0, capacity = 0 }")
 
     def serial_test_WTFVectorProvider_vector_size_and_capacity(self):
         variable = self._sbFrame.FindVariable('aVectorWithOneItem');
-        self.assertIsNotNone(variable)
         summary = lldb_webkit.WTFVector_SummaryProvider(variable, {})
         self.assertEqual(summary, "{ size = 1, capacity = 16 }")
+
+    # MARK: WTFHashMap_SummaryProvider and WTFHashSet_SummaryProvider test cases
+
+    def serial_test_WTFHashMap_tablesize_and_size(self):
+        variable = self._sbFrame.FindVariable('hashMapOfInts')
+        summary = lldb_webkit.WTFHashMap_SummaryProvider(variable, {})
+        self.assertEqual(summary, "{ tableSize = 8, keyCount = 2 }")
+
+    def serial_test_WTFHashMap_of_vectors_tablesize_and_size(self):
+        variable = self._sbFrame.FindVariable('hashMapOfVectors')
+        summary = lldb_webkit.WTFHashMap_SummaryProvider(variable, {})
+        self.assertEqual(summary, "{ tableSize = 8, keyCount = 1 }")
+
+    def serial_test_WTFHashSet_tablesize_and_size(self):
+        variable = self._sbFrame.FindVariable('hashSetOfInts')
+        summary = lldb_webkit.WTFHashSet_SummaryProvider(variable, {})
+        self.assertEqual(summary, "{ tableSize = 8, keyCount = 1 }")
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to