forked from qt-creator/qt-creator
Debugger: Use QVarLengthArray for local buffer
Change-Id: I1bca338e0ffb850ca23bf5e1d1cd2fb85227ddda Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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); }
|
||||||
|
Reference in New Issue
Block a user