forked from qt-creator/qt-creator
Debugger: Robustify typedef member lookup
Some code path did not resolve typedefs when looking up struct members by name, making e.g. the BoostList dumper fail for LLDB. Change-Id: I7adf235cff3941574cab9f03d6f15ec5f3e2f0bd Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -2759,6 +2759,20 @@ class DumperBase:
|
|||||||
self.targetValue = None # For references.
|
self.targetValue = None # For references.
|
||||||
self.isBaseClass = None
|
self.isBaseClass = None
|
||||||
|
|
||||||
|
def copy(self):
|
||||||
|
val = self.dumper.Value(self.dumper)
|
||||||
|
val.dumper = self.dumper
|
||||||
|
val.name = self.name
|
||||||
|
val.type = self.type
|
||||||
|
val.ldata = self.ldata
|
||||||
|
val.laddress = self.laddress
|
||||||
|
val.lIsInScope = self.lIsInScope
|
||||||
|
val.ldisplay = self.ldisplay
|
||||||
|
val.lbitpos = self.lbitpos
|
||||||
|
val.lbitsize = self.lbitsize
|
||||||
|
val.targetValue = self.targetValue
|
||||||
|
return val
|
||||||
|
|
||||||
def check(self):
|
def check(self):
|
||||||
if self.laddress is not None and not self.dumper.isInt(self.laddress):
|
if self.laddress is not None and not self.dumper.isInt(self.laddress):
|
||||||
error('INCONSISTENT ADDRESS: %s' % type(self.laddress))
|
error('INCONSISTENT ADDRESS: %s' % type(self.laddress))
|
||||||
@@ -2848,12 +2862,18 @@ class DumperBase:
|
|||||||
members = self.members(True)
|
members = self.members(True)
|
||||||
for member in members:
|
for member in members:
|
||||||
#warn('CHECKING FIELD %s' % member.name)
|
#warn('CHECKING FIELD %s' % member.name)
|
||||||
|
if member.type.code == TypeCodeTypedef:
|
||||||
|
member = member.detypedef()
|
||||||
if member.name == name:
|
if member.name == name:
|
||||||
return member
|
return member
|
||||||
for member in members:
|
for member in members:
|
||||||
#warn('CHECKING BASE %s' % member.name)
|
#warn('CHECKING BASE %s' % member.name)
|
||||||
#if member.name == name:
|
#if member.name == name:
|
||||||
# return member
|
# return member
|
||||||
|
if member.type.code == TypeCodeTypedef:
|
||||||
|
member = member.detypedef()
|
||||||
|
if member.name == name:
|
||||||
|
return member
|
||||||
if member.type.code == TypeCodeStruct:
|
if member.type.code == TypeCodeStruct:
|
||||||
res = member.findMemberByName(name)
|
res = member.findMemberByName(name)
|
||||||
if res is not None:
|
if res is not None:
|
||||||
@@ -2979,6 +2999,9 @@ class DumperBase:
|
|||||||
res = []
|
res = []
|
||||||
anonNumber = 0
|
anonNumber = 0
|
||||||
for field in fields:
|
for field in fields:
|
||||||
|
if isinstance(field, self.dumper.Value):
|
||||||
|
res.append(field)
|
||||||
|
continue
|
||||||
if field.isBaseClass and not includeBases:
|
if field.isBaseClass and not includeBases:
|
||||||
continue
|
continue
|
||||||
if field.name is None or len(field.name) == 0:
|
if field.name is None or len(field.name) == 0:
|
||||||
@@ -3029,10 +3052,8 @@ class DumperBase:
|
|||||||
self.check()
|
self.check()
|
||||||
if self.type.code != TypeCodeTypedef:
|
if self.type.code != TypeCodeTypedef:
|
||||||
error("WRONG")
|
error("WRONG")
|
||||||
val = self.dumper.Value(self.dumper)
|
val = self.copy()
|
||||||
val.type = self.type.ltarget
|
val.type = self.type.ltarget
|
||||||
val.ldata = self.ldata
|
|
||||||
val.laddress = self.laddress
|
|
||||||
#warn("DETYPEDEF FROM: %s" % self)
|
#warn("DETYPEDEF FROM: %s" % self)
|
||||||
#warn("DETYPEDEF TO: %s" % val)
|
#warn("DETYPEDEF TO: %s" % val)
|
||||||
return val
|
return val
|
||||||
|
Reference in New Issue
Block a user