diff options
author | Christian Stenger <christian.stenger@qt.io> | 2018-11-15 09:04:39 +0100 |
---|---|---|
committer | Christian Stenger <christian.stenger@qt.io> | 2018-11-19 14:22:45 +0000 |
commit | 84576d30986fc896a8171001f2d11905db2ac32d (patch) | |
tree | f7e53f0edc652a17abf3599b82b44323a0193e0b /share | |
parent | 3a5e67a3d46f9d0244263ef84399149ff39290e3 (diff) | |
download | qt-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.py | 4 | ||||
-rw-r--r-- | share/qtcreator/debugger/gdbbridge.py | 2 | ||||
-rw-r--r-- | share/qtcreator/debugger/lldbbridge.py | 27 |
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): |