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()