Reduce allocations
authorAaron Kennedy <aaron.kennedy@nokia.com>
Fri, 22 Jul 2011 04:40:37 +0000 (14:40 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 30 Aug 2011 11:18:28 +0000 (13:18 +0200)
Change-Id: I230424147ad195239d725359fcd6dc5568f102a7
Reviewed-on: http://codereview.qt.nokia.com/3772
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>

src/declarative/qml/ftw/qdeclarativepool_p.h
src/declarative/qml/qdeclarativecompiler.cpp
src/declarative/qml/qdeclarativeparser.cpp
src/declarative/qml/qdeclarativeparser_p.h
src/declarative/qml/qdeclarativescriptparser.cpp

index af3bb1e..8935046 100644 (file)
@@ -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>();
index 2025774..6874c2a 100644 (file)
@@ -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;
index 6a78598..c5c1e10 100644 (file)
@@ -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;
 }
 
index aa1efb4..ee7927f 100644 (file)
@@ -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;
index 7cca388..748f2d7 100644 (file)
@@ -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);