]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
castle: add nfa kind to CastleProto
authorJustin Viiret <justin.viiret@intel.com>
Tue, 19 Apr 2016 03:51:41 +0000 (13:51 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Wed, 18 May 2016 06:21:03 +0000 (16:21 +1000)
src/nfa/castlecompile.cpp
src/nfa/castlecompile.h
src/rose/rose_build_castle.cpp

index 3d99690a3ba9a04b0e084f515867db60f9b70c1b..c05cd9591ba0d007214d8710183e32658ebc752e 100644 (file)
@@ -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<u32, u32> &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<NGHolder> makeHolder(const CastleProto &proto, nfa_kind kind,
+unique_ptr<NGHolder> makeHolder(const CastleProto &proto,
                                 const CompileContext &cc) {
     assert(!proto.repeats.empty());
 
@@ -967,7 +968,7 @@ unique_ptr<NGHolder> makeHolder(const CastleProto &proto, nfa_kind kind,
         }
     }
 
-    unique_ptr<NGHolder> g = ue2::make_unique<NGHolder>(kind);
+    auto g = ue2::make_unique<NGHolder>(proto.kind);
 
     for (const auto &m : proto.repeats) {
         if (m.first >= NFA_MAX_TOP_MASKS) {
index 73c753268c1852bb7060ef55553e7b4eb1a06771..1019fb90b0e2ec7d1ba89bae3efb92570af8bc00 100644 (file)
@@ -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<ReportID> all_reports(const CastleProto &proto);
@@ -156,7 +159,7 @@ bool requiresDedupe(const CastleProto &proto,
 /**
  * \brief Build an NGHolder from a CastleProto.
  */
-std::unique_ptr<NGHolder> makeHolder(const CastleProto &castle, nfa_kind kind,
+std::unique_ptr<NGHolder> makeHolder(const CastleProto &castle,
                                      const CompileContext &cc);
 
 void remapReportsToPrograms(CastleProto &castle, const ReportManager &rm);
index 83c69e7089c31d902fefc6bb03bfc1419f6de710..c65e840d880c7802ca120962b0a3338c57ac56a5 100644 (file)
@@ -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<CastleProto>(pr);
+        left.castle = make_shared<CastleProto>(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<CastleProto>(pr);
+        suffix.castle = make_shared<CastleProto>(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<NGHolder> h = makeHolder(*e.first.castle(), NFA_INFIX,
-                                            tbi.cc);
+        shared_ptr<NGHolder> 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<NGHolder> h = makeHolder(*e.first.castle(), NFA_SUFFIX,
-                                            tbi.cc);
+        shared_ptr<NGHolder> h = makeHolder(*e.first.castle(), tbi.cc);
         if (!h || num_vertices(*h) > MAX_UNMAKE_VERTICES) {
             continue;
         }