From 7d397be0cb6ae8f90d07903ff061d1600af15cb8 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Fri, 22 Jul 2011 14:40:37 +1000 Subject: [PATCH] Reduce allocations Change-Id: I230424147ad195239d725359fcd6dc5568f102a7 Reviewed-on: http://codereview.qt.nokia.com/3772 Reviewed-by: Roberto Raggi --- src/declarative/qml/ftw/qdeclarativepool_p.h | 40 ++++++++++++++++++++++ src/declarative/qml/qdeclarativecompiler.cpp | 4 +- src/declarative/qml/qdeclarativeparser.cpp | 4 ++- src/declarative/qml/qdeclarativeparser_p.h | 6 ++-- src/declarative/qml/qdeclarativescriptparser.cpp | 15 +++++++- 5 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/declarative/qml/ftw/qdeclarativepool_p.h b/src/declarative/qml/ftw/qdeclarativepool_p.h index af3bb1e..8935046 100644 --- a/src/declarative/qml/ftw/qdeclarativepool_p.h +++ b/src/declarative/qml/ftw/qdeclarativepool_p.h @@ -105,6 +105,40 @@ public: inline QString *NewString(const QString &); inline QByteArray *NewByteArray(const QByteArray &); + template + struct List { + List() : m_length(0), m_data(0) {} + List(const List &o) : m_length(o.m_length), m_data(o.m_data) {} + List &operator=(const List &o) { + m_length = o.m_length; + m_data = o.m_data; + return *this; + } + + int count() const { + return m_length; + } + int length() const { + return m_length; + } + const T &at(int index) const { + Q_ASSERT(index < m_length); + return m_data[index]; + }; + T &operator[](int index) { + Q_ASSERT(index < m_length); + return m_data[index]; + }; + private: + friend class QDeclarativePool; + List(T *d, int l) : m_length(l), m_data(d) {} + int m_length; + T *m_data; + }; + + template + inline List NewRawList(int length); + private: struct StringClass : public QString, public Class { }; @@ -167,6 +201,12 @@ T *QDeclarativePool::NewRawArray(int length) return (T*)allocate(length * sizeof(T)); } +template +QDeclarativePool::List QDeclarativePool::NewRawList(int length) +{ + return List(NewRawArray(length), length); +} + QString *QDeclarativePool::NewString(const QString &s) { QString *rv = New(); diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp index 2025774..6874c2a 100644 --- a/src/declarative/qml/qdeclarativecompiler.cpp +++ b/src/declarative/qml/qdeclarativecompiler.cpp @@ -2827,8 +2827,8 @@ bool QDeclarativeCompiler::buildDynamicMeta(QDeclarativeParser::Object *obj, Dyn if (jj != 0) { *d++ = ','; *d2++ = ','; } strcpy(d, s->parameterTypes.at(jj).constData()); d += s->parameterTypes.at(jj).length(); - strcpy(d2, s->parameterNames.at(jj).constData()); - d2 += s->parameterNames.at(jj).length(); + s->parameterNames.at(jj).writeUtf8(d2); + d2 += s->parameterNames.at(jj).utf8length(); } *d++ = ')'; *d = 0; diff --git a/src/declarative/qml/qdeclarativeparser.cpp b/src/declarative/qml/qdeclarativeparser.cpp index 6a78598..c5c1e10 100644 --- a/src/declarative/qml/qdeclarativeparser.cpp +++ b/src/declarative/qml/qdeclarativeparser.cpp @@ -194,6 +194,7 @@ QDeclarativeParser::Object::DynamicSignal::DynamicSignal() { } +// Returns length in utf8 bytes int QDeclarativeParser::Object::DynamicSignal::parameterTypesLength() const { int rv = 0; @@ -202,11 +203,12 @@ int QDeclarativeParser::Object::DynamicSignal::parameterTypesLength() const return rv; } +// Returns length in utf8 bytes int QDeclarativeParser::Object::DynamicSignal::parameterNamesLength() const { int rv = 0; for (int ii = 0; ii < parameterNames.count(); ++ii) - rv += parameterNames.at(ii).length(); + rv += parameterNames.at(ii).utf8length(); return rv; } diff --git a/src/declarative/qml/qdeclarativeparser_p.h b/src/declarative/qml/qdeclarativeparser_p.h index aa1efb4..ee7927f 100644 --- a/src/declarative/qml/qdeclarativeparser_p.h +++ b/src/declarative/qml/qdeclarativeparser_p.h @@ -393,13 +393,13 @@ namespace QDeclarativeParser QFastMetaBuilder::StringRef changedSignatureRef; }; - struct DynamicSignal : public QDeclarativePool::Class + struct DynamicSignal : public QDeclarativePool::POD { DynamicSignal(); QHashedStringRef name; - QList parameterTypes; - QList parameterNames; + QDeclarativePool::List parameterTypes; + QDeclarativePool::List parameterNames; int parameterTypesLength() const; int parameterNamesLength() const; diff --git a/src/declarative/qml/qdeclarativescriptparser.cpp b/src/declarative/qml/qdeclarativescriptparser.cpp index 7cca388..748f2d7 100644 --- a/src/declarative/qml/qdeclarativescriptparser.cpp +++ b/src/declarative/qml/qdeclarativescriptparser.cpp @@ -543,6 +543,16 @@ bool ProcessAST::visit(AST::UiPublicMember *node) signal->name = node->name; AST::UiParameterList *p = node->parameters; + int paramLength = 0; + while (p) { paramLength++; p = p->finish(); } + p = node->parameters; + + if (paramLength) { + signal->parameterTypes = _parser->_pool.NewRawList(paramLength); + signal->parameterNames = _parser->_pool.NewRawList(paramLength); + } + + int index = 0; while (p) { const QStringRef &memberType = p->type; @@ -565,9 +575,10 @@ bool ProcessAST::visit(AST::UiPublicMember *node) return false; } - signal->parameterTypes << QHashedCStringRef(type->qtName, type->qtNameLength); - signal->parameterNames << p->name.toUtf8(); + signal->parameterTypes[index] = QHashedCStringRef(type->qtName, type->qtNameLength); + signal->parameterNames[index] = QHashedStringRef(p->name); p = p->finish(); + index++; } signal.location = location(node->typeToken, node->semicolonToken); -- 1.7.2.5