Debugger: Check type cache before creating array/pointer type

Change-Id: I334c8d9a7ae365f28a8b070b0ccef943b5db3c59
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2017-02-27 12:36:48 +01:00
parent de1cd79546
commit 327341b917

View File

@@ -140,32 +140,33 @@ class Dumper(DumperBase):
def fromNativeType(self, nativeType): def fromNativeType(self, nativeType):
self.check(isinstance(nativeType, cdbext.Type)) self.check(isinstance(nativeType, cdbext.Type))
code = nativeType.code() typeId = self.nativeTypeId(nativeType)
if self.typeData.get(typeId, None) is not None:
return self.Type(self, typeId)
if nativeType.name().startswith('void'): if nativeType.name().startswith('void'):
nativeType = FakeVoidType(nativeType.name(), self) nativeType = FakeVoidType(nativeType.name(), self)
code = nativeType.code()
if code == TypeCodePointer: if code == TypeCodePointer:
return self.createPointerType(self.lookupType(nativeType.targetName(), nativeType.moduleId())) return self.createPointerType(self.lookupType(nativeType.targetName(), nativeType.moduleId()))
if code == TypeCodeArray: if code == TypeCodeArray:
return self.createArrayType(self.lookupType(nativeType.targetName(), nativeType.moduleId()), nativeType.arrayElements()) return self.createArrayType(self.lookupType(nativeType.targetName(), nativeType.moduleId()), nativeType.arrayElements())
typeId = self.nativeTypeId(nativeType) tdata = self.TypeData(self)
if self.typeData.get(typeId, None) is None: tdata.name = nativeType.name()
tdata = self.TypeData(self) tdata.typeId = typeId
tdata.name = nativeType.name() tdata.lbitsize = nativeType.bitsize()
tdata.typeId = typeId tdata.code = code
tdata.lbitsize = nativeType.bitsize() self.registerType(typeId, tdata) # Prevent recursion in fields.
tdata.code = code if code == TypeCodeStruct:
self.registerType(typeId, tdata) # Prevent recursion in fields. tdata.lfields = lambda value : \
if code == TypeCodeStruct: self.listFields(nativeType, value)
tdata.lfields = lambda value : \ tdata.lalignment = lambda : \
self.listFields(nativeType, value) self.nativeStructAlignment(nativeType)
tdata.lalignment = lambda : \ tdata.templateArguments = self.listTemplateParameters(nativeType.name())
self.nativeStructAlignment(nativeType) self.registerType(typeId, tdata) # Fix up fields and template args
tdata.templateArguments = self.listTemplateParameters(nativeType.name())
self.registerType(typeId, tdata) # Fix up fields and template args
return self.Type(self, typeId) return self.Type(self, typeId)
def listFields(self, nativeType, value): def listFields(self, nativeType, value):