aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-09-03 14:08:01 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-09-04 07:10:51 +0000
commit80bd4c413e03e3307b374982132779ddc80f914e (patch)
treeba399dd3aa492f63f810bae1a6e7296f6ec25fb8
parentf57ca14b2c2eeac1f7fedd863dc503be4638bee2 (diff)
Fix invariant in the RequestedArtifacts class
If an artifact map is requested a second time, we need to update the set of all tags if the artifacts map has changed in the meantime. This fixes an assertion in the sanity checks. Change-Id: Iacf8d4376c7a3a356428cc7eb508dbd22e945a8c Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r--src/lib/corelib/buildgraph/artifactsscriptvalue.cpp12
-rw-r--r--src/lib/corelib/buildgraph/requestedartifacts.cpp9
-rw-r--r--src/lib/corelib/buildgraph/requestedartifacts.h2
-rw-r--r--src/lib/corelib/language/scriptengine.h4
4 files changed, 14 insertions, 13 deletions
diff --git a/src/lib/corelib/buildgraph/artifactsscriptvalue.cpp b/src/lib/corelib/buildgraph/artifactsscriptvalue.cpp
index c32e95b2a..2adb77d47 100644
--- a/src/lib/corelib/buildgraph/artifactsscriptvalue.cpp
+++ b/src/lib/corelib/buildgraph/artifactsscriptvalue.cpp
@@ -139,11 +139,11 @@ static bool checkAndSetArtifactsMapUpToDateFlag(const ResolvedProduct *p)
}
static bool checkAndSetArtifactsMapUpToDateFlag(const ResolvedModule *) { return true; }
-static void registerArtifactsMapAccess(const ResolvedProduct *p, ScriptEngine *e)
+static void registerArtifactsMapAccess(const ResolvedProduct *p, ScriptEngine *e, bool forceUpdate)
{
- e->setArtifactsMapRequested(p);
+ e->setArtifactsMapRequested(p, forceUpdate);
}
-static void registerArtifactsMapAccess(const ResolvedModule *, ScriptEngine *) {}
+static void registerArtifactsMapAccess(const ResolvedModule *, ScriptEngine *, bool) {}
static void registerArtifactsSetAccess(const ResolvedProduct *p, const FileTag &t, ScriptEngine *e)
{
e->setArtifactSetRequestedForTag(p, t);
@@ -174,10 +174,12 @@ template<class ProductOrModule> static QScriptValue js_artifactsForFileTag(
template<class ProductOrModule> static QScriptValue js_artifacts(
QScriptContext *ctx, ScriptEngine *engine, const ProductOrModule *productOrModule)
{
- registerArtifactsMapAccess(productOrModule, engine);
QScriptValue artifactsObj = ctx->callee().property(CachedValueKey);
- if (artifactsObj.isObject() && checkAndSetArtifactsMapUpToDateFlag(productOrModule))
+ if (artifactsObj.isObject() && checkAndSetArtifactsMapUpToDateFlag(productOrModule)) {
+ registerArtifactsMapAccess(productOrModule, engine, false);
return artifactsObj;
+ }
+ registerArtifactsMapAccess(productOrModule, engine, true);
artifactsObj = createArtifactsObject(productOrModule, engine);
ctx->callee().setProperty(CachedValueKey, artifactsObj);
const auto &map = artifactsMap(productOrModule);
diff --git a/src/lib/corelib/buildgraph/requestedartifacts.cpp b/src/lib/corelib/buildgraph/requestedartifacts.cpp
index 200f226ce..7fbaf65f1 100644
--- a/src/lib/corelib/buildgraph/requestedartifacts.cpp
+++ b/src/lib/corelib/buildgraph/requestedartifacts.cpp
@@ -73,13 +73,12 @@ bool RequestedArtifacts::isUpToDate(const TopLevelProject *project) const
return true;
}
-void RequestedArtifacts::setAllArtifactTags(const ResolvedProduct *product)
+void RequestedArtifacts::setAllArtifactTags(const ResolvedProduct *product, bool forceUpdate)
{
- if (m_requestedArtifactsPerProduct.find(product->uniqueName())
- != m_requestedArtifactsPerProduct.cend()) {
- return;
- }
RequestedArtifactsPerProduct &ra = m_requestedArtifactsPerProduct[product->uniqueName()];
+ if (!ra.allTags.empty() && !forceUpdate)
+ return;
+ ra.allTags.clear();
const ArtifactSetByFileTag artifactsMap = product->buildData->artifactsByFileTag();
for (auto it = artifactsMap.begin(); it != artifactsMap.end(); ++it)
ra.allTags.insert(it.key().toString());
diff --git a/src/lib/corelib/buildgraph/requestedartifacts.h b/src/lib/corelib/buildgraph/requestedartifacts.h
index 82c393803..d3804ca14 100644
--- a/src/lib/corelib/buildgraph/requestedartifacts.h
+++ b/src/lib/corelib/buildgraph/requestedartifacts.h
@@ -59,7 +59,7 @@ public:
bool isUpToDate(const TopLevelProject *project) const;
void clear() { m_requestedArtifactsPerProduct.clear(); }
- void setAllArtifactTags(const ResolvedProduct *product);
+ void setAllArtifactTags(const ResolvedProduct *product, bool forceUpdate);
void setArtifactsForTag(const ResolvedProduct *product, const FileTag &tag);
void setNonExistingTagRequested(const ResolvedProduct *product, const QString &tag);
void setArtifactsEnumerated(const ResolvedProduct *product);
diff --git a/src/lib/corelib/language/scriptengine.h b/src/lib/corelib/language/scriptengine.h
index bfe238b09..eff4cb48f 100644
--- a/src/lib/corelib/language/scriptengine.h
+++ b/src/lib/corelib/language/scriptengine.h
@@ -120,9 +120,9 @@ public:
{
m_productsWithRequestedDependencies.insert(p);
}
- void setArtifactsMapRequested(const ResolvedProduct *product)
+ void setArtifactsMapRequested(const ResolvedProduct *product, bool forceUpdate)
{
- m_requestedArtifacts.setAllArtifactTags(product);
+ m_requestedArtifacts.setAllArtifactTags(product, forceUpdate);
}
void setArtifactSetRequestedForTag(const ResolvedProduct *product, const FileTag &tag)
{