diff options
author | hjk <hjk@qt.io> | 2018-03-21 17:10:24 +0100 |
---|---|---|
committer | hjk <hjk@qt.io> | 2018-03-22 08:45:57 +0000 |
commit | a8a23110bf23fd74244a9da13b41c1dd56b351ce (patch) | |
tree | 2324febb39a9e1b4f4d38c2b4802a77221c55850 /share | |
parent | f88dc5fd589e54d9127a6b313a2167ae655dd3d0 (diff) |
Debugger: Fix enum dumper
Make the hex display work with LLDB, fix GDB and LLDB test.
Change-Id: I529b5cdc908dbcba7270bc4574fa59a012fcacad
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'share')
-rw-r--r-- | share/qtcreator/debugger/cdbbridge.py | 6 | ||||
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 25 | ||||
-rw-r--r-- | share/qtcreator/debugger/gdbbridge.py | 20 | ||||
-rw-r--r-- | share/qtcreator/debugger/lldbbridge.py | 10 | ||||
-rw-r--r-- | share/qtcreator/debugger/qttypes.py | 6 |
5 files changed, 27 insertions, 40 deletions
diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 7897028b64..00a9130641 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -181,8 +181,8 @@ class Dumper(DumperBase): tdata.lalignment = lambda : \ self.nativeStructAlignment(nativeType) if code == TypeCodeEnum: - tdata.enumDisplay = lambda intval, addr : \ - self.nativeTypeEnumDisplay(nativeType, addr) + tdata.enumDisplay = lambda intval, addr, form : \ + self.nativeTypeEnumDisplay(nativeType, addr, form) tdata.templateArguments = self.listTemplateParameters(nativeType.name()) self.registerType(typeId, tdata) # Fix up fields and template args return self.Type(self, typeId) @@ -208,7 +208,7 @@ class Dumper(DumperBase): align = handleItem(f.type(), align) return align - def nativeTypeEnumDisplay(self, nativeType, addr): + def nativeTypeEnumDisplay(self, nativeType, addr, form): value = cdbext.createValue(addr, nativeType) if value is None: return '' diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 9fdd0228d6..503fae19c3 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -2742,13 +2742,8 @@ class DumperBase: if typeobj.code == TypeCodeBitfield: #warn('BITFIELD VALUE: %s %d %s' % (value.name, value.lvalue, typeName)) self.putNumChild(0) - if typeobj.ltarget and typeobj.ltarget.code == TypeCodeEnum: - if hasattr(typeobj.ltarget.typeData(), 'enumHexDisplay'): - self.putValue(typeobj.ltarget.typeData().enumHexDisplay(value.lvalue, value.laddress)) - else: - self.putValue(typeobj.ltarget.typeData().enumDisplay(value.lvalue, value.laddress)) - else: - self.putValue(value.lvalue) + dd = typeobj.ltarget.typeData().enumDisplay + self.putValue(str(value.lvalue) if dd is None else dd(value.lvalue, value.laddress, '%d')) self.putType(typeName) return @@ -2911,12 +2906,14 @@ class DumperBase: % (self.name, self.type.name, self.lbitsize, self.lbitpos, self.dumper.hexencode(self.ldata), addr) - def display(self, useHex = 1): - if self.type.code == TypeCodeEnum: - intval = self.integer() - if useHex and hasattr(self.type.typeData(), 'enumHexDisplay'): - return self.type.typeData().enumHexDisplay(intval, self.laddress) - return self.type.typeData().enumDisplay(intval, self.laddress) + def displayEnum(self, form='%d'): + intval = self.integer() + dd = self.type.typeData().enumDisplay + if dd is None: + return str(intval) + return dd(intval, self.laddress, form) + + def display(self): simple = self.value() if simple is not None: return str(simple) @@ -3375,7 +3372,7 @@ class DumperBase: self.code = None self.name = None self.typeId = None - self.enumDisplay = str + self.enumDisplay = None self.moduleName = None def copy(self): diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 320695a750..73f8540b1b 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -354,10 +354,8 @@ class Dumper(DumperBase): gdb.TYPE_CODE_STRING : TypeCodeFortranString, }[code] if tdata.code == TypeCodeEnum: - tdata.enumDisplay = lambda intval, addr : \ - self.nativeTypeEnumDisplay(nativeType, intval, 0) - tdata.enumHexDisplay = lambda intval, addr : \ - self.nativeTypeEnumDisplay(nativeType, intval, 1) + tdata.enumDisplay = lambda intval, addr, form : \ + self.nativeTypeEnumDisplay(nativeType, intval, form) if tdata.code == TypeCodeStruct: tdata.lalignment = lambda : \ self.nativeStructAlignment(nativeType) @@ -388,17 +386,13 @@ class Dumper(DumperBase): targs2 = self.listTemplateParametersManually(str(nativeType)) return targs if len(targs) >= len(targs2) else targs2 - def nativeTypeEnumDisplay(self, nativeType, intval, useHex): - if useHex: - format = lambda text, intval: '%s (0x%04x)' % (text, intval) - else: - format = lambda text, intval: '%s (%d)' % (text, intval) + def nativeTypeEnumDisplay(self, nativeType, intval, form): try: enumerators = [] for field in nativeType.fields(): # If we found an exact match, return it immediately if field.enumval == intval: - return format(field.name, intval) + return field.name + ' (' + (form % intval) + ')' enumerators.append((field.name, field.enumval)) # No match was found, try to return as flags @@ -414,12 +408,10 @@ class Dumper(DumperBase): if not found or v != 0: # Leftover value flags.append('unknown:%d' % v) - return format(" | ".join(flags), intval) + return " | ".join(flags) + ' (' + (form % intval) + ')' except: pass - if useHex: - return '0x%04x' % intval; - return '%d' % intval + return form % intval def nativeTypeId(self, nativeType): if nativeType and (nativeType.code == gdb.TYPE_CODE_TYPEDEF): diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index f7b9d8a0ef..21a7da4c11 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -445,8 +445,8 @@ class Dumper(DumperBase): warn('UNKNOWN TYPE KEY: %s: %s' % (typeName, code)) elif code == lldb.eTypeClassEnumeration: tdata.code = TypeCodeEnum - tdata.enumDisplay = lambda intval, addr : \ - self.nativeTypeEnumDisplay(nativeType, intval) + tdata.enumDisplay = lambda intval, addr, form : \ + self.nativeTypeEnumDisplay(nativeType, intval, form) elif code in (lldb.eTypeClassComplexInteger, lldb.eTypeClassComplexFloat): tdata.code = TypeCodeComplex elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct, lldb.eTypeClassUnion): @@ -534,7 +534,7 @@ class Dumper(DumperBase): #warn('NATIVE TYPE ID FOR %s IS %s' % (name, typeId)) return typeId - def nativeTypeEnumDisplay(self, nativeType, intval): + def nativeTypeEnumDisplay(self, nativeType, intval, form): if hasattr(nativeType, 'get_enum_members_array'): for enumMember in nativeType.get_enum_members_array(): # Even when asking for signed we get unsigned with LLDB 3.8. @@ -543,8 +543,8 @@ class Dumper(DumperBase): if diff & mask == 0: path = nativeType.GetName().split('::') path[-1] = enumMember.GetName() - return '%s (%d)' % ('::'.join(path), intval) - return '%d' % intval + return '::'.join(path) + ' (' + (form % intval) + ')' + return form % intval def nativeDynamicTypeName(self, address, baseType): return None # FIXME: Seems sufficient, no idea why. diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 221d28361d..8c6e060c3d 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -644,10 +644,8 @@ def qdump__QFiniteStack(d, value): def qdump__QFlags(d, value): i = value.split('{int}')[0] enumType = value.type[0] - if d.isGdb: - d.putValue(i.cast('enum ' + enumType.name).display(useHex = 1)) - else: - d.putValue(i.cast(enumType.name).display()) + v = i.cast(enumType.name) + d.putValue(v.displayEnum('0x%04x')) d.putNumChild(0) |