From 2dc1f9d62973a79cbf21f719925876e15bda4306 Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Fri, 23 Jun 2017 11:30:24 +1000 Subject: [PATCH] rose_build_matchers: fix fragment noruns calc --- src/rose/rose_build_matchers.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/rose/rose_build_matchers.cpp b/src/rose/rose_build_matchers.cpp index 836ac965..57269747 100644 --- a/src/rose/rose_build_matchers.cpp +++ b/src/rose/rose_build_matchers.cpp @@ -556,6 +556,17 @@ bool isNoRunsLiteral(const RoseBuildImpl &build, const u32 id, return true; } +static +bool isNoRunsFragment(const RoseBuildImpl &build, const LitFragment &f, + const size_t max_len) { + // For the fragment to be marked "no runs", every literal it fires must + // need no further confirmation work. + return all_of_in(f.lit_ids, [&](u32 lit_id) { + const auto &info = build.literal_info.at(lit_id); + return isNoRunsLiteral(build, lit_id, info, max_len); + }); +} + static const raw_puff &getChainedPuff(const RoseBuildImpl &build, const Report &report) { @@ -691,15 +702,15 @@ void addFragmentLiteral(const RoseBuildImpl &build, MatcherProto &mp, const LitFragment &f, u32 id, bool delay_rebuild, size_t max_len) { const rose_literal_id &lit = build.literals.at(id); - assert(id < build.literal_info.size()); - const auto &info = build.literal_info.at(id); DEBUG_PRINTF("lit='%s' (len %zu)\n", dumpString(lit.s).c_str(), lit.s.length()); vector msk = lit.msk; // copy vector cmp = lit.cmp; // copy - bool noruns = isNoRunsLiteral(build, id, info, max_len); + + bool noruns = isNoRunsFragment(build, f, max_len); + DEBUG_PRINTF("fragment is %s\n", noruns ? "noruns" : "not noruns"); auto lit_final = lit.s; // copy