diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2016-11-07 12:09:52 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2016-11-07 16:40:06 +0000 |
commit | 4b67847fe6ea57f25ef6321bbf9d14825e979ae5 (patch) | |
tree | d12036dfb9292ad90737520b4a629a7a2b6a6a5d | |
parent | 3dd97e4e55735b6efbcbd13d8c59653b227951a4 (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.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/depscanner.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/jscommandexecutor.cpp | 2 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/rulesevaluationcontext.cpp | 5 | ||||
-rw-r--r-- | src/lib/corelib/language/loader.cpp | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.cpp | 4 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.h | 24 | ||||
-rw-r--r-- | src/lib/corelib/language/tst_language.cpp | 2 |
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 ¶meters) 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")); |