summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@qt.io>2018-11-15 09:04:39 +0100
committerChristian Stenger <christian.stenger@qt.io>2018-11-19 14:22:45 +0000
commit84576d30986fc896a8171001f2d11905db2ac32d (patch)
treef7e53f0edc652a17abf3599b82b44323a0193e0b /share
parent3a5e67a3d46f9d0244263ef84399149ff39290e3 (diff)
downloadqt-creator-84576d30986fc896a8171001f2d11905db2ac32d.tar.gz
Dumper: Fix displaying enums with LLDB
Prioritize displaying as enum if a type is known to be an enum. Otherwise this would just end up get displayed as string representation of its value. Enable respective dumper tests. Change-Id: I3e5406e14a68f02741b6144bb54528b72cc8192d Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'share')
-rw-r--r--share/qtcreator/debugger/dumper.py4
-rw-r--r--share/qtcreator/debugger/gdbbridge.py2
-rw-r--r--share/qtcreator/debugger/lldbbridge.py27
3 files changed, 24 insertions, 9 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py
index 6446131608..80eaa318bd 100644
--- a/share/qtcreator/debugger/dumper.py
+++ b/share/qtcreator/debugger/dumper.py
@@ -2944,8 +2944,6 @@ class DumperBase:
return str(simple)
if self.ldisplay is not None:
return self.ldisplay
- if self.type.code == TypeCodeEnum:
- return self.displayEnum()
#if self.ldata is not None:
# if sys.version_info[0] == 2 and isinstance(self.ldata, buffer):
# return bytes(self.ldata).encode('hex')
@@ -3020,6 +3018,8 @@ class DumperBase:
def value(self):
if self.type is not None:
+ if self.type.code == TypeCodeEnum:
+ return self.displayEnum()
if self.type.code == TypeCodeTypedef:
return self.detypedef().value()
if self.type.code == TypeCodeIntegral:
diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py
index 75cb512c68..cdde71b3ff 100644
--- a/share/qtcreator/debugger/gdbbridge.py
+++ b/share/qtcreator/debugger/gdbbridge.py
@@ -409,7 +409,7 @@ class Dumper(DumperBase):
if not found or v != 0:
# Leftover value
flags.append('unknown: %d' % v)
- return " | ".join(flags) + ' (' + (form % intval) + ')'
+ return '(' + " | ".join(flags) + ') (' + (form % intval) + ')'
except:
pass
return form % intval
diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py
index e50efacfe7..a3b46a413e 100644
--- a/share/qtcreator/debugger/lldbbridge.py
+++ b/share/qtcreator/debugger/lldbbridge.py
@@ -531,14 +531,29 @@ class Dumper(DumperBase):
def nativeTypeEnumDisplay(self, nativeType, intval, form):
if hasattr(nativeType, 'get_enum_members_array'):
+ enumerators = []
+ flags = []
+ found = False
for enumMember in nativeType.get_enum_members_array():
# Even when asking for signed we get unsigned with LLDB 3.8.
- diff = enumMember.GetValueAsSigned() - intval
- mask = (1 << nativeType.GetByteSize() * 8) - 1
- if diff & mask == 0:
- path = nativeType.GetName().split('::')
- path[-1] = enumMember.GetName()
- return '::'.join(path) + ' (' + (form % intval) + ')'
+ value = enumMember.GetValueAsSigned()
+ name = nativeType.GetName().split('::')
+ name[-1] = enumMember.GetName()
+ if value == intval:
+ return '::'.join(name) + ' (' + (form % intval) + ')'
+ enumerators.append(('::'.join(name), value))
+
+ given = intval
+ for (name, value) in enumerators:
+ if value & given != 0:
+ flags.append(name)
+ given = given & ~value
+ found = True
+
+ if not found or given != 0:
+ flags.append('unknown: %d' % given)
+
+ return '(' + ' | '.join(flags) + ') (' + (form % intval) + ')'
return form % intval
def nativeDynamicTypeName(self, address, baseType):