]> granicus.if.org Git - re2c/commitdiff
Inlined closure cleanup in the pruning procedure to further speedup determinization.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 8 May 2019 10:01:48 +0000 (11:01 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 8 May 2019 10:01:48 +0000 (11:01 +0100)
src/dfa/closure.cc
src/dfa/closure_leftmost.h
src/dfa/closure_posix.h

index c3b7ba51c8e98df4bb0f98b0dba065d8d1d70b16..42d68accdaeb6594f4bf7ddc983715e2f917425b 100644 (file)
@@ -141,6 +141,9 @@ void prune(ctx_t &ctx)
 
     for (i = b; i != e; ++i) {
         nfa_state_t *s = i->state;
+
+        closure_cleanup<ctx_t>(s);
+
         if (s->type == nfa_state_t::RAN) {
             buffer.push_back(*i);
         }
index 90d8acd76544abc746758659a8ce2aa176c13035..d830378e29efc84ae590cb3f4901fcec628b194a 100644 (file)
@@ -7,16 +7,12 @@
 
 namespace re2c {
 
+template<typename ctx_t> void closure_cleanup(nfa_state_t *q);
 template<typename ctx_t> static void closure_leftmost_dfs(ctx_t &ctx);
 
 inline void closure_leftmost(ldetctx_t &ctx)
 {
     closure_leftmost_dfs(ctx);
-
-    // cleanup
-    for (clositer_t i = ctx.state.begin(); i != ctx.state.end(); ++i) {
-        i->state->clos = NOCLOS;
-    }
 }
 
 template<typename ctx_t>
@@ -54,6 +50,12 @@ void closure_leftmost_dfs(ctx_t &ctx)
     }
 }
 
+template<>
+inline void closure_cleanup<ldetctx_t>(nfa_state_t *q)
+{
+    q->clos = NOCLOS;
+}
+
 } // namespace re2c
 
 #endif // _RE2C_DFA_CLOSURE_LEFTMOST_
index 86d2a879ba8be06d24af46716d7c41b00cf57df4..ffaea282c52ab6656378220d267942bc1972fb24 100644 (file)
@@ -19,6 +19,7 @@ namespace re2c
  * can just propagate the new path up to the next join point.
  */
 
+template<typename ctx_t> void closure_cleanup(nfa_state_t *q);
 template<typename ctx_t> static void closure_posix_gor1(ctx_t &);
 template<typename ctx_t> static void closure_posix_gtop(ctx_t &);
 
@@ -41,15 +42,6 @@ inline void closure_posix(pdetctx_t &ctx)
     }
 
     DDUMP_CLSTATS(ctx);
-
-    // cleanup
-    closure_t &cl = ctx.state;
-    for (clositer_t i = cl.begin(); i != cl.end(); ++i) {
-        nfa_state_t *q = i->state;
-        q->clos = NOCLOS;
-        q->arcidx = 0;
-        DASSERT(q->status == GOR_NOPASS && q->active == 0);
-    }
 }
 
 template<typename ctx_t>
@@ -307,6 +299,14 @@ void relax_gtop(ctx_t &ctx, const typename ctx_t::conf_t &c)
     }
 }
 
+template<>
+inline void closure_cleanup<pdetctx_t>(nfa_state_t *q)
+{
+    q->clos = NOCLOS;
+    q->arcidx = 0;
+    DASSERT(q->status == GOR_NOPASS && q->active == 0);
+}
+
 } // namespace re2c
 
 #endif // _RE2C_DFA_CLOSURE_POSIX_