summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/build_engine/expression/target_result.cpp52
-rw-r--r--src/buildtool/build_engine/target_map/target_cache.cpp32
-rw-r--r--src/buildtool/main/version.cpp2
3 files changed, 50 insertions, 36 deletions
diff --git a/src/buildtool/build_engine/expression/target_result.cpp b/src/buildtool/build_engine/expression/target_result.cpp
index cfc8b1fe..33df5dfb 100644
--- a/src/buildtool/build_engine/expression/target_result.cpp
+++ b/src/buildtool/build_engine/expression/target_result.cpp
@@ -138,8 +138,28 @@ auto SerializeTargetResultWithReplacement(
}
else if (expr->IsResult()) {
provided_results->emplace_back(id);
- json = SerializeTargetResultWithReplacement(expr->Result(),
- replacements);
+ auto const& result = expr->Result();
+ auto artifact_stage = SerializeExpression(nodes,
+ provided_artifacts,
+ provided_nodes,
+ provided_results,
+ result.artifact_stage,
+ replacements);
+ auto runfiles = SerializeExpression(nodes,
+ provided_artifacts,
+ provided_nodes,
+ provided_results,
+ result.runfiles,
+ replacements);
+ auto provides = SerializeExpression(nodes,
+ provided_artifacts,
+ provided_nodes,
+ provided_results,
+ result.provides,
+ replacements);
+ json = nlohmann::json({{"artifact_stage", artifact_stage},
+ {"runfiles", runfiles},
+ {"provides", provides}});
}
else if (expr->IsArtifact()) {
provided_artifacts->emplace_back(id);
@@ -217,11 +237,29 @@ auto SerializeTargetResultWithReplacement(
return ExpressionPtr{nullptr};
}
if (provided_results.contains(id)) {
- auto result = TargetResult::FromJson(json);
- if (result) {
- auto result_exp = ExpressionPtr{*result};
- sofar->emplace(id, result_exp);
- return result_exp;
+ auto artifact_stage = DeserializeExpression(json["artifact_stage"],
+ nodes,
+ provided_artifacts,
+ provided_nodes,
+ provided_results,
+ sofar);
+ auto runfiles = DeserializeExpression(json["runfiles"],
+ nodes,
+ provided_artifacts,
+ provided_nodes,
+ provided_results,
+ sofar);
+ auto provides = DeserializeExpression(json["provides"],
+ nodes,
+ provided_artifacts,
+ provided_nodes,
+ provided_results,
+ sofar);
+ if (artifact_stage and runfiles and provides) {
+ return ExpressionPtr{TargetResult{std::move(artifact_stage),
+ std::move(provides),
+ std::move(runfiles),
+ /*is_cacheable=*/true}};
}
return ExpressionPtr{nullptr};
}
diff --git a/src/buildtool/build_engine/target_map/target_cache.cpp b/src/buildtool/build_engine/target_map/target_cache.cpp
index f1a0c750..b2f3b209 100644
--- a/src/buildtool/build_engine/target_map/target_cache.cpp
+++ b/src/buildtool/build_engine/target_map/target_cache.cpp
@@ -92,12 +92,6 @@ auto TargetCache::Entry::ToResult() const noexcept
return true;
}
-// Function prototype for recursive call in ScanProvidesMap
-auto ScanTargetResult(
- gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& /*infos*/,
- nlohmann::json const& /*json*/) -> bool;
-
-// NOLINTNEXTLINE(misc-no-recursion)
[[nodiscard]] auto ScanProvidesMap(
gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& infos,
nlohmann::json const& json) -> bool {
@@ -105,8 +99,6 @@ auto ScanTargetResult(
return false;
}
auto const& nodes = json["nodes"];
-
- // Process provided artifacts
auto const& provided_artifacts = json["provided_artifacts"];
infos->reserve(infos->size() + provided_artifacts.size());
std::transform(
@@ -116,32 +108,16 @@ auto ScanTargetResult(
[&nodes](auto const& item) {
return ToObjectInfo(nodes[item.template get<std::string>()]);
});
-
- // Process provided results
- auto const& provided_results = json["provided_results"];
- return std::all_of(provided_results.begin(),
- provided_results.end(),
- // NOLINTNEXTLINE(misc-no-recursion)
- [&infos, &nodes](auto const& item) {
- return ScanTargetResult(
- infos, nodes[item.template get<std::string>()]);
- });
-}
-
-// NOLINTNEXTLINE(misc-no-recursion)
-[[nodiscard]] auto ScanTargetResult(
- gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& infos,
- nlohmann::json const& result) -> bool {
- return ScanArtifactMap(infos, result["artifacts"]) and
- ScanArtifactMap(infos, result["runfiles"]) and
- ScanProvidesMap(infos, result["provides"]);
+ return true;
}
auto TargetCache::Entry::ToArtifacts(
gsl::not_null<std::vector<Artifact::ObjectInfo>*> const& infos)
const noexcept -> bool {
try {
- if (ScanTargetResult(infos, desc_)) {
+ if (ScanArtifactMap(infos, desc_["artifacts"]) and
+ ScanArtifactMap(infos, desc_["runfiles"]) and
+ ScanProvidesMap(infos, desc_["provides"])) {
return true;
}
} catch (std::exception const& ex) {
diff --git a/src/buildtool/main/version.cpp b/src/buildtool/main/version.cpp
index 08da2cf3..748c491c 100644
--- a/src/buildtool/main/version.cpp
+++ b/src/buildtool/main/version.cpp
@@ -21,7 +21,7 @@ auto version() -> std::string {
std::size_t major = 1;
std::size_t minor = 0;
std::size_t revision = 0;
- std::string suffix = "~beta3";
+ std::string suffix = "~beta4";
#ifdef VERSION_EXTRA_SUFFIX
suffix += VERSION_EXTRA_SUFFIX;
#endif