QmlJS: Do not change strings referenced by QStringView

QStringRef is stable under reallocations of it's string()),
while QStringView is not.

This adds the missing changes from qtdeclarative 1b10ce6a08e.

Task-number: QDS-2825
Change-Id: I120a34153424ea514abaa783f1a617ef2f8b4cf4
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Thomas Hartmann
2020-09-23 13:55:18 +02:00
parent 0ab97e1159
commit f1c9f8e628
2 changed files with 11 additions and 10 deletions

View File

@@ -133,13 +133,14 @@ MemoryPool *Engine::pool()
QStringView Engine::newStringRef(const QString &text) QStringView Engine::newStringRef(const QString &text)
{ {
const int pos = _extraCode.length(); _extraCode.append(text);
_extraCode += text; return QStringView{_extraCode.last()};
return Utils::midView(_extraCode, pos, text.length());
} }
QStringView Engine::newStringRef(const QChar *chars, int size) QStringView Engine::newStringRef(const QChar *chars, int size)
{ return newStringRef(QString(chars, size)); } {
return newStringRef(QString(chars, size));
}
} // end of namespace QmlJS } // end of namespace QmlJS

View File

@@ -37,14 +37,16 @@
// //
#include "qmljsglobal_p.h" #include "qmljsglobal_p.h"
#include "qmljs/parser/qmljssourcelocation_p.h"
#include "qmljs/parser/qmljsmemorypool_p.h" #include "qmljs/parser/qmljsmemorypool_p.h"
#include "qmljs/parser/qmljssourcelocation_p.h"
#include <qmljs/qmljsconstants.h>
#include <utils/porting.h>
#include <QString> #include <QString>
#include <QSet> #include <QSet>
#include <qmljs/qmljsconstants.h>
QT_QML_BEGIN_NAMESPACE QT_QML_BEGIN_NAMESPACE
namespace QmlJS { namespace QmlJS {
@@ -84,7 +86,7 @@ class QML_PARSER_EXPORT Engine
Directives *_directives; Directives *_directives;
MemoryPool _pool; MemoryPool _pool;
QList<SourceLocation> _comments; QList<SourceLocation> _comments;
QString _extraCode; QStringList _extraCode;
QString _code; QString _code;
public: public:
@@ -107,9 +109,7 @@ public:
inline QStringView midRef(int position, int size) inline QStringView midRef(int position, int size)
{ {
if (position + size > _code.size()) return Utils::midView(_code, position, size);
return QStringView(_code).mid(position);
return QStringView(_code).mid(position, size);
} }
QStringView newStringRef(const QString &s); QStringView newStringRef(const QString &s);