diff options
author | hjk <hjk@qt.io> | 2019-07-05 15:53:23 +0200 |
---|---|---|
committer | hjk <hjk@qt.io> | 2019-07-23 06:27:49 +0000 |
commit | 2abdc541476eb6402fce8c12ff7de609e8c6653a (patch) | |
tree | 06a3f33a8e41c6d6be0a090b79968435856c08b0 /share/qtcreator/debugger | |
parent | ea6592e9b4074fe168d861a6573c127cd49b5b29 (diff) |
Debugger: Avoid infinite loop in dumper
Change-Id: I71e89574a9eecc079b4d8e91da352fd2b7b0d9ab
Done-by: Xander (@bugreports.qt.io)
Task-number: QTCREATORBUG-22637
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'share/qtcreator/debugger')
-rw-r--r-- | share/qtcreator/debugger/dumper.py | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 586df832c0..341ceb7145 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1230,12 +1230,28 @@ class DumperBase: ns = self.qtNamespace() if len(ns) > 0 and typeName.startswith(ns): typeName = typeName[len(ns):] - pos = typeName.find('<') - # FIXME: make it recognize foo<A>::bar<B>::iterator? - while pos != -1: - pos1 = typeName.rfind('>', pos) - typeName = typeName[0:pos] + typeName[pos1+1:] - pos = typeName.find('<') + # warn( 'stripping %s' % typeName ) + lvl = 0 + pos = None + stripChunks = [] + sz = len(typeName) + for index in range(0, sz): + s = typeName[index] + if s == '<': + lvl += 1 + if lvl == 1: + pos = index + continue + elif s == '>': + lvl -= 1 + if lvl < 0 : + error("Unbalanced '<' in type, @index %d" % index) + if lvl == 0: + stripChunks.append((pos, index+1)) + if lvl != 0: + error("unbalanced at end of type name") + for (f, l) in reversed(stripChunks): + typeName = typeName[:f] + typeName[l:] return typeName def tryPutPrettyItem(self, typeName, value): |