aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-07-22 14:40:37 +1000
committerQt by Nokia <qt-info@nokia.com>2011-08-30 13:18:28 +0200
commit7d397be0cb6ae8f90d07903ff061d1600af15cb8 (patch)
treee60362571da377229300cdf0a3e4c7b1b78a8d14 /src
parentf11e06cc9ac730bd3a06b6ed86e62b1e11064841 (diff)
Reduce allocations
Change-Id: I230424147ad195239d725359fcd6dc5568f102a7 Reviewed-on: http://codereview.qt.nokia.com/3772 Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src')
-rw-r--r--src/declarative/qml/ftw/qdeclarativepool_p.h40
-rw-r--r--src/declarative/qml/qdeclarativecompiler.cpp4
-rw-r--r--src/declarative/qml/qdeclarativeparser.cpp4
-rw-r--r--src/declarative/qml/qdeclarativeparser_p.h6
-rw-r--r--src/declarative/qml/qdeclarativescriptparser.cpp15
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 af3bb1e040..8935046cc3 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<typename T>
+ 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<typename T>
+ inline List<T> 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<typename T>
+QDeclarativePool::List<T> QDeclarativePool::NewRawList(int length)
+{
+ return List<T>(NewRawArray<T>(length), length);
+}
+
QString *QDeclarativePool::NewString(const QString &s)
{
QString *rv = New<StringClass>();
diff --git a/src/declarative/qml/qdeclarativecompiler.cpp b/src/declarative/qml/qdeclarativecompiler.cpp
index 2025774c4e..6874c2a415 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 6a78598317..c5c1e104c8 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 aa1efb4363..ee7927fa76 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<QHashedCStringRef> parameterTypes;
- QList<QByteArray> parameterNames;
+ QDeclarativePool::List<QHashedCStringRef> parameterTypes;
+ QDeclarativePool::List<QHashedStringRef> parameterNames;
int parameterTypesLength() const;
int parameterNamesLength() const;
diff --git a/src/declarative/qml/qdeclarativescriptparser.cpp b/src/declarative/qml/qdeclarativescriptparser.cpp
index 7cca38836e..748f2d7123 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<QHashedCStringRef>(paramLength);
+ signal->parameterNames = _parser->_pool.NewRawList<QHashedStringRef>(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);