Debugger: Save a few string allocations on result parsing

Change-Id: I5b7614bd22d41f826b4977621d77a9aeba7f961f
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
hjk
2023-02-24 07:53:51 +01:00
parent 5b0a177cdf
commit 801eb712ba
4 changed files with 32 additions and 32 deletions

View File

@@ -47,12 +47,12 @@ void DebuggerOutputParser::skipSpaces()
++from; ++from;
} }
QString DebuggerOutputParser::readString(const std::function<bool(char)> &isValidChar) QStringView DebuggerOutputParser::readString(const std::function<bool(char)> &isValidChar)
{ {
QString res; const QChar *oldFrom = from;
while (from < to && isValidChar(from->unicode())) while (from < to && isValidChar(from->unicode()))
res += *from++; ++from;
return res; return {oldFrom, from};
} }
int DebuggerOutputParser::readInt() int DebuggerOutputParser::readInt()
@@ -96,7 +96,7 @@ void GdbMi::parseResultOrValue(DebuggerOutputParser &parser)
return; return;
} }
m_name = parser.readString(isNameChar); m_name = parser.readString(isNameChar).toString();
if (!parser.isAtEnd() && parser.isCurrent('=')) { if (!parser.isAtEnd() && parser.isCurrent('=')) {
parser.advance(); parser.advance();

View File

@@ -116,7 +116,7 @@ public:
int readInt(); int readInt();
QChar readChar(); QChar readChar();
QString readCString(); QString readCString();
QString readString(const std::function<bool(char)> &isValidChar); QStringView readString(const std::function<bool(char)> &isValidChar);
QStringView buffer() const { return QStringView(from, to - from); } QStringView buffer() const { return QStringView(from, to - from); }
int remainingChars() const { return int(to - from); } int remainingChars() const { return int(to - from); }

View File

@@ -246,7 +246,7 @@ void GdbEngine::handleResponse(const QString &buff)
case '*': case '*':
case '+': case '+':
case '=': { case '=': {
const QString asyncClass = parser.readString(isNameChar); const QStringView asyncClass = parser.readString(isNameChar);
GdbMi result; GdbMi result;
while (!parser.isAtEnd()) { while (!parser.isAtEnd()) {
GdbMi data; GdbMi data;
@@ -365,17 +365,17 @@ void GdbEngine::handleResponse(const QString &buff)
response.token = token; response.token = token;
QString resultClass = parser.readString(isNameChar); const QStringView resultClass = parser.readString(isNameChar);
if (resultClass == "done") if (resultClass == u"done")
response.resultClass = ResultDone; response.resultClass = ResultDone;
else if (resultClass == "running") else if (resultClass == u"running")
response.resultClass = ResultRunning; response.resultClass = ResultRunning;
else if (resultClass == "connected") else if (resultClass == u"connected")
response.resultClass = ResultConnected; response.resultClass = ResultConnected;
else if (resultClass == "error") else if (resultClass == u"error")
response.resultClass = ResultError; response.resultClass = ResultError;
else if (resultClass == "exit") else if (resultClass == u"exit")
response.resultClass = ResultExit; response.resultClass = ResultExit;
else else
response.resultClass = ResultUnknown; response.resultClass = ResultUnknown;
@@ -412,9 +412,9 @@ void GdbEngine::handleResponse(const QString &buff)
} }
} }
void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result) void GdbEngine::handleAsyncOutput(const QStringView asyncClass, const GdbMi &result)
{ {
if (asyncClass == "stopped") { if (asyncClass == u"stopped") {
if (m_inUpdateLocals) { if (m_inUpdateLocals) {
showMessage("UNEXPECTED *stopped NOTIFICATION IGNORED", LogWarning); showMessage("UNEXPECTED *stopped NOTIFICATION IGNORED", LogWarning);
} else { } else {
@@ -422,7 +422,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
m_pendingLogStreamOutput.clear(); m_pendingLogStreamOutput.clear();
m_pendingConsoleStreamOutput.clear(); m_pendingConsoleStreamOutput.clear();
} }
} else if (asyncClass == "running") { } else if (asyncClass == u"running") {
if (m_inUpdateLocals) { if (m_inUpdateLocals) {
showMessage("UNEXPECTED *running NOTIFICATION IGNORED", LogWarning); showMessage("UNEXPECTED *running NOTIFICATION IGNORED", LogWarning);
} else { } else {
@@ -443,7 +443,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
notifyInferiorRunOk(); notifyInferiorRunOk();
} }
} }
} else if (asyncClass == "library-loaded") { } else if (asyncClass == u"library-loaded") {
// Archer has 'id="/usr/lib/libdrm.so.2", // Archer has 'id="/usr/lib/libdrm.so.2",
// target-name="/usr/lib/libdrm.so.2", // target-name="/usr/lib/libdrm.so.2",
// host-name="/usr/lib/libdrm.so.2", // host-name="/usr/lib/libdrm.so.2",
@@ -464,7 +464,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
module.modulePath = result["target-name"].data(); module.modulePath = result["target-name"].data();
module.moduleName = QFileInfo(module.hostPath).baseName(); module.moduleName = QFileInfo(module.hostPath).baseName();
modulesHandler()->updateModule(module); modulesHandler()->updateModule(module);
} else if (asyncClass == "library-unloaded") { } else if (asyncClass == u"library-unloaded") {
// Archer has 'id="/usr/lib/libdrm.so.2", // Archer has 'id="/usr/lib/libdrm.so.2",
// target-name="/usr/lib/libdrm.so.2", // target-name="/usr/lib/libdrm.so.2",
// host-name="/usr/lib/libdrm.so.2" // host-name="/usr/lib/libdrm.so.2"
@@ -472,9 +472,9 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
modulesHandler()->removeModule(result["target-name"].data()); modulesHandler()->removeModule(result["target-name"].data());
progressPing(); progressPing();
showStatusMessage(Tr::tr("Library %1 unloaded.").arg(id), 1000); showStatusMessage(Tr::tr("Library %1 unloaded.").arg(id), 1000);
} else if (asyncClass == "thread-group-added") { } else if (asyncClass == u"thread-group-added") {
// 7.1-symbianelf has "{id="i1"}" // 7.1-symbianelf has "{id="i1"}"
} else if (asyncClass == "thread-group-started") { } else if (asyncClass == u"thread-group-started") {
// Archer had only "{id="28902"}" at some point of 6.8.x. // Archer had only "{id="28902"}" at some point of 6.8.x.
// *-started seems to be standard in 7.1, but in early // *-started seems to be standard in 7.1, but in early
// 7.0.x, there was a *-created instead. // 7.0.x, there was a *-created instead.
@@ -484,7 +484,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
showStatusMessage(Tr::tr("Thread group %1 created.").arg(id), 1000); showStatusMessage(Tr::tr("Thread group %1 created.").arg(id), 1000);
notifyInferiorPid(result["pid"].toProcessHandle()); notifyInferiorPid(result["pid"].toProcessHandle());
handleThreadGroupCreated(result); handleThreadGroupCreated(result);
} else if (asyncClass == "thread-created") { } else if (asyncClass == u"thread-created") {
//"{id="1",group-id="28902"}" //"{id="1",group-id="28902"}"
QString id = result["id"].data(); QString id = result["id"].data();
showStatusMessage(Tr::tr("Thread %1 created.").arg(id), 1000); showStatusMessage(Tr::tr("Thread %1 created.").arg(id), 1000);
@@ -492,23 +492,23 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
thread.id = id; thread.id = id;
thread.groupId = result["group-id"].data(); thread.groupId = result["group-id"].data();
threadsHandler()->updateThread(thread); threadsHandler()->updateThread(thread);
} else if (asyncClass == "thread-group-exited") { } else if (asyncClass == u"thread-group-exited") {
// Archer has "{id="28902"}" // Archer has "{id="28902"}"
QString id = result["id"].data(); QString id = result["id"].data();
showStatusMessage(Tr::tr("Thread group %1 exited.").arg(id), 1000); showStatusMessage(Tr::tr("Thread group %1 exited.").arg(id), 1000);
handleThreadGroupExited(result); handleThreadGroupExited(result);
} else if (asyncClass == "thread-exited") { } else if (asyncClass == u"thread-exited") {
//"{id="1",group-id="28902"}" //"{id="1",group-id="28902"}"
QString id = result["id"].data(); QString id = result["id"].data();
QString groupid = result["group-id"].data(); QString groupid = result["group-id"].data();
showStatusMessage(Tr::tr("Thread %1 in group %2 exited.") showStatusMessage(Tr::tr("Thread %1 in group %2 exited.")
.arg(id).arg(groupid), 1000); .arg(id).arg(groupid), 1000);
threadsHandler()->removeThread(id); threadsHandler()->removeThread(id);
} else if (asyncClass == "thread-selected") { } else if (asyncClass == u"thread-selected") {
QString id = result["id"].data(); QString id = result["id"].data();
showStatusMessage(Tr::tr("Thread %1 selected.").arg(id), 1000); showStatusMessage(Tr::tr("Thread %1 selected.").arg(id), 1000);
//"{id="2"}" //"{id="2"}"
} else if (asyncClass == "breakpoint-modified") { } else if (asyncClass == u"breakpoint-modified") {
// New in FSF gdb since 2011-04-27. // New in FSF gdb since 2011-04-27.
// "{bkpt={number="3",type="breakpoint",disp="keep", // "{bkpt={number="3",type="breakpoint",disp="keep",
// enabled="y",addr="<MULTIPLE>",times="1", // enabled="y",addr="<MULTIPLE>",times="1",
@@ -547,7 +547,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
} }
if (bp) if (bp)
bp->adjustMarker(); bp->adjustMarker();
} else if (asyncClass == "breakpoint-created") { } else if (asyncClass == u"breakpoint-created") {
// "{bkpt={number="1",type="breakpoint",disp="del",enabled="y", // "{bkpt={number="1",type="breakpoint",disp="del",enabled="y",
// addr="<PENDING>",pending="main",times="0", // addr="<PENDING>",pending="main",times="0",
// original-location="main"}}" -- or -- // original-location="main"}}" -- or --
@@ -561,7 +561,7 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
br.updateFromGdbOutput(bkpt); br.updateFromGdbOutput(bkpt);
handler->handleAlienBreakpoint(nr, br); handler->handleAlienBreakpoint(nr, br);
} }
} else if (asyncClass == "breakpoint-deleted") { } else if (asyncClass == u"breakpoint-deleted") {
// "breakpoint-deleted" "{id="1"}" // "breakpoint-deleted" "{id="1"}"
// New in FSF gdb since 2011-04-27. // New in FSF gdb since 2011-04-27.
const QString nr = result["id"].data(); const QString nr = result["id"].data();
@@ -571,15 +571,15 @@ void GdbEngine::handleAsyncOutput(const QString &asyncClass, const GdbMi &result
// if (!bp.isOneShot()) ... is not sufficient. // if (!bp.isOneShot()) ... is not sufficient.
// It keeps temporary "Jump" breakpoints alive. // It keeps temporary "Jump" breakpoints alive.
breakHandler()->removeAlienBreakpoint(nr); breakHandler()->removeAlienBreakpoint(nr);
} else if (asyncClass == "cmd-param-changed") { } else if (asyncClass == u"cmd-param-changed") {
// New since 2012-08-09 // New since 2012-08-09
// "{param="debug remote",value="1"}" // "{param="debug remote",value="1"}"
} else if (asyncClass == "memory-changed") { } else if (asyncClass == u"memory-changed") {
// New since 2013 // New since 2013
// "{thread-group="i1",addr="0x0918a7a8",len="0x10"}" // "{thread-group="i1",addr="0x0918a7a8",len="0x10"}"
} else if (asyncClass == "tsv-created") { } else if (asyncClass == u"tsv-created") {
// New since 2013-02-06 // New since 2013-02-06
} else if (asyncClass == "tsv-modified") { } else if (asyncClass == u"tsv-modified") {
// New since 2013-02-06 // New since 2013-02-06
} else { } else {
qDebug() << "IGNORED ASYNC OUTPUT" qDebug() << "IGNORED ASYNC OUTPUT"

View File

@@ -134,7 +134,7 @@ private: ////////// General Interface //////////
////////// Gdb Output, State & Capability Handling ////////// ////////// Gdb Output, State & Capability Handling //////////
Q_INVOKABLE void handleResponse(const QString &buff); Q_INVOKABLE void handleResponse(const QString &buff);
void handleAsyncOutput(const QString &asyncClass, const GdbMi &result); void handleAsyncOutput(const QStringView asyncClass, const GdbMi &result);
void handleStopResponse(const GdbMi &data); void handleStopResponse(const GdbMi &data);
void handleResultRecord(DebuggerResponse *response); void handleResultRecord(DebuggerResponse *response);
void handleStop1(const GdbMi &data); void handleStop1(const GdbMi &data);