summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-07-24 11:38:47 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2013-07-24 15:38:14 +0200
commit7474cf4c7aca19b05a4a8cd8619b0de714517f7f (patch)
tree71d686b0e381bf30a8489f15f61b33b60cd76f87
parent68acfeeb77973b8329441929d90237e704efbd1d (diff)
downloadqbs-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.cpp30
-rw-r--r--src/lib/language/scriptengine.cpp4
-rw-r--r--src/lib/language/scriptengine.h6
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;