diff options
13 files changed, 78 insertions, 4 deletions
diff --git a/src/lib/corelib/buildgraph/jscommandexecutor.cpp b/src/lib/corelib/buildgraph/jscommandexecutor.cpp index 3b8e9ab42..1a7224afc 100644 --- a/src/lib/corelib/buildgraph/jscommandexecutor.cpp +++ b/src/lib/corelib/buildgraph/jscommandexecutor.cpp @@ -167,7 +167,7 @@ private: ScriptEngine *provideScriptEngine() { if (!m_scriptEngine) - m_scriptEngine = new ScriptEngine(m_logger, EvalContext::JsCommand, this); + m_scriptEngine = ScriptEngine::create(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 0b6774adb..c81e40c4f 100644 --- a/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp +++ b/src/lib/corelib/buildgraph/rulesevaluationcontext.cpp @@ -55,7 +55,7 @@ namespace Internal { RulesEvaluationContext::RulesEvaluationContext(const Logger &logger) : m_logger(logger), - m_engine(new ScriptEngine(m_logger, EvalContext::RuleExecution)), + m_engine(ScriptEngine::create(m_logger, EvalContext::RuleExecution)), m_observer(nullptr), m_initScopeCalls(0) { diff --git a/src/lib/corelib/language/scriptengine.cpp b/src/lib/corelib/language/scriptengine.cpp index b1c6d1410..8f31b879f 100644 --- a/src/lib/corelib/language/scriptengine.cpp +++ b/src/lib/corelib/language/scriptengine.cpp @@ -97,6 +97,8 @@ uint qHash(const ScriptEngine::PropertyCacheKey &k, uint seed = 0) combineHash(qHash(k.m_propertyName), qHash(k.m_propertyMap), seed), seed); } +std::mutex ScriptEngine::m_creationDestructionMutex; + ScriptEngine::ScriptEngine(Logger &logger, EvalContext evalContext, QObject *parent) : QScriptEngine(parent), m_scriptImporter(new ScriptImporter(this)), m_modulePropertyScriptClass(nullptr), @@ -116,8 +118,17 @@ ScriptEngine::ScriptEngine(Logger &logger, EvalContext evalContext, QObject *par extendJavaScriptBuiltins(); } +ScriptEngine *ScriptEngine::create(Logger &logger, EvalContext evalContext, QObject *parent) +{ + std::lock_guard<std::mutex> lock(m_creationDestructionMutex); + return new ScriptEngine(logger, evalContext, parent); +} + ScriptEngine::~ScriptEngine() { + m_creationDestructionMutex.lock(); + connect(this, &QObject::destroyed, std::bind(&std::mutex::unlock, &m_creationDestructionMutex)); + releaseResourcesOfScriptObjects(); delete (m_scriptImporter); if (m_elapsedTimeImporting != -1) { diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h index 05f4f519f..c01adbcbe 100644 --- a/src/lib/corelib/language/scriptengine.h +++ b/src/lib/corelib/language/scriptengine.h @@ -56,6 +56,7 @@ #include <QtScript/qscriptengine.h> #include <memory> +#include <mutex> #include <stack> #include <tuple> #include <unordered_map> @@ -96,8 +97,9 @@ enum class ObserveMode { Enabled, Disabled }; class QBS_AUTOTEST_EXPORT ScriptEngine : public QScriptEngine { Q_OBJECT -public: ScriptEngine(Logger &logger, EvalContext evalContext, QObject *parent = nullptr); +public: + static ScriptEngine *create(Logger &logger, EvalContext evalContext, QObject *parent = nullptr); ~ScriptEngine(); Logger &logger() const { return m_logger; } @@ -244,6 +246,7 @@ private: friend bool operator==(const PropertyCacheKey &lhs, const PropertyCacheKey &rhs); friend uint qHash(const ScriptEngine::PropertyCacheKey &k, uint seed); + static std::mutex m_creationDestructionMutex; ScriptImporter *m_scriptImporter; QScriptClass *m_modulePropertyScriptClass; QHash<JsImport, QScriptValue> m_jsImportCache; diff --git a/tests/auto/blackbox/testdata/multiple-configurations/file.cpp b/tests/auto/blackbox/testdata/multiple-configurations/file.cpp new file mode 100644 index 000000000..44ebc2ee3 --- /dev/null +++ b/tests/auto/blackbox/testdata/multiple-configurations/file.cpp @@ -0,0 +1,6 @@ +#include <lib.h> + +void f() +{ + l(); +} diff --git a/tests/auto/blackbox/testdata/multiple-configurations/file.h b/tests/auto/blackbox/testdata/multiple-configurations/file.h new file mode 100644 index 000000000..789447c02 --- /dev/null +++ b/tests/auto/blackbox/testdata/multiple-configurations/file.h @@ -0,0 +1 @@ +void f(); diff --git a/tests/auto/blackbox/testdata/multiple-configurations/lib.cpp b/tests/auto/blackbox/testdata/multiple-configurations/lib.cpp new file mode 100644 index 000000000..9a6145659 --- /dev/null +++ b/tests/auto/blackbox/testdata/multiple-configurations/lib.cpp @@ -0,0 +1 @@ +void l() {} diff --git a/tests/auto/blackbox/testdata/multiple-configurations/lib.h b/tests/auto/blackbox/testdata/multiple-configurations/lib.h new file mode 100644 index 000000000..f8be99ced --- /dev/null +++ b/tests/auto/blackbox/testdata/multiple-configurations/lib.h @@ -0,0 +1 @@ +void l(); diff --git a/tests/auto/blackbox/testdata/multiple-configurations/main.cpp b/tests/auto/blackbox/testdata/multiple-configurations/main.cpp new file mode 100644 index 000000000..4fa5b1f97 --- /dev/null +++ b/tests/auto/blackbox/testdata/multiple-configurations/main.cpp @@ -0,0 +1,6 @@ +#include <file.h> + +int main() +{ + f(); +} diff --git a/tests/auto/blackbox/testdata/multiple-configurations/multiple-configurations.qbs b/tests/auto/blackbox/testdata/multiple-configurations/multiple-configurations.qbs new file mode 100644 index 000000000..f8371e983 --- /dev/null +++ b/tests/auto/blackbox/testdata/multiple-configurations/multiple-configurations.qbs @@ -0,0 +1,15 @@ +import qbs + +Project { + StaticLibrary { + name: "lib" + Depends { name: "cpp" } + files: ["lib.cpp", "lib.h"] + } + CppApplication { + name: "app" + Depends { name: "lib" } + cpp.includePaths: project.sourceDirectory + files: ["file.cpp", "file.h", "main.cpp"] + } +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index 8ef77c9b4..6ace7e674 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -3910,6 +3910,35 @@ void TestBlackbox::multipleChanges() QVERIFY(m_qbsStdout.contains("prop: true")); } +void TestBlackbox::multipleConfigurations() +{ + QDir::setCurrent(testDataDir + "/multiple-configurations"); + QbsRunParameters params(QStringList{"config:x", "config:y", "config:z"}); + params.profile.clear(); + struct DefaultProfileSwitcher + { + DefaultProfileSwitcher() + { + const SettingsPtr s = settings(); + oldDefaultProfile = s->defaultProfile(); + s->setValue("defaultProfile", profileName()); + s->sync(); + } + ~DefaultProfileSwitcher() + { + const SettingsPtr s = settings(); + s->setValue("defaultProfile", oldDefaultProfile); + s->sync(); + } + QVariant oldDefaultProfile; + }; + DefaultProfileSwitcher dps; + QCOMPARE(runQbs(params), 0); + QCOMPARE(m_qbsStdout.count("compiling lib.cpp"), 3); + QCOMPARE(m_qbsStdout.count("compiling file.cpp"), 3); + QCOMPARE(m_qbsStdout.count("compiling main.cpp"), 3); +} + void TestBlackbox::nestedGroups() { QDir::setCurrent(testDataDir + "/nested-groups"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 9cf76ab5a..d0f8ab7b3 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -153,6 +153,7 @@ private slots: void missingOverridePrefix(); void movedFileDependency(); void multipleChanges(); + void multipleConfigurations(); void nestedGroups(); void nestedProperties(); void newOutputArtifact(); diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index 35f18732c..f1e21cc26 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -174,7 +174,7 @@ void TestLanguage::init() void TestLanguage::initTestCase() { m_logger = Logger(m_logSink); - m_engine = new ScriptEngine(m_logger, EvalContext::PropertyEvaluation, this); + m_engine = ScriptEngine::create(m_logger, EvalContext::PropertyEvaluation, this); loader = new Loader(m_engine, m_logger); loader->setSearchPaths(QStringList() << QLatin1String(SRCDIR "/../../../share/qbs")); |