]> granicus.if.org Git - re2c/commitdiff
Avoid allocating new scratch buffer for each closure, reuse the same buffer.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 28 Feb 2019 10:57:10 +0000 (10:57 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 28 Feb 2019 10:57:10 +0000 (10:57 +0000)
re2c/src/dfa/closure_posix.cc
re2c/src/dfa/determinization.cc
re2c/src/dfa/determinization.h

index b4cf096af890f78679f79a035121f20907f29efa..9059a74a9479affc996640371b3648888812d33c 100644 (file)
@@ -299,7 +299,7 @@ void orders(determ_context_t &ctx)
     closure_t &closure = ctx.dc_closure;
     const size_t nclos = closure.size();
 
-    prectable_t *prectbl = ctx.dc_allocator.alloct<prectable_t>(nclos * nclos);
+    prectable_t *prectbl = ctx.dc_prectbl;
     static const int32_t P0 = pack(MAX_RHO, 0);
 
     for (size_t i = 0; i < nclos; ++i) {
@@ -311,8 +311,6 @@ void orders(determ_context_t &ctx)
         }
         prectbl[i * nclos + i] = P0;
     }
-
-    ctx.dc_prectbl = prectbl;
 }
 
 } // namespace re2c
index 9f07e12a150a9a119e71c7aa0aa69790abdd58b5..244504a16e9847c8e47c160600555a54da43447d 100644 (file)
@@ -223,7 +223,7 @@ determ_context_t::determ_context_t(const opt_t *opts, Msg &msg
     , dc_actions(NULL)
     , dc_reached()
     , dc_closure()
-    , dc_prectbl(NULL)
+    , dc_prectbl()
     , dc_tagvertbl(nfa.tags.size())
     , dc_taghistory()
     , dc_kernels()
@@ -243,7 +243,9 @@ determ_context_t::determ_context_t(const opt_t *opts, Msg &msg
     , dc_dump(opts)
     , dc_clstats()
 {
-    const size_t nstates = nfa.size, ntags = nfa.tags.size();
+    const size_t nstates = nfa.size;
+    const size_t ncores = nfa.ncores;
+    const size_t ntags = nfa.tags.size();
 
     dc_hc_caches.resize(ntags);
     dc_path1.reserve(ntags);
@@ -251,7 +253,11 @@ determ_context_t::determ_context_t(const opt_t *opts, Msg &msg
     dc_path3.reserve(ntags);
     dc_tagcount.resize(ntags);
 
-    if (opts->posix_closure) {
+    if (opts->posix_semantics) {
+        dc_prectbl = new prectable_t[ncores * ncores];
+    }
+
+    if (opts->posix_closure == POSIX_CLOSURE_GTOP) {
         dc_gtop_buffer.reserve(nstates);
     }
     else {
@@ -261,6 +267,12 @@ determ_context_t::determ_context_t(const opt_t *opts, Msg &msg
 }
 
 
+determ_context_t::~determ_context_t()
+{
+    delete[] dc_prectbl;
+}
+
+
 dfa_t::~dfa_t()
 {
     std::vector<dfa_state_t*>::iterator
index 465d5254e2db37d9f17f4b218399f83583b8ea6e..cca596453212a8a267144c9cab5afe443ba239b1 100644 (file)
@@ -156,6 +156,7 @@ struct determ_context_t
     closure_stats_t          dc_clstats;
 
     determ_context_t(const opt_t *, Msg &, const std::string &, const nfa_t &, dfa_t &);
+    ~determ_context_t();
     FORBID_COPY(determ_context_t);
 };