QXmlStreamReader: port Value::prefix from int to qint16

The prefix is a part of a name, the length of which is bounded to 4k
in fastScanName(), so qint16 suffices.

The length field also shouldn't stay int, but that's a different
patch, because it's just a relative offset to pos, and so isn't as
easily overflown.

This shrinks the Value struct a tiny bit; created QTBUG-103306 to
track ideas to shrink it further.

Pick-to: 6.3 6.2
Task-number: QTBUG-102465
Change-Id: I579815e72501a091360f55e750af63cb4dc5a5a7
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Marc Mutz 2022-05-06 09:35:42 +02:00
parent 61c83dfb22
commit dffba486d1
2 changed files with 5 additions and 5 deletions

View File

@ -1279,14 +1279,14 @@ inline int QXmlStreamReaderPrivate::fastScanContentCharList()
return n; return n;
} }
inline int QXmlStreamReaderPrivate::fastScanName(int *prefix) inline int QXmlStreamReaderPrivate::fastScanName(qint16 *prefix)
{ {
int n = 0; int n = 0;
uint c; uint c;
while ((c = getChar()) != StreamEOF) { while ((c = getChar()) != StreamEOF) {
if (n >= 4096) { if (n >= 4096) {
// This is too long to be a sensible name, and // This is too long to be a sensible name, and
// can exhaust memory // can exhaust memory, or the range of decltype(*prefix)
return 0; return 0;
} }
switch (c) { switch (c) {
@ -1325,7 +1325,7 @@ inline int QXmlStreamReaderPrivate::fastScanName(int *prefix)
case ':': case ':':
if (prefix) { if (prefix) {
if (*prefix == 0) { if (*prefix == 0) {
*prefix = n+2; *prefix = qint16(n + 2);
} else { // only one colon allowed according to the namespace spec. } else { // only one colon allowed according to the namespace spec.
putChar(c); putChar(c);
return n; return n;

View File

@ -411,7 +411,7 @@ public:
struct Value { struct Value {
qsizetype pos; // offset into textBuffer qsizetype pos; // offset into textBuffer
int len; int len;
int prefix; qint16 prefix; // prefix of a name (as in "prefix:name") limited to 4k in fastScanName()
ushort c; ushort c;
}; };
@ -507,7 +507,7 @@ public:
int fastScanLiteralContent(); int fastScanLiteralContent();
int fastScanSpace(); int fastScanSpace();
int fastScanContentCharList(); int fastScanContentCharList();
int fastScanName(int *prefix = nullptr); int fastScanName(qint16 *prefix = nullptr);
inline int fastScanNMTOKEN(); inline int fastScanNMTOKEN();