From 81b1a6b14758f3c3c7372430f937817603b0802d Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Thu, 17 Dec 2009 11:10:44 +1000 Subject: Share common strings --- src/declarative/qml/qmlbindingvme.cpp | 43 ++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/declarative/qml/qmlbindingvme.cpp b/src/declarative/qml/qmlbindingvme.cpp index 5abcdb8..7d2ebf2 100644 --- a/src/declarative/qml/qmlbindingvme.cpp +++ b/src/declarative/qml/qmlbindingvme.cpp @@ -254,9 +254,7 @@ struct QmlBindingCompilerPrivate QSet subscriptionSet; }; - QmlBindingCompilerPrivate() : registers(0), strings(0) { - committed.strings = 0; - } + QmlBindingCompilerPrivate() : registers(0) {} void resetInstanceState(); int commitCompile(); @@ -299,7 +297,7 @@ struct QmlBindingCompilerPrivate void releaseReg(int); int registerString(const QString &); - int strings; + QHash > registeredStrings; QByteArray data; bool subscription(const QStringList &, Result *); @@ -318,9 +316,10 @@ struct QmlBindingCompilerPrivate QVector bytecode; QByteArray data; - int strings; QHash subscriptionIds; + QHash > registeredStrings; + int count() const { return offsets.count(); } } committed; @@ -1003,11 +1002,11 @@ void QmlBindingCompilerPrivate::resetInstanceState() { registers = 0; registerCleanups.clear(); - strings = committed.strings; data = committed.data; usedSubscriptionIds.clear(); subscriptionSet.clear(); subscriptionIds = committed.subscriptionIds; + registeredStrings = committed.registeredStrings; bytecode.clear(); } @@ -1024,8 +1023,8 @@ int QmlBindingCompilerPrivate::commitCompile() committed.dependencies << usedSubscriptionIds; committed.bytecode << bytecode; committed.data = data; - committed.strings = strings; committed.subscriptionIds = subscriptionIds; + committed.registeredStrings = registeredStrings; return rv; } @@ -1038,11 +1037,9 @@ bool QmlBindingCompilerPrivate::compile(QmlJS::AST::Node *node) if (!parseExpression(node, type)) return false; - if (subscriptionSet.count() || strings) { - if (subscriptionSet.count() > 0xFFFF || - strings > 0xFFFF) - return false; - } + if (subscriptionSet.count() > 0xFFFF || + registeredStrings.count() > 0xFFFF) + return false; if (type.unknownType) { if (destination->type != QMetaType::QReal && @@ -1798,19 +1795,23 @@ int QmlBindingCompilerPrivate::registerString(const QString &string) { Q_ASSERT(!string.isEmpty()); - // ### Padding? - QByteArray strdata((const char *)string.constData(), string.length() * sizeof(QChar)); - int rv = data.count(); - data += strdata; + QHash >::ConstIterator iter = registeredStrings.find(string); + + if (iter == registeredStrings.end()) { + QByteArray strdata((const char *)string.constData(), string.length() * sizeof(QChar)); + int rv = data.count(); + data += strdata; + + iter = registeredStrings.insert(string, qMakePair(registeredStrings.count(), rv)); + } Instr reg; reg.type = Instr::InitString; - reg.initstring.offset = strings++; - reg.initstring.dataIdx = rv; + reg.initstring.offset = iter->first; + reg.initstring.dataIdx = iter->second; reg.initstring.length = string.length(); bytecode << reg; - - return strings - 1; + return reg.initstring.offset; } bool QmlBindingCompilerPrivate::subscription(const QStringList &sub, Result *result) @@ -1950,7 +1951,7 @@ QByteArray QmlBindingCompiler::program() const prog.dataLength = 4 * ((data.size() + 3) / 4); prog.subscriptions = d->committed.subscriptionIds.count(); - prog.identifiers = d->committed.strings; + prog.identifiers = d->committed.registeredStrings.count(); int size = sizeof(Program) + bytecode.count() * sizeof(Instr); size += prog.dataLength; -- cgit v0.12