diff options
author | Aaron Kennedy <aaron.kennedy@nokia.com> | 2011-07-06 13:43:47 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-08-30 13:18:28 +0200 |
commit | 809ee66b67ce70dba89a04b92daccc9445af2e75 (patch) | |
tree | 84c6d4023312d72583ccfcd2ad79df4fdf714527 /src/declarative/qml/qdeclarativetypenamecache.cpp | |
parent | f8f9db6cc74a34d3648ac693196c0f5d4bda9c50 (diff) |
More efficient type name cache
Instead of creating completely separate hashes for all the types used
by every QML file, we simply link to the QDeclarativeTypeModule. This
uses much less memory, and is faster to construct at startup.
Change-Id: I28bc2807074f9c6f38096d6e4ce8be744159d023
Reviewed-on: http://codereview.qt.nokia.com/3741
Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/declarative/qml/qdeclarativetypenamecache.cpp')
-rw-r--r-- | src/declarative/qml/qdeclarativetypenamecache.cpp | 97 |
1 files changed, 69 insertions, 28 deletions
diff --git a/src/declarative/qml/qdeclarativetypenamecache.cpp b/src/declarative/qml/qdeclarativetypenamecache.cpp index 23183aa9fb..b7e4259b4c 100644 --- a/src/declarative/qml/qdeclarativetypenamecache.cpp +++ b/src/declarative/qml/qdeclarativetypenamecache.cpp @@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE QDeclarativeTypeNameCache::QDeclarativeTypeNameCache(QDeclarativeEngine *e) -: QDeclarativeCleanup(e), engine(e), m_moduleApi(0) +: QDeclarativeCleanup(e), engine(e) { } @@ -57,52 +57,93 @@ QDeclarativeTypeNameCache::~QDeclarativeTypeNameCache() void QDeclarativeTypeNameCache::clear() { - stringCache.clear(); - m_moduleApi = 0; + m_namedImports.clear(); + m_anonymousImports.clear(); engine = 0; } -void QDeclarativeTypeNameCache::add(const QString &name, int importedScriptIndex) +void QDeclarativeTypeNameCache::add(const QHashedString &name, int importedScriptIndex) { - if (stringCache.contains(name)) + if (m_namedImports.contains(name)) return; - Data data; - data.importedScriptIndex = importedScriptIndex; - stringCache.insert(name, data); + Import import; + import.scriptIndex = importedScriptIndex; + m_namedImports.insert(name, import); } -void QDeclarativeTypeNameCache::add(const QString &name, QDeclarativeType *type) +QDeclarativeTypeNameCache::Result QDeclarativeTypeNameCache::query(const QHashedStringRef &name) { - if (stringCache.contains(name)) - return; - - Data data; - data.type = type; - stringCache.insert(name, data); + Import *i = m_namedImports.value(name); + if (i) { + if (i->scriptIndex != -1) + return Result(i->scriptIndex); + else + return Result((const void *)i); + } + + for (int ii = 0; ii < m_anonymousImports.count(); ++ii) { + if (QDeclarativeType *type = m_anonymousImports.at(ii).type(name)) + return Result(type); + } + + return Result(); } -void QDeclarativeTypeNameCache::add(const QString &name, QDeclarativeTypeNameCache *typeNamespace) +QDeclarativeTypeNameCache::Result QDeclarativeTypeNameCache::query(const QHashedStringRef &name, + const void *importNamespace) { - if (stringCache.contains(name)) - return; - - QDeclarativeEnginePrivate *ep = QDeclarativeEnginePrivate::get(engine); + Q_ASSERT(importNamespace); + Import *i = (Import *)importNamespace; + Q_ASSERT(i->scriptIndex == -1); + + for (int ii = 0; ii < i->modules.count(); ++ii) { + if (QDeclarativeType *type = i->modules.at(ii).type(name)) + return Result(type); + } + + return Result(); +} - Data data; - typeNamespace->addref(); - data.typeNamespace = typeNamespace; - stringCache.insert(name, data); +QDeclarativeTypeNameCache::Result QDeclarativeTypeNameCache::query(const QHashedV8String &name) +{ + Import *i = m_namedImports.value(name); + if (i) { + if (i->scriptIndex != -1) + return Result(i->scriptIndex); + else + return Result((const void *)i); + } + + for (int ii = 0; ii < m_anonymousImports.count(); ++ii) { + if (QDeclarativeType *type = m_anonymousImports.at(ii).type(name)) + return Result(type); + } + + return Result(); } -QDeclarativeTypeNameCache::Data *QDeclarativeTypeNameCache::data(const QString &id) const +QDeclarativeTypeNameCache::Result QDeclarativeTypeNameCache::query(const QHashedV8String &name, const void *importNamespace) { - return stringCache.value(id); + Q_ASSERT(importNamespace); + Import *i = (Import *)importNamespace; + Q_ASSERT(i->scriptIndex == -1); + + for (int ii = 0; ii < i->modules.count(); ++ii) { + if (QDeclarativeType *type = i->modules.at(ii).type(name)) + return Result(type); + } + + return Result(); } -void QDeclarativeTypeNameCache::setModuleApi(QDeclarativeMetaType::ModuleApiInstance *api) +QDeclarativeMetaType::ModuleApiInstance *QDeclarativeTypeNameCache::moduleApi(const void *importNamespace) { - m_moduleApi = api; + Q_ASSERT(importNamespace); + Import *i = (Import *)importNamespace; + Q_ASSERT(i->scriptIndex == -1); + + return i->moduleApi; } QT_END_NAMESPACE |