diff options
author | Sergio Ahumada <sergio.ahumada@digia.com> | 2013-09-05 15:31:08 +0200 |
---|---|---|
committer | Sergio Ahumada <sergio.ahumada@digia.com> | 2013-09-06 10:11:04 +0200 |
commit | af44559780765c7121a49c2e0764cf24e740312d (patch) | |
tree | a4f2f50ddfe969f33a4d4accd392523c6809fd5a /src/qml/qml | |
parent | 8784a4a46ea1357bde546c9a1c88bd060e863f30 (diff) | |
parent | b30d7c9ee8fbc3a395c74b618f2ab176ae1e7f7e (diff) |
Merge branch 'stable' into dev
Conflicts:
src/qml/debugger/qv8debugservice.cpp
src/qml/qml/v8/qv8engine.cpp
tests/auto/quick/qquickitem/qquickitem.pro
Change-Id: Ic4a1dcdd8b8a84155d2f2abefdf1da5c3a56af31
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlcompiler.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 3 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 54 |
3 files changed, 43 insertions, 18 deletions
diff --git a/src/qml/qml/qqmlcompiler.cpp b/src/qml/qml/qqmlcompiler.cpp index ddefffe8e2..6bc9128730 100644 --- a/src/qml/qml/qqmlcompiler.cpp +++ b/src/qml/qml/qqmlcompiler.cpp @@ -1747,7 +1747,9 @@ bool QQmlCompiler::buildProperty(QQmlScript::Property *prop, if (d == 0 && notInRevision) { const QList<QQmlTypeData::TypeReference> &resolvedTypes = unit->resolvedTypes(); - const QQmlTypeData::TypeReference &type = resolvedTypes.at(obj->type); + QQmlTypeData::TypeReference type; + if (obj->type != -1) + type = resolvedTypes.at(obj->type); if (type.type) { COMPILE_EXCEPTION(prop, tr("\"%1.%2\" is not available in %3 %4.%5.").arg(elementName(obj)).arg(prop->name().toString()).arg(type.type->module()).arg(type.majorVersion).arg(type.minorVersion)); } else { diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 5c59cc3383..39c3399917 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -757,7 +757,7 @@ void QQmlEnginePrivate::init() QQmlEngineDebugService::isDebuggingEnabled()) { isDebugging = true; QQmlEngineDebugService::instance()->addEngine(q); - QV8DebugService::initialize(v8engine()); + QV8DebugService::addEngine(v8engine()); QV8ProfilerService::initialize(); QQmlProfilerService::initialize(); QDebugMessageService::instance(); @@ -846,6 +846,7 @@ QQmlEngine::~QQmlEngine() Q_D(QQmlEngine); if (d->isDebugging) { QQmlEngineDebugService::instance()->remEngine(this); + QV8DebugService::removeEngine(handle()); } // Emit onDestruction signals for the root context before diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 816f9cec0f..85c6a4246a 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -161,13 +161,20 @@ QQmlType *getTypeForUrl(const QString &urlString, const QHashedStringRef& typeNa } -typedef QMap<QString, QString> StringStringMap; -Q_GLOBAL_STATIC(StringStringMap, qmlEnginePluginsWithRegisteredTypes); // stores the uri +struct RegisteredPlugin { + QString uri; + QPluginLoader* loader; +}; + +typedef QMap<QString, RegisteredPlugin> StringRegisteredPluginMap; +Q_GLOBAL_STATIC(StringRegisteredPluginMap, qmlEnginePluginsWithRegisteredTypes); // stores the uri and the PluginLoaders void qmlClearEnginePlugins() { - foreach (const QString &s, qmlEnginePluginsWithRegisteredTypes()->values()) { - QPluginLoader loader(s); - loader.unload(); // ### Always returns false, worth doing? + foreach (RegisteredPlugin plugin, qmlEnginePluginsWithRegisteredTypes()->values()) { + QPluginLoader* loader = plugin.loader; + if (!loader->unload()) + qWarning("Unloading %s failed: %s", qPrintable(plugin.uri), qPrintable(loader->errorString())); + delete loader; } qmlEnginePluginsWithRegisteredTypes()->clear(); } @@ -1634,7 +1641,7 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur bool typesRegistered = qmlEnginePluginsWithRegisteredTypes()->contains(absoluteFilePath); if (typesRegistered) { - Q_ASSERT_X(qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath) == uri, + Q_ASSERT_X(qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath).uri == uri, "QQmlImportDatabase::importPlugin", "Internal error: Plugin imported previously with different uri"); } @@ -1648,25 +1655,37 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur } return false; } - QPluginLoader loader(absoluteFilePath); - if (!loader.load()) { - if (errors) { - QQmlError error; - error.setDescription(loader.errorString()); - errors->prepend(error); + QPluginLoader* loader = 0; + if (!typesRegistered) { + loader = new QPluginLoader(absoluteFilePath); + + if (!loader->load()) { + if (errors) { + QQmlError error; + error.setDescription(loader->errorString()); + errors->prepend(error); + + delete loader; + } + return false; } - return false; + } else { + loader = qmlEnginePluginsWithRegisteredTypes()->value(absoluteFilePath).loader; } - QObject *instance = loader.instance(); + QObject *instance = loader->instance(); if (QQmlTypesExtensionInterface *iface = qobject_cast<QQmlExtensionInterface *>(instance)) { const QByteArray bytes = uri.toUtf8(); const char *moduleId = bytes.constData(); if (!typesRegistered) { - qmlEnginePluginsWithRegisteredTypes()->insert(absoluteFilePath, uri); + RegisteredPlugin plugin; + plugin.uri = uri; + plugin.loader = loader; + + qmlEnginePluginsWithRegisteredTypes()->insert(absoluteFilePath, plugin); QStringList registrationFailures; @@ -1734,8 +1753,11 @@ bool QQmlImportDatabase::importPlugin(const QString &filePath, const QString &ur } else { if (errors) { QQmlError error; - error.setDescription(loader.errorString()); + error.setDescription(loader->errorString()); errors->prepend(error); + + if (!typesRegistered) + delete loader; } return false; } |