diff --git a/src/nfa/castlecompile.cpp b/src/nfa/castlecompile.cpp index 3d99690a..c05cd959 100644 --- a/src/nfa/castlecompile.cpp +++ b/src/nfa/castlecompile.cpp @@ -680,7 +680,7 @@ depth findMaxWidth(const CastleProto &proto, u32 top) { return proto.repeats.at(top).bounds.max; } -CastleProto::CastleProto(const PureRepeat &pr) { +CastleProto::CastleProto(nfa_kind k, const PureRepeat &pr) : kind(k) { assert(pr.reach.any()); assert(pr.reports.size() == 1); u32 top = 0; @@ -742,6 +742,7 @@ u32 CastleProto::merge(const PureRepeat &pr) { bool mergeCastle(CastleProto &c1, const CastleProto &c2, map &top_map) { assert(&c1 != &c2); + assert(c1.kind == c2.kind); DEBUG_PRINTF("c1 has %zu repeats, c2 has %zu repeats\n", c1.repeats.size(), c2.repeats.size()); @@ -954,7 +955,7 @@ bool hasZeroMinBound(const CastleProto &proto) { return false; } -unique_ptr makeHolder(const CastleProto &proto, nfa_kind kind, +unique_ptr makeHolder(const CastleProto &proto, const CompileContext &cc) { assert(!proto.repeats.empty()); @@ -967,7 +968,7 @@ unique_ptr makeHolder(const CastleProto &proto, nfa_kind kind, } } - unique_ptr g = ue2::make_unique(kind); + auto g = ue2::make_unique(proto.kind); for (const auto &m : proto.repeats) { if (m.first >= NFA_MAX_TOP_MASKS) { diff --git a/src/nfa/castlecompile.h b/src/nfa/castlecompile.h index 73c75326..1019fb90 100644 --- a/src/nfa/castlecompile.h +++ b/src/nfa/castlecompile.h @@ -66,7 +66,7 @@ struct CompileContext; */ struct CastleProto { static constexpr size_t max_occupancy = 65536; // arbitrary limit - explicit CastleProto(const PureRepeat &pr); + CastleProto(nfa_kind k, const PureRepeat &pr); const CharReach &reach() const; /** \brief Add a new repeat. */ @@ -95,6 +95,9 @@ struct CastleProto { * so we track this explicitly instead of using repeats.size(). */ u32 next_top = 1; + + /** \brief Kind for this engine. */ + nfa_kind kind; }; std::set all_reports(const CastleProto &proto); @@ -156,7 +159,7 @@ bool requiresDedupe(const CastleProto &proto, /** * \brief Build an NGHolder from a CastleProto. */ -std::unique_ptr makeHolder(const CastleProto &castle, nfa_kind kind, +std::unique_ptr makeHolder(const CastleProto &castle, const CompileContext &cc); void remapReportsToPrograms(CastleProto &castle, const ReportManager &rm); diff --git a/src/rose/rose_build_castle.cpp b/src/rose/rose_build_castle.cpp index 83c69e70..c65e840d 100644 --- a/src/rose/rose_build_castle.cpp +++ b/src/rose/rose_build_castle.cpp @@ -77,7 +77,7 @@ void makeCastle(LeftEngInfo &left, if (isPureRepeat(h, pr) && pr.reports.size() == 1) { DEBUG_PRINTF("vertex preceded by infix repeat %s\n", pr.bounds.str().c_str()); - left.castle = make_shared(pr); + left.castle = make_shared(h.kind, pr); cache[&h] = left.castle; left.graph.reset(); } @@ -119,7 +119,7 @@ void makeCastleSuffix(RoseBuildImpl &tbi, RoseVertex v, return; } - suffix.castle = make_shared(pr); + suffix.castle = make_shared(h.kind, pr); cache[&h] = suffix.castle; suffix.graph.reset(); } @@ -264,8 +264,7 @@ bool unmakeCastles(RoseBuildImpl &tbi) { for (const auto &e : left_castles) { assert(e.first.castle()); - shared_ptr h = makeHolder(*e.first.castle(), NFA_INFIX, - tbi.cc); + shared_ptr h = makeHolder(*e.first.castle(), tbi.cc); if (!h || num_vertices(*h) > MAX_UNMAKE_VERTICES) { continue; } @@ -281,8 +280,7 @@ bool unmakeCastles(RoseBuildImpl &tbi) { for (const auto &e : suffix_castles) { assert(e.first.castle()); - shared_ptr h = makeHolder(*e.first.castle(), NFA_SUFFIX, - tbi.cc); + shared_ptr h = makeHolder(*e.first.castle(), tbi.cc); if (!h || num_vertices(*h) > MAX_UNMAKE_VERTICES) { continue; }