From 2422251ee5025a067b14b989153764ab36e43f10 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 20 Jun 2015 12:58:10 +0200 Subject: qdoc: don't hold QQmlJS::AST::SourceLocation in QLists QQmlJS::AST::SourceLocation wasn't marked as movable, and it is larger than void*, so QList is horribly inefficient. Fix by marking as movable primitive and holding in QVector instead. The same fix probably is required in QtDeclarative, too. Change-Id: I4e0d2cd32b7e03205d59cbc9900287f77045154a Reviewed-by: Martin Smith --- src/tools/qdoc/jscodemarker.cpp | 4 +-- src/tools/qdoc/qmlcodemarker.cpp | 6 ++-- src/tools/qdoc/qmlcodemarker.h | 2 +- src/tools/qdoc/qmlmarkupvisitor.cpp | 4 +-- src/tools/qdoc/qmlmarkupvisitor.h | 4 +-- src/tools/qdoc/qmlparser/qqmljsastfwd_p.h | 45 +++++++++++++++-------------- src/tools/qdoc/qmlparser/qqmljsengine_p.cpp | 2 +- src/tools/qdoc/qmlparser/qqmljsengine_p.h | 6 ++-- src/tools/qdoc/qmlvisitor.cpp | 2 +- 9 files changed, 39 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/tools/qdoc/jscodemarker.cpp b/src/tools/qdoc/jscodemarker.cpp index 5373283572..f6a2c99179 100644 --- a/src/tools/qdoc/jscodemarker.cpp +++ b/src/tools/qdoc/jscodemarker.cpp @@ -68,7 +68,7 @@ bool JsCodeMarker::recognizeCode(const QString &code) QQmlJS::Parser parser(&engine); QString newCode = code; - QList pragmas = extractPragmas(newCode); + QVector pragmas = extractPragmas(newCode); lexer.setCode(newCode, 1); return parser.parseProgram(); @@ -115,7 +115,7 @@ QString JsCodeMarker::addMarkUp(const QString &code, QQmlJS::Lexer lexer(&engine); QString newCode = code; - QList pragmas = extractPragmas(newCode); + QVector pragmas = extractPragmas(newCode); lexer.setCode(newCode, 1); QQmlJS::Parser parser(&engine); diff --git a/src/tools/qdoc/qmlcodemarker.cpp b/src/tools/qdoc/qmlcodemarker.cpp index 17067bebe6..cfb5e16b44 100644 --- a/src/tools/qdoc/qmlcodemarker.cpp +++ b/src/tools/qdoc/qmlcodemarker.cpp @@ -166,7 +166,7 @@ QString QmlCodeMarker::addMarkUp(const QString &code, QQmlJS::Lexer lexer(&engine); QString newCode = code; - QList pragmas = extractPragmas(newCode); + QVector pragmas = extractPragmas(newCode); lexer.setCode(newCode, 1); QQmlJS::Parser parser(&engine); @@ -209,11 +209,11 @@ static void replaceWithSpace(QString &str, int idx, int n) Searches for ".pragma " or ".import " declarations in \a script. Currently supported pragmas are: library */ -QList QmlCodeMarker::extractPragmas(QString &script) +QVector QmlCodeMarker::extractPragmas(QString &script) { const QString pragma(QLatin1String("pragma")); const QString library(QLatin1String("library")); - QList removed; + QVector removed; QQmlJS::Lexer l(0); l.setCode(script, 0); diff --git a/src/tools/qdoc/qmlcodemarker.h b/src/tools/qdoc/qmlcodemarker.h index dabb0d8233..b3ec03965f 100644 --- a/src/tools/qdoc/qmlcodemarker.h +++ b/src/tools/qdoc/qmlcodemarker.h @@ -66,7 +66,7 @@ public: virtual QString functionEndRegExp(const QString &funcName) Q_DECL_OVERRIDE; /* Copied from src/declarative/qml/qdeclarativescriptparser.cpp */ - QList extractPragmas(QString &script); + QVector extractPragmas(QString &script); private: QString addMarkUp(const QString &code, const Node *relative, diff --git a/src/tools/qdoc/qmlmarkupvisitor.cpp b/src/tools/qdoc/qmlmarkupvisitor.cpp index 735dea548d..3a7635778e 100644 --- a/src/tools/qdoc/qmlmarkupvisitor.cpp +++ b/src/tools/qdoc/qmlmarkupvisitor.cpp @@ -42,7 +42,7 @@ QT_BEGIN_NAMESPACE QmlMarkupVisitor::QmlMarkupVisitor(const QString &source, - const QList &pragmas, + const QVector &pragmas, QQmlJS::Engine *engine) { this->source = source; @@ -54,7 +54,7 @@ QmlMarkupVisitor::QmlMarkupVisitor(const QString &source, // Merge the lists of locations of pragmas and comments in the source code. int i = 0; int j = 0; - const QList comments = engine->comments(); + const QVector comments = engine->comments(); while (i < comments.size() && j < pragmas.length()) { if (comments[i].offset < pragmas[j].offset) { extraTypes.append(Comment); diff --git a/src/tools/qdoc/qmlmarkupvisitor.h b/src/tools/qdoc/qmlmarkupvisitor.h index 04d6a57564..34d18d6868 100644 --- a/src/tools/qdoc/qmlmarkupvisitor.h +++ b/src/tools/qdoc/qmlmarkupvisitor.h @@ -50,7 +50,7 @@ public: }; QmlMarkupVisitor(const QString &code, - const QList &pragmas, + const QVector &pragmas, QQmlJS::Engine *engine); virtual ~QmlMarkupVisitor(); @@ -158,7 +158,7 @@ private: QQmlJS::Engine *engine; QList extraTypes; - QList extraLocations; + QVector extraLocations; QString source; QString output; quint32 cursor; diff --git a/src/tools/qdoc/qmlparser/qqmljsastfwd_p.h b/src/tools/qdoc/qmlparser/qqmljsastfwd_p.h index eae4125ab2..bfaa4401d2 100644 --- a/src/tools/qdoc/qmlparser/qqmljsastfwd_p.h +++ b/src/tools/qdoc/qmlparser/qqmljsastfwd_p.h @@ -37,6 +37,7 @@ #include "qqmljsglobal_p.h" #include +#include // // W A R N I N G @@ -53,27 +54,6 @@ QT_QML_BEGIN_NAMESPACE namespace QQmlJS { namespace AST { -class SourceLocation -{ -public: - explicit SourceLocation(quint32 offset = 0, quint32 length = 0, quint32 line = 0, quint32 column = 0) - : offset(offset), length(length), - startLine(line), startColumn(column) - { } - - bool isValid() const { return length != 0; } - - quint32 begin() const { return offset; } - quint32 end() const { return offset + length; } - -// attributes - // ### encode - quint32 offset; - quint32 length; - quint32 startLine; - quint32 startColumn; -}; - class Visitor; class Node; class ExpressionNode; @@ -176,8 +156,31 @@ class UiQualifiedId; class UiQualifiedPragmaId; class UiHeaderItemList; +class SourceLocation +{ +public: + explicit SourceLocation(quint32 offset = 0, quint32 length = 0, quint32 line = 0, quint32 column = 0) + : offset(offset), length(length), + startLine(line), startColumn(column) + { } + + bool isValid() const { return length != 0; } + + quint32 begin() const { return offset; } + quint32 end() const { return offset + length; } + +// attributes + // ### encode + quint32 offset; + quint32 length; + quint32 startLine; + quint32 startColumn; +}; + } } // namespace AST +Q_DECLARE_TYPEINFO(QQmlJS::AST::SourceLocation, Q_PRIMITIVE_TYPE); + QT_QML_END_NAMESPACE #endif diff --git a/src/tools/qdoc/qmlparser/qqmljsengine_p.cpp b/src/tools/qdoc/qmlparser/qqmljsengine_p.cpp index 4e13051730..2a949b630c 100644 --- a/src/tools/qdoc/qmlparser/qqmljsengine_p.cpp +++ b/src/tools/qdoc/qmlparser/qqmljsengine_p.cpp @@ -125,7 +125,7 @@ void Engine::setCode(const QString &code) void Engine::addComment(int pos, int len, int line, int col) { if (len > 0) _comments.append(QQmlJS::AST::SourceLocation(pos, len, line, col)); } -QList Engine::comments() const +QVector Engine::comments() const { return _comments; } Lexer *Engine::lexer() const diff --git a/src/tools/qdoc/qmlparser/qqmljsengine_p.h b/src/tools/qdoc/qmlparser/qqmljsengine_p.h index fb65d7f028..9ab26f0d0f 100644 --- a/src/tools/qdoc/qmlparser/qqmljsengine_p.h +++ b/src/tools/qdoc/qmlparser/qqmljsengine_p.h @@ -50,7 +50,7 @@ #include "qqmljsmemorypool_p.h" #include -#include +#include QT_QML_BEGIN_NAMESPACE @@ -87,7 +87,7 @@ class QML_PARSER_EXPORT Engine Lexer *_lexer; Directives *_directives; MemoryPool _pool; - QList _comments; + QVector _comments; QString _extraCode; QString _code; @@ -99,7 +99,7 @@ public: const QString &code() const { return _code; } void addComment(int pos, int len, int line, int col); - QList comments() const; + QVector comments() const; Lexer *lexer() const; void setLexer(Lexer *lexer); diff --git a/src/tools/qdoc/qmlvisitor.cpp b/src/tools/qdoc/qmlvisitor.cpp index a2091f44b5..1468683052 100644 --- a/src/tools/qdoc/qmlvisitor.cpp +++ b/src/tools/qdoc/qmlvisitor.cpp @@ -119,7 +119,7 @@ QmlDocVisitor::~QmlDocVisitor() */ QQmlJS::AST::SourceLocation QmlDocVisitor::precedingComment(quint32 offset) const { - QListIterator it(engine->comments()); + QVectorIterator it(engine->comments()); it.toBack(); while (it.hasPrevious()) { -- cgit v1.2.3