aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language/projectresolver.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-11-20 16:00:03 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2017-11-23 10:31:32 +0000
commit846b4ece2a8dcb6b407edbf9d0b23095e15f4566 (patch)
tree8409603af9a27243d388729b8e3b3014a9481b28 /src/lib/corelib/language/projectresolver.cpp
parente9b79f0d5165dc71dac10ed76b5fa06508672605 (diff)
Share ScriptFunction objects between products
The source code of script functions does not differ among module instantiations, so there's no need to give each product its own copy. For example, resolving the QtCreator super project now allocates about 80 of these objects, rather than 16000, each of which had their own unshared copy of the script source code. Change-Id: I10d67991ce170826346d434fe58ea6608fa18a1f Reviewed-by: Jake Petroules <jake.petroules@qt.io>
Diffstat (limited to 'src/lib/corelib/language/projectresolver.cpp')
-rw-r--r--src/lib/corelib/language/projectresolver.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index 424560a24..ba6ce1673 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -518,10 +518,10 @@ void ProjectResolver::resolveModule(const QualifiedId &moduleName, Item *item, b
module->name = moduleName.toString();
module->isProduct = isProduct;
module->product = m_productContext->product.get();
- module->setupBuildEnvironmentScript = scriptFunctionValue(item,
- QLatin1String("setupBuildEnvironment"));
- module->setupRunEnvironmentScript = scriptFunctionValue(item,
- QLatin1String("setupRunEnvironment"));
+ module->setupBuildEnvironmentScript.initialize(
+ scriptFunctionValue(item, QLatin1String("setupBuildEnvironment")));
+ module->setupRunEnvironmentScript.initialize(
+ scriptFunctionValue(item, QLatin1String("setupRunEnvironment")));
for (const Item::Module &m : item->modules()) {
if (m_evaluator->boolValue(m.item, QLatin1String("present")))
@@ -840,9 +840,10 @@ QString ProjectResolver::sourceCodeForEvaluation(const JSSourceValueConstPtr &va
ScriptFunctionPtr ProjectResolver::scriptFunctionValue(Item *item, const QString &name) const
{
- ScriptFunctionPtr script = ScriptFunction::create();
JSSourceValuePtr value = item->sourceProperty(name);
- if (value) {
+ ScriptFunctionPtr &script = m_scriptFunctionMap[value ? value->location() : CodeLocation()];
+ if (!script.get()) {
+ script = ScriptFunction::create();
const PropertyDeclaration decl = item->propertyDeclaration(name);
script->sourceCode = sourceCodeAsFunction(value, decl);
script->location = value->location();
@@ -880,9 +881,10 @@ void ProjectResolver::resolveRule(Item *item, ProjectContext *projectContext)
}
rule->name = m_evaluator->stringValue(item, QLatin1String("name"));
- rule->prepareScript = scriptFunctionValue(item, QLatin1String("prepare"));
- rule->outputArtifactsScript = scriptFunctionValue(item, QLatin1String("outputArtifacts"));
- if (rule->outputArtifactsScript->isValid()) {
+ rule->prepareScript.initialize(scriptFunctionValue(item, QLatin1String("prepare")));
+ rule->outputArtifactsScript.initialize(scriptFunctionValue(item,
+ QLatin1String("outputArtifacts")));
+ if (rule->outputArtifactsScript.isValid()) {
if (hasArtifactChildren)
throw ErrorInfo(Tr::tr("The Rule.outputArtifacts script is not allowed in rules "
"that contain Artifact items."),
@@ -1024,8 +1026,8 @@ void ProjectResolver::resolveScanner(Item *item, ProjectResolver::ProjectContext
scanner->module = m_moduleContext ? m_moduleContext->module : projectContext->dummyModule;
scanner->inputs = m_evaluator->fileTagsValue(item, QLatin1String("inputs"));
scanner->recursive = m_evaluator->boolValue(item, QLatin1String("recursive"));
- scanner->searchPathsScript = scriptFunctionValue(item, QLatin1String("searchPaths"));
- scanner->scanScript = scriptFunctionValue(item, QLatin1String("scan"));
+ scanner->searchPathsScript.initialize(scriptFunctionValue(item, QLatin1String("searchPaths")));
+ scanner->scanScript.initialize(scriptFunctionValue(item, QLatin1String("scan")));
m_productContext->product->scanners.push_back(scanner);
}