aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/buildgraph
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-07-17 17:54:33 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2014-07-18 12:00:35 +0200
commit44962c454392bc87cb2713323ccace5b322329cc (patch)
treea5856223517cff9e04aea4d89751e39dd69390bb /src/lib/corelib/buildgraph
parenta451094914fe3df13d68e5c131014b82a71f7b50 (diff)
add assertion in RulesApplicator
Bail out if we try to remove an input artifact of a rule while applying this rule. This indicates a serious flaw of the calling code. Change-Id: I19110ececa02e5a795474a99f5ba911e4d2c9faa Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/corelib/buildgraph')
-rw-r--r--src/lib/corelib/buildgraph/rulenode.cpp2
-rw-r--r--src/lib/corelib/buildgraph/rulesapplicator.cpp12
-rw-r--r--src/lib/corelib/buildgraph/rulesapplicator.h4
3 files changed, 12 insertions, 6 deletions
diff --git a/src/lib/corelib/buildgraph/rulenode.cpp b/src/lib/corelib/buildgraph/rulenode.cpp
index 3e01d7050..dc9bbcb22 100644
--- a/src/lib/corelib/buildgraph/rulenode.cpp
+++ b/src/lib/corelib/buildgraph/rulenode.cpp
@@ -103,7 +103,7 @@ void RuleNode::apply(const Logger &logger, const ArtifactSet &changedInputs,
outputArtifactsToRemove += parent;
}
}
- RulesApplicator::handleRemovedRuleOutputs(outputArtifactsToRemove, logger);
+ RulesApplicator::handleRemovedRuleOutputs(inputs, outputArtifactsToRemove, logger);
}
if (!inputs.isEmpty()) {
RulesApplicator applicator(product, logger);
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.cpp b/src/lib/corelib/buildgraph/rulesapplicator.cpp
index f5d8f9da9..f256d6bd0 100644
--- a/src/lib/corelib/buildgraph/rulesapplicator.cpp
+++ b/src/lib/corelib/buildgraph/rulesapplicator.cpp
@@ -78,6 +78,7 @@ void RulesApplicator::applyRule(const RuleConstPtr &rule, const ArtifactSet &inp
return;
m_rule = rule;
+ m_completeInputSet = inputArtifacts;
if (rule->name == QLatin1String("QtCoreMocRule")) {
delete m_mocScanner;
m_mocScanner = new QtMocScanner(m_product, scope(), m_logger);
@@ -98,8 +99,8 @@ void RulesApplicator::applyRule(const RuleConstPtr &rule, const ArtifactSet &inp
}
}
-void RulesApplicator::handleRemovedRuleOutputs(ArtifactSet outputArtifactsToRemove,
- const Logger &logger)
+void RulesApplicator::handleRemovedRuleOutputs(const ArtifactSet &inputArtifacts,
+ ArtifactSet outputArtifactsToRemove, const Logger &logger)
{
ArtifactSet artifactsToRemove;
const TopLevelProject *project = 0;
@@ -119,7 +120,10 @@ void RulesApplicator::handleRemovedRuleOutputs(ArtifactSet outputArtifactsToRemo
parent->product->registerArtifactWithChangedInputs(parent);
}
EmptyDirectoriesRemover(project, logger).removeEmptyParentDirectories(artifactsToRemove);
- qDeleteAll(artifactsToRemove);
+ foreach (Artifact *artifact, artifactsToRemove) {
+ QBS_CHECK(!inputArtifacts.contains(artifact));
+ delete artifact;
+ }
}
static void copyProperty(const QString &name, const QScriptValue &src, QScriptValue dst)
@@ -164,7 +168,7 @@ void RulesApplicator::doApply(const ArtifactSet &inputArtifacts, QScriptValue &p
scope()));
ArtifactSet newOutputs = ArtifactSet::fromNodeList(outputArtifacts);
const ArtifactSet oldOutputs = collectOldOutputArtifacts(inputArtifacts);
- handleRemovedRuleOutputs(oldOutputs - newOutputs, m_logger);
+ handleRemovedRuleOutputs(m_completeInputSet, oldOutputs - newOutputs, m_logger);
} else {
foreach (const RuleArtifactConstPtr &ruleArtifact, m_rule->artifacts) {
Artifact * const outputArtifact
diff --git a/src/lib/corelib/buildgraph/rulesapplicator.h b/src/lib/corelib/buildgraph/rulesapplicator.h
index f3223410c..a43cac057 100644
--- a/src/lib/corelib/buildgraph/rulesapplicator.h
+++ b/src/lib/corelib/buildgraph/rulesapplicator.h
@@ -54,7 +54,8 @@ public:
NodeSet applyRuleInEvaluationContext(const RuleConstPtr &rule,
const ArtifactSet &inputArtifacts);
void applyRule(const RuleConstPtr &rule, const ArtifactSet &inputArtifacts);
- static void handleRemovedRuleOutputs(ArtifactSet artifactsToRemove, const Logger &logger);
+ static void handleRemovedRuleOutputs(const ArtifactSet &inputArtifacts,
+ ArtifactSet artifactsToRemove, const Logger &logger);
private:
void doApply(const ArtifactSet &inputArtifacts, QScriptValue &prepareScriptContext);
@@ -75,6 +76,7 @@ private:
const ResolvedProductPtr m_product;
NodeSet m_createdArtifacts;
RuleConstPtr m_rule;
+ ArtifactSet m_completeInputSet;
TransformerPtr m_transformer;
QtMocScanner *m_mocScanner;
Logger m_logger;