From: Ulya Trofimovich Date: Thu, 28 Feb 2019 10:57:10 +0000 (+0000) Subject: Avoid allocating new scratch buffer for each closure, reuse the same buffer. X-Git-Tag: 1.2~135 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=23ff9e8206689fa684b2a44a6c605fb57f63b433;p=re2c Avoid allocating new scratch buffer for each closure, reuse the same buffer. --- diff --git a/re2c/src/dfa/closure_posix.cc b/re2c/src/dfa/closure_posix.cc index b4cf096a..9059a74a 100644 --- a/re2c/src/dfa/closure_posix.cc +++ b/re2c/src/dfa/closure_posix.cc @@ -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(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 diff --git a/re2c/src/dfa/determinization.cc b/re2c/src/dfa/determinization.cc index 9f07e12a..244504a1 100644 --- a/re2c/src/dfa/determinization.cc +++ b/re2c/src/dfa/determinization.cc @@ -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::iterator diff --git a/re2c/src/dfa/determinization.h b/re2c/src/dfa/determinization.h index 465d5254..cca59645 100644 --- a/re2c/src/dfa/determinization.h +++ b/re2c/src/dfa/determinization.h @@ -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); };