diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index e028f54e46ff1445518d9c9c00f7a870278804e4..6de1c2891d1a7d61bddcbd1c0b18b27aa1b0bd9b 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -420,7 +420,7 @@ class LocalItem: ####################################################################### def bbedit(args): - theDumper.bbedit(args.split(",")) + theDumper.bbedit(args) registerCommand("bbedit", bbedit) @@ -706,7 +706,8 @@ class Dumper(DumperBase): if type.find(":") >= 0: type = "'" + type + "'" # 'class' is needed, see http://sourceware.org/bugzilla/show_bug.cgi?id=11912 - exp = "((class %s*)%s)->%s(%s)" % (type, value.address, func, arg) + #exp = "((class %s*)%s)->%s(%s)" % (type, value.address, func, arg) + exp = "((%s*)%s)->%s(%s)" % (type, value.address, func, arg) #warn("CALL: %s" % exp) result = None try: @@ -903,6 +904,15 @@ class Dumper(DumperBase): # Try _some_ fallback (good enough for the std::complex dumper) return gdb.parse_and_eval("{%s}%s" % (referencedType, address)) + def setValue(self, address, type, value): + cmd = "set {%s}%s=%s" % (type, address, value) + gdb.execute(cmd) + + def setValues(self, address, type, values): + cmd = "set {%s[%s]}%s={%s}" \ + % (type, len(values), address, ','.join(map(str, values))) + gdb.execute(cmd) + def selectedInferior(self): try: # gdb.Inferior is new in gdb 7.2 @@ -1659,22 +1669,25 @@ class Dumper(DumperBase): return namespace - def bbedit(self, type, expr, value): - type = b16decode(type) + def bbedit(self, args): + (typeName, expr, data) = args.split(',') + typeName = b16decode(typeName) ns = self.qtNamespace() - if type.startswith(ns): - type = type[len(ns):] - type = type.replace("::", "__") - pos = type.find('<') + if typeName.startswith(ns): + typeName = typeName[len(ns):] + typeName = typeName.replace("::", "__") + pos = typeName.find('<') if pos != -1: - type = type[0:pos] + typeName = typeName[0:pos] expr = b16decode(expr) - value = b16decode(value) - #warn("EDIT: %s %s %s %s: " % (pos, type, expr, value)) - if self.qqEditable.has_key(type): - self.qqEditable[type](expr, value) + data = b16decode(data) + if typeName in self.qqEditable: + #self.qqEditable[typeName](self, expr, data) + value = gdb.parse_and_eval(expr) + self.qqEditable[typeName](self, value, data) else: - gdb.execute("set (%s)=%s" % (expr, value)) + cmd = "set variable (%s)=%s" % (expr, data) + gdb.execute(cmd) def hasVTable(self, type): fields = type.fields() diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index fba8d299874102662743578f271912a87ff6a87d..06676b2632e056aca690ceb61fec751d6f1b7962 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -1640,17 +1640,10 @@ def qdump__QStandardItem(d, value): d.putPlainChildren(value) -def qedit__QString(expr, value): - cmd = "call (%s).resize(%d)" % (expr, len(value)) - gdb.execute(cmd) - d = gdb.parse_and_eval(expr)["d"]["data"] - cmd = "set {short[%d]}%s={" % (len(value), d.pointerValue(d)) - for i in range(len(value)): - if i != 0: - cmd += ',' - cmd += str(ord(value[i])) - cmd += '}' - gdb.execute(cmd) +def qedit__QString(d, value, data): + d.call(value, "resize", str(len(data))) + (base, size, alloc) = d.stringData(value) + d.setValues(base, "short", [ord(c) for c in data]) def qform__QString(): return "Inline,Separate Window" @@ -1976,15 +1969,19 @@ def qdump__QVariant(d, value): return tdata.type -def qedit__QVector(expr, value): - values = value.split(',') - ob = gdb.parse_and_eval(expr) - cmd = "call (%s).resize(%d)" % (expr, len(values)) - gdb.execute(cmd) - innerType = d.templateArgument(ob.type, 0) - ptr = ob["p"]["array"].cast(d.voidPtrType()) - cmd = "set {%s[%d]}%s={%s}" % (innerType, len(values), d.pointerValue(ptr), value) - gdb.execute(cmd) +def qedit__QVector(d, value, data): + values = data.split(',') + size = len(values) + d.call(value, "resize", str(size)) + innerType = d.templateArgument(value.type, 0) + try: + # Qt 5. Will fail on Qt 4 due to the missing 'offset' member. + offset = value["d"]["offset"] + base = d.pointerValue(value["d"].cast(d.charPtrType()) + offset) + except: + # Qt 4. + base = d.pointerValue(value["p"]["array"]) + d.setValues(base, innerType, values) def qform__QVector(): diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 0438585f4ca8ed4366ef757899a9539ae285d629..588187e494a1859fe86f5ab01b44ac7388248d99 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -497,16 +497,16 @@ def qdump__std____debug__unordered_set(d, value): qdump__std__unordered_set(d, value) -def qedit__std__vector(expr, value): - values = value.split(',') +def qedit__std__vector(d, value, data): + import gdb + values = data.split(',') n = len(values) - ob = gdb.parse_and_eval(expr) - innerType = d.templateArgument(ob.type, 0) + innerType = d.templateArgument(value.type, 0) cmd = "set $d = (%s*)calloc(sizeof(%s)*%s,1)" % (innerType, innerType, n) gdb.execute(cmd) - cmd = "set {void*[3]}%s = {$d, $d+%s, $d+%s}" % (ob.address, n, n) + cmd = "set {void*[3]}%s = {$d, $d+%s, $d+%s}" % (value.address, n, n) gdb.execute(cmd) - cmd = "set (%s[%d])*$d={%s}" % (innerType, n, value) + cmd = "set (%s[%d])*$d={%s}" % (innerType, n, data) gdb.execute(cmd) def qdump__std__vector(d, value): @@ -566,12 +566,11 @@ def qdump__std____1__vector(d, value): def qdump__std____debug__vector(d, value): qdump__std__vector(d, value) -def qedit__std__string(expr, value): - cmd = "print (%s).assign(\"%s\")" % (expr, value) - gdb.execute(cmd) +def qedit__std__string(d, value, data): + d.call(value, "assign", '"%s"' % data.replace('"', '\\"')) -def qedit__string(expr, value): - qedit__std__string(expr, value) +def qedit__string(d, expr, value): + qedit__std__string(d, expr, value) def qdump__string(d, value): qdump__std__string(d, value)