forked from qt-creator/qt-creator
Debugger: Fix assignment to QString etc with LLDB
Task-number: QTCREATORBUG-21353 Change-Id: Ie3655738c249240d9fbf17e054fc8f79a284efd4 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -1741,13 +1741,39 @@ class Dumper(DumperBase):
|
|||||||
value = frame.FindVariable(exp)
|
value = frame.FindVariable(exp)
|
||||||
return value
|
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):
|
def assignValue(self, args):
|
||||||
self.reportToken(args)
|
self.reportToken(args)
|
||||||
error = lldb.SBError()
|
error = lldb.SBError()
|
||||||
exp = self.hexdecode(args['exp'])
|
expr = self.hexdecode(args['expr'])
|
||||||
value = self.hexdecode(args['value'])
|
value = self.hexdecode(args['value'])
|
||||||
lhs = self.findValueByExpression(exp)
|
simpleType = int(args['simpleType'])
|
||||||
lhs.SetValueFromCString(value, error)
|
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)
|
self.reportResult(self.describeError(error), args)
|
||||||
|
|
||||||
def watchPoint(self, args):
|
def watchPoint(self, args):
|
||||||
|
|||||||
@@ -705,12 +705,14 @@ void LldbEngine::fetchStack(int limit)
|
|||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void LldbEngine::assignValueInDebugger(WatchItem *,
|
void LldbEngine::assignValueInDebugger(WatchItem *item,
|
||||||
const QString &expression, const QVariant &value)
|
const QString &expression, const QVariant &value)
|
||||||
{
|
{
|
||||||
DebuggerCommand cmd("assignValue");
|
DebuggerCommand cmd("assignValue");
|
||||||
cmd.arg("exp", toHex(expression));
|
cmd.arg("expr", toHex(expression));
|
||||||
cmd.arg("value", toHex(value.toString()));
|
cmd.arg("value", toHex(value.toString()));
|
||||||
|
cmd.arg("type", toHex(item->type));
|
||||||
|
cmd.arg("simpleType", isIntOrFloatType(item->type));
|
||||||
cmd.callback = [this](const DebuggerResponse &) { updateLocals(); };
|
cmd.callback = [this](const DebuggerResponse &) { updateLocals(); };
|
||||||
runCommand(cmd);
|
runCommand(cmd);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user