summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2013-03-28 16:14:11 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-03-28 16:57:32 +0100
commit67365f0cc01233dab7ecffe17c128dd6e3e26a3d (patch)
tree9710d26e9c43ae0292e5a1a3c7dd830d895e7fbe
parent02502cc90ecfb38d519b6b0a3e105fc7a5815a00 (diff)
downloadqbs-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.cpp12
-rw-r--r--src/lib/language/scriptengine.cpp15
-rw-r--r--src/lib/language/scriptengine.h9
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;