aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2016-11-07 12:09:52 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2016-11-07 16:40:06 +0000
commit4b67847fe6ea57f25ef6321bbf9d14825e979ae5 (patch)
treed12036dfb9292ad90737520b4a629a7a2b6a6a5d
parent3dd97e4e55735b6efbcbd13d8c59653b227951a4 (diff)
Attach information about the context to our script engine
Certain operations might want to know what the script engine is currently doing. This will be used in a follow-up commit. Change-Id: I90167c29e94e0f77c7d5ccf20787e9749434e728 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--src/lib/corelib/api/runenvironment.cpp2
-rw-r--r--src/lib/corelib/buildgraph/depscanner.cpp2
-rw-r--r--src/lib/corelib/buildgraph/jscommandexecutor.cpp2
-rw-r--r--src/lib/corelib/buildgraph/rulesevaluationcontext.cpp5
-rw-r--r--src/lib/corelib/language/loader.cpp1
-rw-r--r--src/lib/corelib/language/moduleloader.cpp1
-rw-r--r--src/lib/corelib/language/scriptengine.cpp4
-rw-r--r--src/lib/corelib/language/scriptengine.h24
-rw-r--r--src/lib/corelib/language/tst_language.cpp2
9 files changed, 35 insertions, 8 deletions
diff --git a/src/lib/corelib/api/runenvironment.cpp b/src/lib/corelib/api/runenvironment.cpp
index 7398be29e..fc9525a82 100644
--- a/src/lib/corelib/api/runenvironment.cpp
+++ b/src/lib/corelib/api/runenvironment.cpp
@@ -77,7 +77,7 @@ public:
, environment(environment)
, settings(settings)
, logger(logger)
- , engine(this->logger)
+ , engine(this->logger, EvalContext::PropertyEvaluation)
{
}
diff --git a/src/lib/corelib/buildgraph/depscanner.cpp b/src/lib/corelib/buildgraph/depscanner.cpp
index 494c6cc1d..804327955 100644
--- a/src/lib/corelib/buildgraph/depscanner.cpp
+++ b/src/lib/corelib/buildgraph/depscanner.cpp
@@ -144,7 +144,7 @@ UserDependencyScanner::UserDependencyScanner(const ResolvedScannerConstPtr &scan
const Logger &logger)
: m_scanner(scanner),
m_logger(logger),
- m_engine(new ScriptEngine(m_logger)),
+ m_engine(new ScriptEngine(m_logger, EvalContext::RuleExecution)),
m_observer(m_engine),
m_product(0)
{
diff --git a/src/lib/corelib/buildgraph/jscommandexecutor.cpp b/src/lib/corelib/buildgraph/jscommandexecutor.cpp
index 8bcf7d70c..ddbc1049d 100644
--- a/src/lib/corelib/buildgraph/jscommandexecutor.cpp
+++ b/src/lib/corelib/buildgraph/jscommandexecutor.cpp
@@ -144,7 +144,7 @@ private:
ScriptEngine *provideScriptEngine()
{
if (!m_scriptEngine)
- m_scriptEngine = new ScriptEngine(m_logger, this);
+ m_scriptEngine = new ScriptEngine(m_logger, EvalContext::JsCommand, this);
return m_scriptEngine;
}
diff --git a/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp b/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp
index e2a8d29ec..efbb6b652 100644
--- a/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp
+++ b/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp
@@ -55,7 +55,10 @@ namespace qbs {
namespace Internal {
RulesEvaluationContext::RulesEvaluationContext(const Logger &logger)
- : m_logger(logger), m_engine(new ScriptEngine(m_logger)), m_observer(0), m_initScopeCalls(0)
+ : m_logger(logger),
+ m_engine(new ScriptEngine(m_logger, EvalContext::RuleExecution)),
+ m_observer(0),
+ m_initScopeCalls(0)
{
m_prepareScriptScope = m_engine->newObject();
m_prepareScriptScope.setPrototype(m_engine->globalObject());
diff --git a/src/lib/corelib/language/loader.cpp b/src/lib/corelib/language/loader.cpp
index bec581a27..4384febd3 100644
--- a/src/lib/corelib/language/loader.cpp
+++ b/src/lib/corelib/language/loader.cpp
@@ -100,6 +100,7 @@ TopLevelProjectPtr Loader::loadProject(const SetupProjectParameters &parameters)
m_engine->clearRequestedProperties();
m_engine->enableProfiling(parameters.logElapsedTime());
m_logger.clearWarnings();
+ EvalContextSwitcher evalContextSwitcher(m_engine, EvalContext::PropertyEvaluation);
QTimer cancelationTimer;
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index 78dbf51e4..16bcb71d1 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -1834,6 +1834,7 @@ void ModuleLoader::createChildInstances(ProductContext *productContext, Item *in
void ModuleLoader::resolveProbes(ProductContext *productContext, Item *item)
{
AccumulatingTimer probesTimer(m_parameters.logElapsedTime() ? &m_elapsedTimeProbes : nullptr);
+ EvalContextSwitcher evalContextSwitcher(m_evaluator->engine(), EvalContext::ProbeExecution);
foreach (Item *child, item->children())
if (child->type() == ItemType::Probe)
resolveProbe(productContext, item, child);
diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp
index 5be7b6ad0..bb7fb3571 100644
--- a/src/lib/corelib/language/scriptengine.cpp
+++ b/src/lib/corelib/language/scriptengine.cpp
@@ -88,9 +88,9 @@ uint qHash(const ScriptEngine::PropertyCacheKey &k, uint seed = 0)
combineHash(qHash(k.m_propertyName), qHash(k.m_propertyMap), seed), seed);
}
-ScriptEngine::ScriptEngine(Logger &logger, QObject *parent)
+ScriptEngine::ScriptEngine(Logger &logger, EvalContext evalContext, QObject *parent)
: QScriptEngine(parent), m_scriptImporter(new ScriptImporter(this)),
- m_propertyCacheEnabled(true), m_logger(logger)
+ m_propertyCacheEnabled(true), m_logger(logger), m_evalContext(evalContext)
{
setProcessEventsInterval(1000); // For the cancelation mechanism to work.
m_cancelationError = currentContext()->throwValue(tr("Execution canceled"));
diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h
index 146a4db00..3bbce2c93 100644
--- a/src/lib/corelib/language/scriptengine.h
+++ b/src/lib/corelib/language/scriptengine.h
@@ -60,11 +60,13 @@ class JsImport;
class ScriptImporter;
class ScriptPropertyObserver;
+enum class EvalContext { PropertyEvaluation, ProbeExecution, RuleExecution, JsCommand };
+
class ScriptEngine : public QScriptEngine
{
Q_OBJECT
public:
- ScriptEngine(Logger &logger, QObject *parent = 0);
+ ScriptEngine(Logger &logger, EvalContext evalContext, QObject *parent = 0);
~ScriptEngine();
Logger &logger() const { return m_logger; }
@@ -72,6 +74,9 @@ public:
void import(const JsImport &jsImport, QScriptValue &targetObject);
void clearImportsCache();
+ void setEvalContext(EvalContext c) { m_evalContext = c; }
+ EvalContext evalContext() const { return m_evalContext; }
+
void addPropertyRequestedInScript(const Property &property) {
m_propertiesRequestedInScript += property;
}
@@ -191,6 +196,23 @@ private:
QScriptValue m_cancelationError;
QList<QVariantMap *> m_ownedVariantMaps;
qint64 m_elapsedTimeImporting = -1;
+ EvalContext m_evalContext;
+};
+
+class EvalContextSwitcher
+{
+public:
+ EvalContextSwitcher(ScriptEngine *engine, EvalContext newContext)
+ : m_engine(engine), m_oldContext(engine->evalContext())
+ {
+ engine->setEvalContext(newContext);
+ }
+
+ ~EvalContextSwitcher() { m_engine->setEvalContext(m_oldContext); }
+
+private:
+ ScriptEngine * const m_engine;
+ const EvalContext m_oldContext;
};
} // namespace Internal
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index df5bc1d64..c7650aabb 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -155,7 +155,7 @@ void TestLanguage::handleInitCleanupDataTags(const char *projectFileName, bool *
void TestLanguage::initTestCase()
{
m_logger = Logger(m_logSink);
- m_engine = new ScriptEngine(m_logger, this);
+ m_engine = new ScriptEngine(m_logger, EvalContext::PropertyEvaluation, this);
loader = new Loader(m_engine, m_logger);
loader->setSearchPaths(QStringList()
<< QLatin1String(SRCDIR "/../../../share/qbs"));