From 44962c454392bc87cb2713323ccace5b322329cc Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Thu, 17 Jul 2014 17:54:33 +0200 Subject: 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 --- src/lib/corelib/buildgraph/rulenode.cpp | 2 +- src/lib/corelib/buildgraph/rulesapplicator.cpp | 12 ++++++++---- src/lib/corelib/buildgraph/rulesapplicator.h | 4 +++- 3 files changed, 12 insertions(+), 6 deletions(-) (limited to 'src/lib/corelib') 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; -- cgit v1.2.3