Debugger: Use QVarLengthArray for local buffer

Change-Id: I1bca338e0ffb850ca23bf5e1d1cd2fb85227ddda
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2023-02-24 11:06:54 +01:00
parent a1e9670541
commit f53f006301
2 changed files with 37 additions and 28 deletions

View File

@@ -105,7 +105,7 @@ void GdbMi::parseResultOrValue(DebuggerOutputParser &parser)
} }
// Reads one \ooo entity. // Reads one \ooo entity.
static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, QByteArray &buffer) static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer)
{ {
if (parser.remainingChars() < 4) if (parser.remainingChars() < 4)
return false; return false;
@@ -121,7 +121,7 @@ static bool parseOctalEscapedHelper(DebuggerOutputParser &parser, QByteArray &bu
return true; return true;
} }
static bool parseHexEscapedHelper(DebuggerOutputParser &parser, QByteArray &buffer) static bool parseHexEscapedHelper(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer)
{ {
if (parser.remainingChars() < 4) if (parser.remainingChars() < 4)
return false; return false;
@@ -138,7 +138,7 @@ static bool parseHexEscapedHelper(DebuggerOutputParser &parser, QByteArray &buff
return true; return true;
} }
static void parseSimpleEscape(DebuggerOutputParser &parser, QByteArray &result) static void parseSimpleEscape(DebuggerOutputParser &parser, DebuggerOutputParser::Buffer &buffer)
{ {
if (parser.isAtEnd()) { if (parser.isAtEnd()) {
qDebug() << "MI Parse Error, unterminated backslash escape"; qDebug() << "MI Parse Error, unterminated backslash escape";
@@ -148,60 +148,64 @@ static void parseSimpleEscape(DebuggerOutputParser &parser, QByteArray &result)
const QChar c = parser.current(); const QChar c = parser.current();
parser.advance(); parser.advance();
switch (c.unicode()) { switch (c.unicode()) {
case 'a': result += '\a'; break; case 'a': buffer += '\a'; break;
case 'b': result += '\b'; break; case 'b': buffer += '\b'; break;
case 'f': result += '\f'; break; case 'f': buffer += '\f'; break;
case 'n': result += '\n'; break; case 'n': buffer += '\n'; break;
case 'r': result += '\r'; break; case 'r': buffer += '\r'; break;
case 't': result += '\t'; break; case 't': buffer += '\t'; break;
case 'v': result += '\v'; break; case 'v': buffer += '\v'; break;
case '"': result += '"'; break; case '"': buffer += '"'; break;
case '\'': result += '\''; break; case '\'': buffer += '\''; break;
case '\\': result += '\\'; break; case '\\': buffer += '\\'; break;
default: default:
qDebug() << "MI Parse Error, unrecognized backslash escape"; qDebug() << "MI Parse Error, unrecognized backslash escape";
} }
} }
// Reads one \123 or \x12 entity, *or* one escaped char, *or* one unescaped char. // 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 (parser.isCurrent('\\')) {
if (parseOctalEscapedHelper(parser, result)) if (parseOctalEscapedHelper(parser, buffer))
return; return;
if (parseHexEscapedHelper(parser, result)) if (parseHexEscapedHelper(parser, buffer))
return; return;
parser.advance(); parser.advance();
parseSimpleEscape(parser, result); parseSimpleEscape(parser, buffer);
} else { } else {
result += char(parser.readChar().unicode()); buffer += char(parser.readChar().unicode());
} }
} }
QString DebuggerOutputParser::readCString() void DebuggerOutputParser::readCStringData(Buffer &buffer)
{ {
if (isAtEnd()) if (isAtEnd())
return QString(); return;
if (*from != '"') { if (*from != '"') {
qDebug() << "MI Parse Error, double quote expected"; qDebug() << "MI Parse Error, double quote expected";
++from; // So we don't hang ++from; // So we don't hang
return QString(); return;
} }
++from; // Skip initial quote. ++from; // Skip initial quote.
QByteArray result;
result.reserve(30);
while (from < to) { while (from < to) {
if (*from == '"') { if (*from == '"') {
++from; ++from;
return QString::fromUtf8(result); return;
} }
parseCharOrEscape(*this, result); parseCharOrEscape(*this, buffer);
} }
qDebug() << "MI Parse Error, unfinished string"; qDebug() << "MI Parse Error, unfinished string";
return QString(); }
QString DebuggerOutputParser::readCString()
{
Buffer buffer;
readCStringData(buffer);
return QString::fromUtf8(buffer);
} }
void GdbMi::parseValue(DebuggerOutputParser &parser) void GdbMi::parseValue(DebuggerOutputParser &parser)

View File

@@ -8,6 +8,7 @@
#include <QString> #include <QString>
#include <QJsonValue> #include <QJsonValue>
#include <QJsonObject> #include <QJsonObject>
#include <QVarLengthArray>
#include <QVector> #include <QVector>
#include <utils/filepath.h> #include <utils/filepath.h>
@@ -105,6 +106,8 @@ class DebuggerOutputParser
public: public:
explicit DebuggerOutputParser(const QString &output); explicit DebuggerOutputParser(const QString &output);
using Buffer = QVarLengthArray<char, 30>;
QChar current() const { return *from; } QChar current() const { return *from; }
bool isCurrent(QChar c) const { return *from == c; } bool isCurrent(QChar c) const { return *from == c; }
bool isAtEnd() const { return from >= to; } bool isAtEnd() const { return from >= to; }
@@ -116,6 +119,8 @@ public:
int readInt(); int readInt();
QChar readChar(); QChar readChar();
QString readCString(); QString readCString();
void readCStringData(Buffer &buffer);
QStringView 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); }