diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-07-24 11:38:47 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-07-24 15:38:14 +0200 |
commit | 7474cf4c7aca19b05a4a8cd8619b0de714517f7f (patch) | |
tree | 71d686b0e381bf30a8489f15f61b33b60cd76f87 | |
parent | 68acfeeb77973b8329441929d90237e704efbd1d (diff) | |
download | qbs-7474cf4c7aca19b05a4a8cd8619b0de714517f7f.tar.gz |
fix the property cache
Cache the variant value. We must not cache the QScriptValue, because
it's a reference and the user might change the actual object.
Task-number: QBS-312
Change-Id: I34020e56beed34abe2a6e305f3a52e10f43547d4
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
-rw-r--r-- | src/lib/jsextensions/moduleproperties.cpp | 30 | ||||
-rw-r--r-- | src/lib/language/scriptengine.cpp | 4 | ||||
-rw-r--r-- | src/lib/language/scriptengine.h | 6 |
3 files changed, 20 insertions, 20 deletions
diff --git a/src/lib/jsextensions/moduleproperties.cpp b/src/lib/jsextensions/moduleproperties.cpp index 58bc6091f..a99809854 100644 --- a/src/lib/jsextensions/moduleproperties.cpp +++ b/src/lib/jsextensions/moduleproperties.cpp @@ -112,21 +112,21 @@ QScriptValue ModuleProperties::moduleProperties(QScriptContext *context, QScript ScriptEngine * const qbsEngine = static_cast<ScriptEngine *>(engine); const QString moduleName = context->argument(0).toString(); const QString propertyName = context->argument(1).toString(); - QScriptValue scriptValue - = qbsEngine->retrieveFromPropertyCache(moduleName, propertyName, properties); - if (scriptValue.isValid()) - return scriptValue; - - QVariant value; - if (oneValue) - value = PropertyFinder().propertyValue(properties->value(), moduleName, propertyName); - else - value = PropertyFinder().propertyValues(properties->value(), moduleName, propertyName); - const Property p(moduleName, propertyName, value); - qbsEngine->addProperty(p); - scriptValue = engine->toScriptValue(value); - qbsEngine->addToPropertyCache(moduleName, propertyName, properties, scriptValue); - return scriptValue; + + QVariant value = qbsEngine->retrieveFromPropertyCache(moduleName, propertyName, properties); + if (!value.isValid()) { + if (oneValue) + value = PropertyFinder().propertyValue(properties->value(), moduleName, propertyName); + else + value = PropertyFinder().propertyValues(properties->value(), moduleName, propertyName); + const Property p(moduleName, propertyName, value); + qbsEngine->addProperty(p); + + // Cache the variant value. We must not cache the QScriptValue here, because it's a + // reference and the user might change the actual object. + qbsEngine->addToPropertyCache(moduleName, propertyName, properties, value); + } + return engine->toScriptValue(value); } } // namespace Internal diff --git a/src/lib/language/scriptengine.cpp b/src/lib/language/scriptengine.cpp index f27f0e679..84c5f47e4 100644 --- a/src/lib/language/scriptengine.cpp +++ b/src/lib/language/scriptengine.cpp @@ -109,13 +109,13 @@ void ScriptEngine::clearImportsCache() } void ScriptEngine::addToPropertyCache(const QString &moduleName, const QString &propertyName, - const PropertyMapConstPtr &propertyMap, QScriptValue value) + const PropertyMapConstPtr &propertyMap, const QVariant &value) { m_propertyCache.insert(qMakePair(moduleName + QLatin1Char('.') + propertyName, propertyMap), value); } -QScriptValue ScriptEngine::retrieveFromPropertyCache(const QString &moduleName, +QVariant ScriptEngine::retrieveFromPropertyCache(const QString &moduleName, const QString &propertyName, const PropertyMapConstPtr &propertyMap) { return m_propertyCache.value(qMakePair(moduleName + QLatin1Char('.') + propertyName, diff --git a/src/lib/language/scriptengine.h b/src/lib/language/scriptengine.h index 25594548c..02ab693e0 100644 --- a/src/lib/language/scriptengine.h +++ b/src/lib/language/scriptengine.h @@ -65,8 +65,8 @@ public: PropertyList properties() const { return m_properties; } void addToPropertyCache(const QString &moduleName, const QString &propertyName, - const PropertyMapConstPtr &propertyMap, QScriptValue value); - QScriptValue retrieveFromPropertyCache(const QString &moduleName, const QString &propertyName, + const PropertyMapConstPtr &propertyMap, const QVariant &value); + QVariant retrieveFromPropertyCache(const QString &moduleName, const QString &propertyName, const PropertyMapConstPtr &propertyMap); void defineProperty(QScriptValue &object, const QString &name, const QScriptValue &descriptor); @@ -102,7 +102,7 @@ private: ScriptValueCache m_scriptValueCache; QHash<QString, QScriptValue> m_jsImportCache; - QHash<QPair<QString, PropertyMapConstPtr>, QScriptValue> m_propertyCache; + QHash<QPair<QString, PropertyMapConstPtr>, QVariant> m_propertyCache; PropertyList m_properties; Logger m_logger; QScriptValue m_definePropertyFunction; |