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 {
};
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>();
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;
{
}
+// Returns length in utf8 bytes
int QDeclarativeParser::Object::DynamicSignal::parameterTypesLength() const
{
int rv = 0;
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;
}
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;
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;
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);