aboutsummaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2019-01-07 13:24:12 +0100
committerEike Ziller <eike.ziller@qt.io>2019-01-07 13:24:12 +0100
commit04a4bacbf91974874b7743d82956842bc4b7cbcd (patch)
tree091e27ce8fb601b36b6b82837f281ac70439ca55 /share
parent9ee785a4efc0ddbf1edf705de690955a97e0a34b (diff)
parentbcafe202c9f8a7c4bad4cf60095138b1d6cbf2ac (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.py8
-rw-r--r--share/qtcreator/debugger/dumper.py52
-rw-r--r--share/qtcreator/debugger/gdbbridge.py10
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)