diff options
| author | Christian Kandeler <christian.kandeler@digia.com> | 2013-03-28 16:14:11 +0100 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-03-28 16:57:32 +0100 |
| commit | 67365f0cc01233dab7ecffe17c128dd6e3e26a3d (patch) | |
| tree | 9710d26e9c43ae0292e5a1a3c7dd830d895e7fbe | |
| parent | 02502cc90ecfb38d519b6b0a3e105fc7a5815a00 (diff) | |
| download | qbs-67365f0cc01233dab7ecffe17c128dd6e3e26a3d.tar.gz | |
Cache module properties.
The module properties look-up can take some time, so we only do it once.
On my Linux machine, this results in a ~30% speed-up of the build graph
creation.
Change-Id: I41e885915976cc89b321ea1863ecff967b42bf9c
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
| -rw-r--r-- | src/lib/jsextensions/moduleproperties.cpp | 12 | ||||
| -rw-r--r-- | src/lib/language/scriptengine.cpp | 15 | ||||
| -rw-r--r-- | src/lib/language/scriptengine.h | 9 |
3 files changed, 34 insertions, 2 deletions
diff --git a/src/lib/jsextensions/moduleproperties.cpp b/src/lib/jsextensions/moduleproperties.cpp index e1c58f584..a8fcf57fd 100644 --- a/src/lib/jsextensions/moduleproperties.cpp +++ b/src/lib/jsextensions/moduleproperties.cpp @@ -108,8 +108,14 @@ QScriptValue ModuleProperties::moduleProperties(QScriptContext *context, QScript return context->throwError(QScriptContext::TypeError, QLatin1String("Internal error: invalid type")); } + + 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) @@ -117,8 +123,10 @@ QScriptValue ModuleProperties::moduleProperties(QScriptContext *context, QScript else value = PropertyFinder().propertyValues(properties->value(), moduleName, propertyName); const Property p(moduleName, propertyName, value); - static_cast<ScriptEngine *>(engine)->addProperty(p); - return engine->toScriptValue(value); + qbsEngine->addProperty(p); + scriptValue = engine->toScriptValue(value); + qbsEngine->addToPropertyCache(moduleName, propertyName, properties, scriptValue); + return scriptValue; } } // namespace Internal diff --git a/src/lib/language/scriptengine.cpp b/src/lib/language/scriptengine.cpp index 5498e4402..15291f1fd 100644 --- a/src/lib/language/scriptengine.cpp +++ b/src/lib/language/scriptengine.cpp @@ -31,6 +31,7 @@ #include "item.h" #include "filecontext.h" +#include "propertymapinternal.h" #include "scriptpropertyobserver.h" #include <tools/error.h> #include <tools/qbsassert.h> @@ -106,6 +107,20 @@ void ScriptEngine::clearImportsCache() m_jsImportCache.clear(); } +void ScriptEngine::addToPropertyCache(const QString &moduleName, const QString &propertyName, + const PropertyMapConstPtr &propertyMap, QScriptValue value) +{ + m_propertyCache.insert(qMakePair(moduleName + QLatin1Char('.') + propertyName, propertyMap), + value); +} + +QScriptValue ScriptEngine::retrieveFromPropertyCache(const QString &moduleName, + const QString &propertyName, const PropertyMapConstPtr &propertyMap) +{ + return m_propertyCache.value(qMakePair(moduleName + QLatin1Char('.') + propertyName, + propertyMap)); +} + static QScriptValue js_observedGet(QScriptContext *context, QScriptEngine *, void *arg) { ScriptPropertyObserver * const observer = static_cast<ScriptPropertyObserver *>(arg); diff --git a/src/lib/language/scriptengine.h b/src/lib/language/scriptengine.h index 3e5daf653..e39d46e25 100644 --- a/src/lib/language/scriptengine.h +++ b/src/lib/language/scriptengine.h @@ -31,10 +31,13 @@ #define QBS_SCRIPTENGINE_H #include "jsimports.h" +#include "forward_decls.h" #include <language/property.h> #include <logging/logger.h> #include <tools/qbs_export.h> +#include <QHash> +#include <QPair> #include <QScriptEngine> namespace qbs { @@ -59,6 +62,11 @@ public: void clearProperties() { m_properties.clear(); } 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); + void setObservedProperty(QScriptValue &object, const QString &name, const QScriptValue &value, ScriptPropertyObserver *observer); @@ -67,6 +75,7 @@ private: QScriptValue &targetObject); QHash<QString, QScriptValue> m_jsImportCache; + QHash<QPair<QString, PropertyMapConstPtr>, QScriptValue> m_propertyCache; PropertyList m_properties; Logger m_logger; QScriptValue m_definePropertyFunction; |
