Dumper: Fix dump of std::string on macOS

Try to handle the alternate layout of strings correctly.
Depending on the defines and the endianness the string structure
may vary quite a bit. Old approach just took care of the default
layout and the endianness.
In case of an alternate layout of strings we failed so far.

Fixes: QTCREATORBUG-26175
Done-with: Viktor Govako
Change-Id: I788eb5619408bca281eb887c3f6a269808c27d24
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Stenger
2022-06-24 14:46:39 +02:00
parent e1d2cbde24
commit e7d90c23b6

View File

@@ -776,7 +776,29 @@ def qdumpHelper__std__string__MSVC(d, value, charType, format):
d.putCharArrayHelper(data, size, charType, format) d.putCharArrayHelper(data, size, charType, format)
def qdump__std____1__string__alternateLayoutHelper(d, value):
try:
_d = value['__s']['__data_'].address()
alternateLayout = (_d - value.address()) == 0
if alternateLayout:
lastByte = value.split('b')[-1]
if int(lastByte & 0x80) == 0:
# Short/internal
size = value['__s']['__size_'].integer()
data = value.address()
else:
# Long/external
(data, size, _) = value.split('ppp')
return size, data
else:
return None, None
except:
return None, None
def qdump__std____1__string(d, value): def qdump__std____1__string(d, value):
(size, data) = qdump__std____1__string__alternateLayoutHelper(d, value)
if size is None or data is None:
firstByte = value.split('b')[0] firstByte = value.split('b')[0]
if int(firstByte & 1) == 0: if int(firstByte & 1) == 0:
# Short/internal. # Short/internal.
@@ -784,12 +806,15 @@ def qdump__std____1__string(d, value):
data = value.address() + 1 data = value.address() + 1
else: else:
# Long/external. # Long/external.
(dummy, size, data) = value.split('ppp') (_, size, data) = value.split('ppp')
d.putCharArrayHelper(data, size, d.charType(), d.currentItemFormat()) d.putCharArrayHelper(data, size, d.charType(), d.currentItemFormat())
d.putType("std::string") d.putType("std::string")
def qdump__std____1__wstring(d, value): def qdump__std____1__wstring(d, value):
(size, data) = qdump__std____1__string__alternateLayoutHelper(d, value)
if size is None or data is None:
firstByte = value.split('b')[0] firstByte = value.split('b')[0]
if int(firstByte & 1) == 0: if int(firstByte & 1) == 0:
# Short/internal. # Short/internal.
@@ -797,7 +822,8 @@ def qdump__std____1__wstring(d, value):
data = value.address() + 4 data = value.address() + 4
else: else:
# Long/external. # Long/external.
(dummy, size, data) = value.split('ppp') (_, size, data) = value.split('ppp')
d.putCharArrayHelper(data, size, d.createType('wchar_t')) d.putCharArrayHelper(data, size, d.createType('wchar_t'))
d.putType("std::wstring") d.putType("std::wstring")