Title: [229291] trunk/Tools
Revision
229291
Author
[email protected]
Date
2018-03-05 11:40:18 -0800 (Mon, 05 Mar 2018)

Log Message

dump-class-layout mishandles duplicates base classes and miscomputes padding
https://bugs.webkit.org/show_bug.cgi?id=183311

Patch by Joseph Pecoraro <[email protected]> on 2018-03-05
Reviewed by Simon Fraser.

* Scripts/dump-class-layout:
(verify_type):
(verify_type_recursive):
Keep a list of seen (offset, type) that we have output and don't re-output them.
The Python types list the base classes as members multiple times as you iterate
through the members, so just ignore them if we have seem them already at a
specific offset.

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (229290 => 229291)


--- trunk/Tools/ChangeLog	2018-03-05 19:29:44 UTC (rev 229290)
+++ trunk/Tools/ChangeLog	2018-03-05 19:40:18 UTC (rev 229291)
@@ -1,3 +1,18 @@
+2018-03-05  Joseph Pecoraro  <[email protected]>
+
+        dump-class-layout mishandles duplicates base classes and miscomputes padding
+        https://bugs.webkit.org/show_bug.cgi?id=183311
+
+        Reviewed by Simon Fraser.
+
+        * Scripts/dump-class-layout:
+        (verify_type):
+        (verify_type_recursive):
+        Keep a list of seen (offset, type) that we have output and don't re-output them.
+        The Python types list the base classes as members multiple times as you iterate
+        through the members, so just ignore them if we have seem them already at a
+        specific offset.
+
 2018-03-05  Carlos Alberto Lopez Perez  <[email protected]>
 
         [GTK][Wayland] The GTK Wayland bot exits early because of assertions related with libsecret since r221925

Modified: trunk/Tools/Scripts/dump-class-layout (229290 => 229291)


--- trunk/Tools/Scripts/dump-class-layout	2018-03-05 19:29:44 UTC (rev 229290)
+++ trunk/Tools/Scripts/dump-class-layout	2018-03-05 19:40:18 UTC (rev 229291)
@@ -28,7 +28,8 @@
 import getopt
 import argparse
 import os
-import subprocess;
+import subprocess
+from sets import Set
 
 
 framework = "WebCore"
@@ -57,7 +58,8 @@
 
 def verify_type(target, type):
     typename = type.GetName()
-    (end_offset, padding) = verify_type_recursive(target, type, None, 0, 0, 0)
+    seenBefore = Set()
+    (end_offset, padding) = verify_type_recursive(target, type, None, 0, 0, 0, seenBefore)
     byte_size = type.GetByteSize()
     print 'Total byte size: %u' % (byte_size)
     print 'Total pad bytes: %u' % (padding)
@@ -65,7 +67,7 @@
         print 'Padding percentage: %2.2f %%' % ((float(padding) / float(byte_size)) * 100.0)
     print
 
-def verify_type_recursive(target, type, member_name, depth, base_offset, padding):
+def verify_type_recursive(target, type, member_name, depth, base_offset, padding, seenBefore):
     prev_end_offset = base_offset
     typename = type.GetName()
     byte_size = type.GetByteSize()
@@ -85,6 +87,11 @@
             member_total_offset = member_offset + base_offset
             member_byte_size = member_type.GetByteSize()
             member_is_class_or_struct = False
+
+            if (member_offset, member_name) in seenOffset:
+                continue
+            seenOffset.add((member_offset, member_name))
+
             if member_type_class == lldb.eTypeClassStruct or member_type_class == lldb.eTypeClassClass:
                 member_is_class_or_struct = True
             if member_idx == 0 and member_offset == target.GetAddressByteSize() and type.IsPolymorphicClass():
@@ -98,7 +105,7 @@
                     print '%+4u <%3u> %s<PADDING>' % (prev_end_offset, member_padding, '    ' * (depth + 1))
 
             if member_is_class_or_struct:
-                (prev_end_offset, padding) = verify_type_recursive(target, member_canonical_type, member_name, depth + 1, member_total_offset, padding)
+                (prev_end_offset, padding) = verify_type_recursive(target, member_canonical_type, member_name, depth + 1, member_total_offset, padding, seenBefore)
             else:
                 prev_end_offset = member_total_offset + member_byte_size
                 member_typename = member_type.GetName()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to