diff options
author | Eike Ziller <eike.ziller@qt.io> | 2019-01-07 13:24:12 +0100 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2019-01-07 13:24:12 +0100 |
commit | 04a4bacbf91974874b7743d82956842bc4b7cbcd (patch) | |
tree | 091e27ce8fb601b36b6b82837f281ac70439ca55 /share | |
parent | 9ee785a4efc0ddbf1edf705de690955a97e0a34b (diff) | |
parent | bcafe202c9f8a7c4bad4cf60095138b1d6cbf2ac (diff) |
Merge remote-tracking branch 'origin/4.8'
Conflicts:
src/plugins/coreplugin/dialogs/externaltoolconfig.ui
Change-Id: Ie38e9028cee599578c59b22325d85c097335243e
Diffstat (limited to 'share')
-rw-r--r-- | share/qtcreator/debugger/cdbbridge.py | 8 | ||||
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 52 | ||||
-rw-r--r-- | share/qtcreator/debugger/gdbbridge.py | 10 |
3 files changed, 39 insertions, 31 deletions
diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index 2e7b0a073d..d4aab222bb 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -189,7 +189,7 @@ class Dumper(DumperBase): self.nativeStructAlignment(nativeType) if code == TypeCodeEnum: tdata.enumDisplay = lambda intval, addr, form : \ - self.nativeTypeEnumDisplay(nativeType, addr, form) + self.nativeTypeEnumDisplay(nativeType, intval, form) tdata.templateArguments = self.listTemplateParameters(nativeType.name()) self.registerType(typeId, tdata) # Fix up fields and template args return self.Type(self, typeId) @@ -215,11 +215,11 @@ class Dumper(DumperBase): align = handleItem(f.type(), align) return align - def nativeTypeEnumDisplay(self, nativeType, addr, form): - value = cdbext.createValue(addr, nativeType) + def nativeTypeEnumDisplay(self, nativeType, intval, form): + value = self.nativeParseAndEvaluate('(%s)%d' % (nativeType.name(), intval)) if value is None: return '' - return enumDisplay(value) + return self.enumValue(value) def enumExpression(self, enumType, enumValue): ns = self.qtNamespace() diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 1a646ab4e5..c610b112ea 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -3379,6 +3379,19 @@ class DumperBase: def type(self, typeId): return self.typeData.get(typeId) + def splitArrayType(self, type_name): + # "foo[2][3][4]" -> ("foo", "[3][4]", 2) + pos1 = len(type_name) + # In case there are more dimensions we need the inner one. + while True: + pos1 = type_name.rfind('[', 0, pos1 - 1) + pos2 = type_name.find(']', pos1) + if type_name[pos1 - 1] != ']': + break + + item_count = type_name[pos1+1:pos2] + return (type_name[0:pos1].strip(), type_name[pos2+1:].strip(), int(item_count)) + def registerType(self, typeId, tdata): #warn('REGISTER TYPE: %s' % typeId) self.typeData[typeId] = tdata @@ -3585,16 +3598,6 @@ class DumperBase: def pointer(self): return self.dumper.createPointerType(self) - def splitArrayType(self): - # -> (inner type, count) - if not self.code == TypeCodeArray: - error('Not an array') - s = self.name - pos1 = s.rfind('[') - pos2 = s.find(']', pos1) - itemCount = s[pos1+1:pos2] - return (self.dumper.createType(s[0:pos1].strip()), int(s[pos1+1:pos2])) - def target(self): return self.typeData().ltarget @@ -3613,9 +3616,6 @@ class DumperBase: def bitsize(self): if self.lbitsize is not None: return self.lbitsize - if self.code == TypeCodeArray: - (innerType, itemCount) = self.splitArrayType() - return itemCount * innerType.bitsize() error('DONT KNOW SIZE: %s' % self) def isMovableType(self): @@ -3748,14 +3748,23 @@ class DumperBase: error('Expected type in createArrayType(), got %s' % type(targetType)) targetTypeId = targetType.typeId - typeId = '%s[%d]' % (targetTypeId, count) + + if targetTypeId.endswith(']'): + (prefix, suffix, inner_count) = self.splitArrayType(targetTypeId) + type_id = '%s[%d][%d]%s' % (prefix, count, inner_count, suffix) + type_name = type_id + else: + type_id = '%s[%d]' % (targetTypeId, count) + type_name = '%s[%d]' % (targetType.name, count) + tdata = self.TypeData(self) - tdata.name = '%s[%d]' % (targetType.name, count) - tdata.typeId = typeId + tdata.name = type_name + tdata.typeId = type_id tdata.code = TypeCodeArray tdata.ltarget = targetType - self.registerType(typeId, tdata) - return self.Type(self, typeId) + tdata.lbitsize = targetType.lbitsize * count + self.registerType(type_id, tdata) + return self.Type(self, type_id) def createBitfieldType(self, targetType, bitsize): if not isinstance(targetType, self.Type): @@ -3796,13 +3805,6 @@ class DumperBase: #typish.check() return typish if isinstance(typish, str): - if typish.endswith(']') and not typish.endswith('[]'): - # Array fallback. - pos1 = typish.rfind('[') - itemType = self.createType(typish[0:pos1].strip()) - itemCount = int(typish[pos1+1:-1]) - return self.createArrayType(itemType, itemCount) - def knownSize(tn): if tn[0] == 'Q': if tn in ('QByteArray', 'QString', 'QList', 'QStringList', diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index c6e6adc55f..efa71b120c 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -247,8 +247,14 @@ class Dumper(DumperBase): if targetType.code == gdb.TYPE_CODE_ARRAY: val = self.Value(self) else: - # Cast may fail (e.g for arrays, see test for Bug5799) - val = self.fromNativeValue(nativeValue.cast(targetType)) + try: + # Cast may fail for arrays, for typedefs to __uint128_t with + # gdb.error: That operation is not available on integers + # of more than 8 bytes. + # See test for Bug5799, QTCREATORBUG-18450. + val = self.fromNativeValue(nativeValue.cast(targetType)) + except: + val = self.Value(self) #warn('CREATED TYPEDEF: %s' % val) else: val = self.Value(self) |