From 3d958cec8d53094a1bbab895377e451b07716e1f Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 13 Jul 2011 14:12:21 +1000 Subject: Use memory more conservatively during QML compilation Change-Id: I63af79e575345bce00d724f1e7c87606156d1479 Reviewed-on: http://codereview.qt.nokia.com/3744 Reviewed-by: Roberto Raggi --- src/declarative/qml/qdeclarativetypeloader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 97c5b38c20..6bda993038 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -928,7 +928,7 @@ void QDeclarativeTypeData::compile() m_compiledData->name = m_compiledData->url.toString(); QDeclarativeDebugTrace::rangeData(QDeclarativeDebugTrace::Compiling, m_compiledData->name); - QDeclarativeCompiler compiler; + QDeclarativeCompiler compiler(&scriptParser._pool); if (!compiler.compile(typeLoader()->engine(), this, m_compiledData)) { setError(compiler.errors()); m_compiledData->release(); -- cgit v1.2.3 From 7ab665fe61b4fe28fdb141fa66509b3addd55623 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 15 Jul 2011 17:19:17 +1000 Subject: Cache QML import directories and qmldir files. Also a little less toUtf8(). Change-Id: Iefb255fad9e27553f29b184418e66ce317f1cd89 Reviewed-on: http://codereview.qt.nokia.com/3748 Reviewed-by: Roberto Raggi Reviewed-by: Qt Sanity Bot --- src/declarative/qml/qdeclarativetypeloader.cpp | 125 ++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 3 deletions(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 6bda993038..6b9dfc11bc 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -51,9 +51,70 @@ #include #include #include +#include + +#if defined (Q_OS_UNIX) +#include +#include +#endif QT_BEGIN_NAMESPACE + +/* +Returns the set of QML files in path (qmldir, *.qml, *.js). The caller +is responsible for deleting the returned data. +*/ +#if defined (Q_OS_UNIX) +static QStringHash *qmlFilesInDirectory(const QString &path) +{ + QByteArray name(QFile::encodeName(path)); + DIR *dd = opendir(name); + if (!dd) + return 0; + + struct dirent *result; + union { + struct dirent d; + char b[offsetof (struct dirent, d_name) + NAME_MAX + 1]; + } u; + + QStringHash *files = new QStringHash; + while (readdir_r(dd, &u.d, &result) == 0 && result != 0) { + if (!strcmp(u.d.d_name, "qmldir")) { + files->insert(QLatin1String("qmldir"), true); + continue; + } + int len = strlen(u.d.d_name); + if (len < 4) + continue; + if (!strcmp(u.d.d_name+len-4, ".qml") || !strcmp(u.d.d_name+len-3, ".js")) + files->insert(QFile::decodeName(u.d.d_name), true); + } + + closedir(dd); + return files; +} +#else +static QStringHash *qmlFilesInDirectory(const QString &path) +{ + QDirIterator dir(path, QDir::Files); + if (!dir.hasNext()) + return 0; + QStringHash *files = new QStringHash; + while (dir.hasNext()) { + dir.next(); + QString fileName = dir.fileName(); + if (fileName == QLatin1String("qmldir") + || fileName.endsWith(QLatin1String(".qml")) + || fileName.endsWith(QLatin1String(".js"))) + files->insert(fileName, true); + } + return files; +} +#endif + + /*! \class QDeclarativeDataBlob \brief The QDeclarativeDataBlob encapsulates a data request that can be issued to a QDeclarativeDataLoader. @@ -722,6 +783,60 @@ QDeclarativeQmldirData *QDeclarativeTypeLoader::getQmldir(const QUrl &url) return qmldirData; } +/*! +Returns the absolute filename of path via a directory cache for files named +"qmldir", "*.qml", "*.js" +Returns a empty string if the path does not exist. +*/ +QString QDeclarativeTypeLoader::absoluteFilePath(const QString &path) +{ + if (path.isEmpty()) + return QString(); + if (path.at(0) == QLatin1Char(':')) { + // qrc resource + QFileInfo fileInfo(path); + return fileInfo.isFile() ? fileInfo.absoluteFilePath() : QString(); + } + int lastSlash = path.lastIndexOf(QLatin1Char('/')); + QStringRef dirPath(&path, 0, lastSlash); + + StringSet **fileSet = m_importDirCache.value(QHashedStringRef(dirPath.constData(), dirPath.length())); + if (!fileSet) { + QHashedString dirPathString(dirPath.toString()); + StringSet *files = qmlFilesInDirectory(dirPathString); + m_importDirCache.insert(dirPathString, files); + fileSet = m_importDirCache.value(dirPathString); + } + if (!(*fileSet)) + return QString(); + + QString absoluteFilePath = (*fileSet)->contains(QHashedStringRef(path.constData()+lastSlash+1, path.length()-lastSlash-1)) ? path : QString(); + if (absoluteFilePath.length() > 2 && absoluteFilePath.at(0) != QLatin1Char('/') && absoluteFilePath.at(1) != QLatin1Char(':')) + absoluteFilePath = QFileInfo(absoluteFilePath).absoluteFilePath(); + + return absoluteFilePath; +} + +/*! +Return a QDeclarativeDirParser for absoluteFilePath. The QDeclarativeDirParser may be cached. +*/ +const QDeclarativeDirParser *QDeclarativeTypeLoader::qmlDirParser(const QString &absoluteFilePath) +{ + QDeclarativeDirParser *qmldirParser; + QDeclarativeDirParser **val = m_importQmlDirCache.value(absoluteFilePath); + if (!val) { + qmldirParser = new QDeclarativeDirParser; + qmldirParser->setFileSource(absoluteFilePath); + qmldirParser->setUrl(QUrl::fromLocalFile(absoluteFilePath)); + qmldirParser->parse(); + m_importQmlDirCache.insert(absoluteFilePath, qmldirParser); + } else { + qmldirParser = *val; + } + + return qmldirParser; +} + /*! Clears cached information about loaded files, including any type data, scripts and qmldir information. @@ -734,17 +849,21 @@ void QDeclarativeTypeLoader::clearCache() (*iter)->release(); for (QmldirCache::Iterator iter = m_qmldirCache.begin(); iter != m_qmldirCache.end(); ++iter) (*iter)->release(); + qDeleteAll(m_importDirCache); + qDeleteAll(m_importQmlDirCache); m_typeCache.clear(); m_scriptCache.clear(); m_qmldirCache.clear(); + m_importDirCache.clear(); + m_importQmlDirCache.clear(); } QDeclarativeTypeData::QDeclarativeTypeData(const QUrl &url, QDeclarativeTypeLoader::Options options, QDeclarativeTypeLoader *manager) -: QDeclarativeDataBlob(url, QmlFile), m_options(options), m_typesResolved(false), - m_compiledData(0), m_typeLoader(manager) +: QDeclarativeDataBlob(url, QmlFile), m_options(options), m_imports(manager), m_typesResolved(false), + m_compiledData(0), m_typeLoader(manager) { } @@ -1104,7 +1223,7 @@ void QDeclarativeScriptData::clear() QDeclarativeScriptBlob::QDeclarativeScriptBlob(const QUrl &url, QDeclarativeTypeLoader *loader) : QDeclarativeDataBlob(url, JavaScriptFile), m_pragmas(QDeclarativeParser::Object::ScriptBlock::None), - m_scriptData(0), m_typeLoader(loader) + m_imports(loader), m_scriptData(0), m_typeLoader(loader) { } -- cgit v1.2.3 From a6da3b26f5959986010deb85703cd51a0edb48e0 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Wed, 20 Jul 2011 14:03:03 +1000 Subject: Optimizations to imports. Change-Id: If4a51ad3b7c0ecc2261eea1d07a949119c3ad860 Reviewed-on: http://codereview.qt.nokia.com/3754 Reviewed-by: Roberto Raggi Reviewed-by: Qt Sanity Bot --- src/declarative/qml/qdeclarativetypeloader.cpp | 59 ++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 6b9dfc11bc..64fb1ecb0c 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -64,6 +64,7 @@ QT_BEGIN_NAMESPACE /* Returns the set of QML files in path (qmldir, *.qml, *.js). The caller is responsible for deleting the returned data. +Returns 0 if the directory does not exist. */ #if defined (Q_OS_UNIX) static QStringHash *qmlFilesInDirectory(const QString &path) @@ -90,6 +91,14 @@ static QStringHash *qmlFilesInDirectory(const QString &path) continue; if (!strcmp(u.d.d_name+len-4, ".qml") || !strcmp(u.d.d_name+len-3, ".js")) files->insert(QFile::decodeName(u.d.d_name), true); +#if defined(Q_OS_DARWIN) + else if ((len > 6 && !strcmp(u.d.d_name+len-6, ".dylib")) || !strcmp(u.d.d_name+len-3, ".so") + || (len > 7 && !strcmp(u.d.d_name+len-7, ".bundle")) + files->insert(QFile::decodeName(u.d.d_name), true); +#else // Unix + else if (!strcmp(u.d.d_name+len-3, ".so") || !strcmp(u.d.d_name+len-3, ".sl")) + files->insert(QFile::decodeName(u.d.d_name), true); +#endif } closedir(dd); @@ -107,7 +116,18 @@ static QStringHash *qmlFilesInDirectory(const QString &path) QString fileName = dir.fileName(); if (fileName == QLatin1String("qmldir") || fileName.endsWith(QLatin1String(".qml")) - || fileName.endsWith(QLatin1String(".js"))) + || fileName.endsWith(QLatin1String(".js")) +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) + || fileName.endsWith(QLatin1String(".dll")) +#elif defined(Q_OS_DARWIN) + || fileName.endsWith(QLatin1String(".dylib")) + || fileName.endsWith(QLatin1String(".so")) + || fileName.endsWith(QLatin1String(".bundle")) +#else // Unix + || fileName.endsWith(QLatin1String(".so")) + || fileName.endsWith(QLatin1String(".sl")) +#endif + ) files->insert(fileName, true); } return files; @@ -785,7 +805,7 @@ QDeclarativeQmldirData *QDeclarativeTypeLoader::getQmldir(const QUrl &url) /*! Returns the absolute filename of path via a directory cache for files named -"qmldir", "*.qml", "*.js" +"qmldir", "*.qml", "*.js", and plugins. Returns a empty string if the path does not exist. */ QString QDeclarativeTypeLoader::absoluteFilePath(const QString &path) @@ -817,6 +837,37 @@ QString QDeclarativeTypeLoader::absoluteFilePath(const QString &path) return absoluteFilePath; } +/*! +Returns true if the path is a directory via a directory cache. Cache is +shared with absoluteFilePath(). +*/ +bool QDeclarativeTypeLoader::directoryExists(const QString &path) +{ + if (path.isEmpty()) + return false; + if (path.at(0) == QLatin1Char(':')) { + // qrc resource + QFileInfo fileInfo(path); + return fileInfo.exists() && fileInfo.isDir(); + } + + int length = path.length(); + if (path.endsWith(QLatin1Char('/'))) + --length; + QStringRef dirPath(&path, 0, length); + + StringSet **fileSet = m_importDirCache.value(QHashedStringRef(dirPath.constData(), dirPath.length())); + if (!fileSet) { + QHashedString dirPathString(dirPath.toString()); + StringSet *files = qmlFilesInDirectory(dirPathString); + m_importDirCache.insert(dirPathString, files); + fileSet = m_importDirCache.value(dirPathString); + } + + return (*fileSet); +} + + /*! Return a QDeclarativeDirParser for absoluteFilePath. The QDeclarativeDirParser may be cached. */ @@ -1132,7 +1183,7 @@ void QDeclarativeTypeData::resolveTypes() TypeReference ref; - QUrl url; + QString url; int majorVersion; int minorVersion; QDeclarativeImportedNamespace *typeNamespace = 0; @@ -1175,7 +1226,7 @@ void QDeclarativeTypeData::resolveTypes() ref.majorVersion = majorVersion; ref.minorVersion = minorVersion; } else { - ref.typeData = typeLoader()->get(url); + ref.typeData = typeLoader()->get(QUrl(url)); addDependency(ref.typeData); } -- cgit v1.2.3 From 050832fcea5f26561ffe443595c54d5e3e7c9924 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Thu, 21 Jul 2011 15:09:15 +0200 Subject: Compile Change-Id: Id7a5520d0e344b708aabacd0b0aefa705b47b197 Reviewed-on: http://codereview.qt.nokia.com/3761 Reviewed-by: Roberto Raggi Reviewed-by: Qt Sanity Bot --- src/declarative/qml/qdeclarativetypeloader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 64fb1ecb0c..1383d64ce8 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -93,7 +93,7 @@ static QStringHash *qmlFilesInDirectory(const QString &path) files->insert(QFile::decodeName(u.d.d_name), true); #if defined(Q_OS_DARWIN) else if ((len > 6 && !strcmp(u.d.d_name+len-6, ".dylib")) || !strcmp(u.d.d_name+len-3, ".so") - || (len > 7 && !strcmp(u.d.d_name+len-7, ".bundle")) + || (len > 7 && !strcmp(u.d.d_name+len-7, ".bundle"))) files->insert(QFile::decodeName(u.d.d_name), true); #else // Unix else if (!strcmp(u.d.d_name+len-3, ".so") || !strcmp(u.d.d_name+len-3, ".sl")) -- cgit v1.2.3 From cc533d80928445c45d6d181f26f0c7dc57c09811 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 22 Jul 2011 14:52:08 +1000 Subject: Remove some QString <-> utf8 conversions. Change-Id: I4478ec805f5b1e05025baafaf7035b8fb57f9854 Reviewed-on: http://codereview.qt.nokia.com/3770 Reviewed-by: Roberto Raggi Reviewed-by: Qt Sanity Bot --- src/declarative/qml/qdeclarativetypeloader.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 1383d64ce8..36b5f2890b 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -1179,8 +1179,6 @@ void QDeclarativeTypeData::resolveTypes() } foreach (QDeclarativeScriptParser::TypeReference *parserRef, scriptParser.referencedTypes()) { - QByteArray typeName = parserRef->name.toUtf8(); - TypeReference ref; QString url; @@ -1189,7 +1187,7 @@ void QDeclarativeTypeData::resolveTypes() QDeclarativeImportedNamespace *typeNamespace = 0; QList errors; - if (!m_imports.resolveType(typeName, &ref.type, &url, &majorVersion, &minorVersion, + if (!m_imports.resolveType(parserRef->name, &ref.type, &url, &majorVersion, &minorVersion, &typeNamespace, &errors) || typeNamespace) { // Known to not be a type: // - known to be a namespace (Namespace {}) -- cgit v1.2.3 From ee84bb67a2f90038d1f3462cb9141dffbfa9517b Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Tue, 23 Aug 2011 11:41:50 +1000 Subject: Move all QML file parsing into the QDeclarativeScript namespace Change-Id: I5969686a796cbfb2eeb3729014df7f01e51b0620 Reviewed-on: http://codereview.qt.nokia.com/3797 Reviewed-by: Roberto Raggi --- src/declarative/qml/qdeclarativetypeloader.cpp | 40 +++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 36b5f2890b..0b699f4ea3 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -940,7 +940,7 @@ const QDeclarativeImports &QDeclarativeTypeData::imports() const return m_imports; } -const QDeclarativeScriptParser &QDeclarativeTypeData::parser() const +const QDeclarativeScript::Parser &QDeclarativeTypeData::parser() const { return scriptParser; } @@ -1039,15 +1039,15 @@ void QDeclarativeTypeData::dataReceived(const QByteArray &data) m_imports.setBaseUrl(finalUrl()); - foreach (const QDeclarativeScriptParser::Import &import, scriptParser.imports()) { - if (import.type == QDeclarativeScriptParser::Import::File && import.qualifier.isEmpty()) { + foreach (const QDeclarativeScript::Import &import, scriptParser.imports()) { + if (import.type == QDeclarativeScript::Import::File && import.qualifier.isEmpty()) { QUrl importUrl = finalUrl().resolved(QUrl(import.uri + QLatin1String("/qmldir"))); if (QDeclarativeEnginePrivate::urlToLocalFileOrQrc(importUrl).isEmpty()) { QDeclarativeQmldirData *data = typeLoader()->getQmldir(importUrl); addDependency(data); m_qmldirs << data; } - } else if (import.type == QDeclarativeScriptParser::Import::Script) { + } else if (import.type == QDeclarativeScript::Import::Script) { QUrl scriptUrl = finalUrl().resolved(QUrl(import.uri)); QDeclarativeScriptBlob *blob = typeLoader()->getScript(scriptUrl); addDependency(blob); @@ -1118,11 +1118,11 @@ void QDeclarativeTypeData::resolveTypes() QList errors; if (QDeclarativeQmldirData *qmldir = qmldirForUrl(finalUrl().resolved(QUrl(QLatin1String("./qmldir"))))) { m_imports.addImport(importDatabase, QLatin1String("."), - QString(), -1, -1, QDeclarativeScriptParser::Import::File, + QString(), -1, -1, QDeclarativeScript::Import::File, qmldir->dirComponents(), &errors); } else { m_imports.addImport(importDatabase, QLatin1String("."), - QString(), -1, -1, QDeclarativeScriptParser::Import::File, + QString(), -1, -1, QDeclarativeScript::Import::File, QDeclarativeDirComponents(), &errors); } @@ -1142,12 +1142,12 @@ void QDeclarativeTypeData::resolveTypes() return; } - foreach (const QDeclarativeScriptParser::Import &import, scriptParser.imports()) { + foreach (const QDeclarativeScript::Import &import, scriptParser.imports()) { QDeclarativeDirComponents qmldircomponentsnetwork; - if (import.type == QDeclarativeScriptParser::Import::Script) + if (import.type == QDeclarativeScript::Import::Script) continue; - if (import.type == QDeclarativeScriptParser::Import::File && import.qualifier.isEmpty()) { + if (import.type == QDeclarativeScript::Import::File && import.qualifier.isEmpty()) { QUrl qmldirUrl = finalUrl().resolved(QUrl(import.uri + QLatin1String("/qmldir"))); if (QDeclarativeQmldirData *qmldir = qmldirForUrl(qmldirUrl)) qmldircomponentsnetwork = qmldir->dirComponents(); @@ -1178,7 +1178,7 @@ void QDeclarativeTypeData::resolveTypes() } } - foreach (QDeclarativeScriptParser::TypeReference *parserRef, scriptParser.referencedTypes()) { + foreach (QDeclarativeScript::TypeReference *parserRef, scriptParser.referencedTypes()) { TypeReference ref; QString url; @@ -1210,7 +1210,7 @@ void QDeclarativeTypeData::resolveTypes() } if (!parserRef->refObjects.isEmpty()) { - QDeclarativeParser::Object *obj = parserRef->refObjects.first(); + QDeclarativeScript::Object *obj = parserRef->refObjects.first(); error.setLine(obj->location.start.line); error.setColumn(obj->location.start.column); } @@ -1245,7 +1245,7 @@ QDeclarativeQmldirData *QDeclarativeTypeData::qmldirForUrl(const QUrl &url) } QDeclarativeScriptData::QDeclarativeScriptData(QDeclarativeEngine *engine) -: QDeclarativeCleanup(engine), importCache(0), pragmas(QDeclarativeParser::Object::ScriptBlock::None), +: QDeclarativeCleanup(engine), importCache(0), pragmas(QDeclarativeScript::Object::ScriptBlock::None), m_loaded(false) { } @@ -1271,7 +1271,7 @@ void QDeclarativeScriptData::clear() } QDeclarativeScriptBlob::QDeclarativeScriptBlob(const QUrl &url, QDeclarativeTypeLoader *loader) -: QDeclarativeDataBlob(url, JavaScriptFile), m_pragmas(QDeclarativeParser::Object::ScriptBlock::None), +: QDeclarativeDataBlob(url, JavaScriptFile), m_pragmas(QDeclarativeScript::Object::ScriptBlock::None), m_imports(loader), m_scriptData(0), m_typeLoader(loader) { } @@ -1284,7 +1284,7 @@ QDeclarativeScriptBlob::~QDeclarativeScriptBlob() } } -QDeclarativeParser::Object::ScriptBlock::Pragmas QDeclarativeScriptBlob::pragmas() const +QDeclarativeScript::Object::ScriptBlock::Pragmas QDeclarativeScriptBlob::pragmas() const { return m_pragmas; } @@ -1316,17 +1316,17 @@ void QDeclarativeScriptBlob::dataReceived(const QByteArray &data) m_source = QString::fromUtf8(data); - QDeclarativeScriptParser::JavaScriptMetaData metadata = - QDeclarativeScriptParser::extractMetaData(m_source); + QDeclarativeScript::Parser::JavaScriptMetaData metadata = + QDeclarativeScript::Parser::extractMetaData(m_source); m_imports.setBaseUrl(finalUrl()); m_pragmas = metadata.pragmas; - foreach (const QDeclarativeScriptParser::Import &import, metadata.imports) { - Q_ASSERT(import.type != QDeclarativeScriptParser::Import::File); + foreach (const QDeclarativeScript::Import &import, metadata.imports) { + Q_ASSERT(import.type != QDeclarativeScript::Import::File); - if (import.type == QDeclarativeScriptParser::Import::Script) { + if (import.type == QDeclarativeScript::Import::Script) { QUrl scriptUrl = finalUrl().resolved(QUrl(import.uri)); QDeclarativeScriptBlob *blob = typeLoader()->getScript(scriptUrl); addDependency(blob); @@ -1338,7 +1338,7 @@ void QDeclarativeScriptBlob::dataReceived(const QByteArray &data) blob->addref(); m_scripts << ref; } else { - Q_ASSERT(import.type == QDeclarativeScriptParser::Import::Library); + Q_ASSERT(import.type == QDeclarativeScript::Import::Library); int vmaj = -1; int vmin = -1; import.extractVersion(&vmaj, &vmin); -- cgit v1.2.3 From acf715c4e59a5ec1b4332522bf285ebeebfc7e5c Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Tue, 30 Aug 2011 11:45:36 +0200 Subject: Fix the directory cache for case insensitive file systems. Authored-by: Martin Jones Change-Id: Iebedfa077487f4fa1cab6d159cc4bd1e7b0b7184 Reviewed-on: http://codereview.qt.nokia.com/3870 Reviewed-by: Roberto Raggi Reviewed-by: Qt Sanity Bot --- src/declarative/qml/qdeclarativetypeloader.cpp | 30 ++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'src/declarative/qml/qdeclarativetypeloader.cpp') diff --git a/src/declarative/qml/qdeclarativetypeloader.cpp b/src/declarative/qml/qdeclarativetypeloader.cpp index 0b699f4ea3..8bb40ce7a5 100644 --- a/src/declarative/qml/qdeclarativetypeloader.cpp +++ b/src/declarative/qml/qdeclarativetypeloader.cpp @@ -66,7 +66,7 @@ Returns the set of QML files in path (qmldir, *.qml, *.js). The caller is responsible for deleting the returned data. Returns 0 if the directory does not exist. */ -#if defined (Q_OS_UNIX) +#if defined (Q_OS_UNIX) && !defined(Q_OS_DARWIN) static QStringHash *qmlFilesInDirectory(const QString &path) { QByteArray name(QFile::encodeName(path)); @@ -127,8 +127,12 @@ static QStringHash *qmlFilesInDirectory(const QString &path) || fileName.endsWith(QLatin1String(".so")) || fileName.endsWith(QLatin1String(".sl")) #endif - ) + ) { +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_DARWIN) + fileName = fileName.toLower(); +#endif files->insert(fileName, true); + } } return files; } @@ -817,12 +821,22 @@ QString QDeclarativeTypeLoader::absoluteFilePath(const QString &path) QFileInfo fileInfo(path); return fileInfo.isFile() ? fileInfo.absoluteFilePath() : QString(); } +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_DARWIN) + QString lowPath = path.toLower(); + int lastSlash = lowPath.lastIndexOf(QLatin1Char('/')); + QString dirPath = lowPath.left(lastSlash); +#else int lastSlash = path.lastIndexOf(QLatin1Char('/')); QStringRef dirPath(&path, 0, lastSlash); +#endif StringSet **fileSet = m_importDirCache.value(QHashedStringRef(dirPath.constData(), dirPath.length())); if (!fileSet) { +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_DARWIN) + QHashedString dirPathString(dirPath); +#else QHashedString dirPathString(dirPath.toString()); +#endif StringSet *files = qmlFilesInDirectory(dirPathString); m_importDirCache.insert(dirPathString, files); fileSet = m_importDirCache.value(dirPathString); @@ -830,7 +844,11 @@ QString QDeclarativeTypeLoader::absoluteFilePath(const QString &path) if (!(*fileSet)) return QString(); +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_DARWIN) + QString absoluteFilePath = (*fileSet)->contains(QHashedStringRef(lowPath.constData()+lastSlash+1, lowPath.length()-lastSlash-1)) ? path : QString(); +#else QString absoluteFilePath = (*fileSet)->contains(QHashedStringRef(path.constData()+lastSlash+1, path.length()-lastSlash-1)) ? path : QString(); +#endif if (absoluteFilePath.length() > 2 && absoluteFilePath.at(0) != QLatin1Char('/') && absoluteFilePath.at(1) != QLatin1Char(':')) absoluteFilePath = QFileInfo(absoluteFilePath).absoluteFilePath(); @@ -854,11 +872,19 @@ bool QDeclarativeTypeLoader::directoryExists(const QString &path) int length = path.length(); if (path.endsWith(QLatin1Char('/'))) --length; +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_DARWIN) + QString dirPath = path.left(length).toLower(); +#else QStringRef dirPath(&path, 0, length); +#endif StringSet **fileSet = m_importDirCache.value(QHashedStringRef(dirPath.constData(), dirPath.length())); if (!fileSet) { +#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) || defined(Q_OS_DARWIN) + QHashedString dirPathString(dirPath); +#else QHashedString dirPathString(dirPath.toString()); +#endif StringSet *files = qmlFilesInDirectory(dirPathString); m_importDirCache.insert(dirPathString, files); fileSet = m_importDirCache.value(dirPathString); -- cgit v1.2.3