[lldb-webkit] Last aliased enumerator in OptionSet is printed; should print first...
authordbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Oct 2018 20:57:15 +0000 (20:57 +0000)
committerdbates@webkit.org <dbates@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 29 Oct 2018 20:57:15 +0000 (20:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191036

Reviewed by Andy Estes.

Prefer the first enumerator (in parse order) when pretty-printing an OptionSet that is parameterized
by an enum that contains two or more enumerators with the same value. For example, suppose
you have the following enum:

enum Flag {
    A = 1 << 0,
    AAlias = A,
};

Then pretty-printing OptionSet<Flag>(Flag::A) should print A instead of AAlias. A side effect of
this change is that OptionSet<Flag>(Flag::AAlias) will also print A as its only member as we cannot
differentiate between A and Alias. This should be acceptable in practice as aliased enumerators
tend to be used in bounds checks as opposed to code that adds to a set.

* lldb/lldbWebKitTester/main.cpp:
(testSummaryProviders):
* lldb/lldb_webkit.py:
(WTFOptionSetProvider.update):
* lldb/lldb_webkit_unittest.py:
(TestSummaryProviders.serial_test_WTFOptionSetProvider_simple):
(TestSummaryProviders):
(TestSummaryProviders.serial_test_WTFOptionSetProvider_aliased_flag):

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

Tools/ChangeLog
Tools/lldb/lldbWebKitTester/main.cpp
Tools/lldb/lldb_webkit.py
Tools/lldb/lldb_webkit_unittest.py

index 3b709c0..262b11f 100644 (file)
@@ -1,5 +1,35 @@
 2018-10-29  Daniel Bates  <dabates@apple.com>
 
+        [lldb-webkit] Last aliased enumerator in OptionSet is printed; should print first enumerator
+        https://bugs.webkit.org/show_bug.cgi?id=191036
+
+        Reviewed by Andy Estes.
+
+        Prefer the first enumerator (in parse order) when pretty-printing an OptionSet that is parameterized
+        by an enum that contains two or more enumerators with the same value. For example, suppose
+        you have the following enum:
+
+        enum Flag {
+            A = 1 << 0,
+            AAlias = A,
+        };
+
+        Then pretty-printing OptionSet<Flag>(Flag::A) should print A instead of AAlias. A side effect of
+        this change is that OptionSet<Flag>(Flag::AAlias) will also print A as its only member as we cannot
+        differentiate between A and Alias. This should be acceptable in practice as aliased enumerators
+        tend to be used in bounds checks as opposed to code that adds to a set.
+
+        * lldb/lldbWebKitTester/main.cpp:
+        (testSummaryProviders):
+        * lldb/lldb_webkit.py:
+        (WTFOptionSetProvider.update):
+        * lldb/lldb_webkit_unittest.py:
+        (TestSummaryProviders.serial_test_WTFOptionSetProvider_simple):
+        (TestSummaryProviders):
+        (TestSummaryProviders.serial_test_WTFOptionSetProvider_aliased_flag):
+
+2018-10-29  Daniel Bates  <dabates@apple.com>
+
         [llbd-webkit] Add summaries for Document, Frame, and SecurityOrigin
         https://bugs.webkit.org/show_bug.cgi?id=191033
 
index 9f8af52..6940c59 100644 (file)
@@ -50,6 +50,7 @@ enum class ExampleFlags {
     B = 1 << 1,
     C = 1 << 2,
     D = 1 << 3,
+    AAlias = A,
 };
 
 static void testSummaryProviders()
@@ -83,6 +84,7 @@ static void testSummaryProviders()
 
     OptionSet<ExampleFlags> exampleFlagsEmpty;
     OptionSet<ExampleFlags> exampleFlagsSimple { ExampleFlags::A, ExampleFlags::D, ExampleFlags::C };
+    OptionSet<ExampleFlags> exampleFlagsAliasedFlag { ExampleFlags::AAlias, ExampleFlags::D };
 
     breakForTestingSummaryProviders();
 }
index 49d0762..dde1aa7 100644 (file)
@@ -733,7 +733,11 @@ class WTFOptionSetProvider:
         self.size = 0
 
         template_argument_sbType = self.valobj.GetType().GetTemplateArgumentType(0)
-        enumerator_value_to_name_map = {sbTypeEnumMember.GetValueAsUnsigned(): sbTypeEnumMember.GetName() for sbTypeEnumMember in template_argument_sbType.get_enum_members_array()}
+        enumerator_value_to_name_map = {}
+        for sbTypeEnumMember in template_argument_sbType.get_enum_members_array():
+            enumerator_value = sbTypeEnumMember.GetValueAsUnsigned()
+            if enumerator_value not in enumerator_value_to_name_map:
+                enumerator_value_to_name_map[enumerator_value] = sbTypeEnumMember.GetName()
         if not enumerator_value_to_name_map:
             return
 
index 34b5555..ec824e7 100755 (executable)
@@ -196,3 +196,11 @@ class TestSummaryProviders(unittest.TestCase):
         self.assertEqual(provider.get_child_at_index(1).GetValue(), '4')
         self.assertEqual(provider.get_child_at_index(2).GetName(), 'D')
         self.assertEqual(provider.get_child_at_index(2).GetValue(), '8')
+
+    def serial_test_WTFOptionSetProvider_aliased_flag(self):
+        variable = self._sbFrame.FindVariable('exampleFlagsAliasedFlag')
+        provider = lldb_webkit.WTFOptionSetProvider(variable, {})
+        self.assertEqual(provider.get_child_at_index(0).GetName(), 'A')
+        self.assertEqual(provider.get_child_at_index(0).GetValue(), '1')
+        self.assertEqual(provider.get_child_at_index(1).GetName(), 'D')
+        self.assertEqual(provider.get_child_at_index(1).GetValue(), '8')