aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/qml/qdeclarativetypenamecache.cpp
diff options
context:
space:
mode:
authorAaron Kennedy <aaron.kennedy@nokia.com>2011-07-06 13:43:47 +1000
committerQt by Nokia <qt-info@nokia.com>2011-08-30 13:18:28 +0200
commit809ee66b67ce70dba89a04b92daccc9445af2e75 (patch)
tree84c6d4023312d72583ccfcd2ad79df4fdf714527 /src/declarative/qml/qdeclarativetypenamecache.cpp
parentf8f9db6cc74a34d3648ac693196c0f5d4bda9c50 (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.cpp97
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