diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 33acd441761..cd523ed8ffd 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -1741,13 +1741,39 @@ class Dumper(DumperBase): value = frame.FindVariable(exp) return value + def setValue(self, address, typename, value): + sbtype = self.lookupNativeType(typename) + error = lldb.SBError() + sbaddr = lldb.SBAddress(address, self.target) + sbvalue = self.target.CreateValueFromAddress('x', sbaddr, sbtype) + sbvalue.SetValueFromCString(str(value), error) + + def setValues(self, address, typename, values): + sbtype = self.lookupNativeType(typename) + sizeof = sbtype.GetByteSize() + error = lldb.SBError() + for i in range(len(values)): + sbaddr = lldb.SBAddress(address + i * sizeof, self.target) + sbvalue = self.target.CreateValueFromAddress('x', sbaddr, sbtype) + sbvalue.SetValueFromCString(str(values[i]), error) + def assignValue(self, args): self.reportToken(args) error = lldb.SBError() - exp = self.hexdecode(args['exp']) + expr = self.hexdecode(args['expr']) value = self.hexdecode(args['value']) - lhs = self.findValueByExpression(exp) - lhs.SetValueFromCString(value, error) + simpleType = int(args['simpleType']) + lhs = self.findValueByExpression(expr) + typeName = lhs.GetType().GetName() + typeName = typeName.replace('::', '__') + pos = typeName.find('<') + if pos != -1: + typeName = typeName[0:pos] + if typeName in self.qqEditable and not simpleType: + expr = self.parseAndEvaluate(expr) + self.qqEditable[typeName](self, expr, value) + else: + lhs.SetValueFromCString(value, error) self.reportResult(self.describeError(error), args) def watchPoint(self, args): diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 124e001b7d0..70daef5ac5d 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -705,12 +705,14 @@ void LldbEngine::fetchStack(int limit) // ////////////////////////////////////////////////////////////////////// -void LldbEngine::assignValueInDebugger(WatchItem *, +void LldbEngine::assignValueInDebugger(WatchItem *item, const QString &expression, const QVariant &value) { DebuggerCommand cmd("assignValue"); - cmd.arg("exp", toHex(expression)); + cmd.arg("expr", toHex(expression)); cmd.arg("value", toHex(value.toString())); + cmd.arg("type", toHex(item->type)); + cmd.arg("simpleType", isIntOrFloatType(item->type)); cmd.callback = [this](const DebuggerResponse &) { updateLocals(); }; runCommand(cmd); }