From f53f006301c1a4e241bfb9867615f087adc3b32e Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 24 Feb 2023 11:06:54 +0100 Subject: [PATCH] Debugger: Use QVarLengthArray for local buffer Change-Id: I1bca338e0ffb850ca23bf5e1d1cd2fb85227ddda Reviewed-by: David Schulz --- src/plugins/debugger/debuggerprotocol.cpp | 60 ++++++++++++----------- src/plugins/debugger/debuggerprotocol.h | 5 ++ 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/src/plugins/debugger/debuggerprotocol.cpp b/src/plugins/debugger/debuggerprotocol.cpp index 301949f822d..8ab7a71b339 100644 --- a/src/plugins/debugger/debuggerprotocol.cpp +++ b/src/plugins/debugger/debuggerprotocol.cpp @@ -105,7 +105,7 @@ void GdbMi::parseResultOrValue(DebuggerOutputParser &parser) } // Reads one \ooo entity. -static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, QByteArray &buffer) +static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer) { if (parser.remainingChars() < 4) return false; @@ -121,7 +121,7 @@ static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, QByteArray &bu return true; } -static bool parseHexEscapedHelper(DebuggerOutputParser &parser, QByteArray &buffer) +static bool parseHexEscapedHelper(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer) { if (parser.remainingChars() < 4) return false; @@ -138,7 +138,7 @@ static bool parseHexEscapedHelper(DebuggerOutputParser &parser, QByteArray &buff return true; } -static void parseSimpleEscape(DebuggerOutputParser &parser, QByteArray &result) +static void parseSimpleEscape(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer) { if (parser.isAtEnd()) { qDebug() << "MI Parse Error, unterminated backslash escape"; @@ -148,60 +148,64 @@ static void parseSimpleEscape(DebuggerOutputParser &parser, QByteArray &result) const QChar c = parser.current(); parser.advance(); switch (c.unicode()) { - case 'a': result += '\a'; break; - case 'b': result += '\b'; break; - case 'f': result += '\f'; break; - case 'n': result += '\n'; break; - case 'r': result += '\r'; break; - case 't': result += '\t'; break; - case 'v': result += '\v'; break; - case '"': result += '"'; break; - case '\'': result += '\''; break; - case '\\': result += '\\'; break; - default: - qDebug() << "MI Parse Error, unrecognized backslash escape"; + case 'a': buffer += '\a'; break; + case 'b': buffer += '\b'; break; + case 'f': buffer += '\f'; break; + case 'n': buffer += '\n'; break; + case 'r': buffer += '\r'; break; + case 't': buffer += '\t'; break; + case 'v': buffer += '\v'; break; + case '"': buffer += '"'; break; + case '\'': buffer += '\''; break; + case '\\': buffer += '\\'; break; + default: + qDebug() << "MI Parse Error, unrecognized backslash escape"; } } // Reads one \123 or \x12 entity, *or* one escaped char, *or* one unescaped char. -static void parseCharOrEscape(DebuggerOutputParser &parser, QByteArray &result) +static void parseCharOrEscape(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer) { if (parser.isCurrent('\\')) { - if (parseOctalEscapedHelper(parser, result)) + if (parseOctalEscapedHelper(parser, buffer)) return; - if (parseHexEscapedHelper(parser, result)) + if (parseHexEscapedHelper(parser, buffer)) return; parser.advance(); - parseSimpleEscape(parser, result); + parseSimpleEscape(parser, buffer); } else { - result += char(parser.readChar().unicode()); + buffer += char(parser.readChar().unicode()); } } -QString DebuggerOutputParser::readCString() +void DebuggerOutputParser::readCStringData(Buffer &buffer) { if (isAtEnd()) - return QString(); + return; if (*from != '"') { qDebug() << "MI Parse Error, double quote expected"; ++from; // So we don't hang - return QString(); + return; } ++from; // Skip initial quote. - QByteArray result; - result.reserve(30); while (from < to) { if (*from == '"') { ++from; - return QString::fromUtf8(result); + return; } - parseCharOrEscape(*this, result); + parseCharOrEscape(*this, buffer); } qDebug() << "MI Parse Error, unfinished string"; - return QString(); +} + +QString DebuggerOutputParser::readCString() +{ + Buffer buffer; + readCStringData(buffer); + return QString::fromUtf8(buffer); } void GdbMi::parseValue(DebuggerOutputParser &parser) diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index 3bfd9c951b9..d06a95c7367 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -105,6 +106,8 @@ class DebuggerOutputParser public: explicit DebuggerOutputParser(const QString &output); + using Buffer = QVarLengthArray; + QChar current() const { return *from; } bool isCurrent(QChar c) const { return *from == c; } bool isAtEnd() const { return from >= to; } @@ -116,6 +119,8 @@ public: int readInt(); QChar readChar(); QString readCString(); + void readCStringData(Buffer &buffer); + QStringView readString(const std::function &isValidChar); QStringView buffer() const { return QStringView(from, to - from); }