diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-09-03 14:08:01 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-09-04 07:10:51 +0000 |
commit | 80bd4c413e03e3307b374982132779ddc80f914e (patch) | |
tree | ba399dd3aa492f63f810bae1a6e7296f6ec25fb8 | |
parent | f57ca14b2c2eeac1f7fedd863dc503be4638bee2 (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.cpp | 12 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/requestedartifacts.cpp | 9 | ||||
-rw-r--r-- | src/lib/corelib/buildgraph/requestedartifacts.h | 2 | ||||
-rw-r--r-- | src/lib/corelib/language/scriptengine.h | 4 |
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) { |