mirror of
https://github.com/VectorCamp/vectorscan.git
synced 2025-11-18 18:20:35 +03:00
rose: use program offset, not final_id, in atable
This removes the need to look up the program offset in a table when handling an anchored literal match.
This commit is contained in:
committed by
Matthew Barr
parent
4dbbc4eaa5
commit
8754cbbd24
@@ -204,6 +204,28 @@ void remapAnchoredReports(RoseBuildImpl &tbi) {
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void remapIds(flat_set<ReportID> &reports, const vector<u32> &litPrograms) {
|
||||
flat_set<ReportID> new_reports;
|
||||
for (auto id : reports) {
|
||||
assert(id < litPrograms.size());
|
||||
new_reports.insert(litPrograms.at(id));
|
||||
}
|
||||
reports = move(new_reports);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Replace the reports (which are literal final_ids) in the given
|
||||
* raw_dfa with program offsets.
|
||||
*/
|
||||
static
|
||||
void remapIdsToPrograms(raw_dfa &rdfa, const vector<u32> &litPrograms) {
|
||||
for (dstate &ds : rdfa.states) {
|
||||
remapIds(ds.reports, litPrograms);
|
||||
remapIds(ds.reports_eod, litPrograms);
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void populate_holder(const simple_anchored_info &sai, const set<u32> &exit_ids,
|
||||
NGHolder *h_in) {
|
||||
@@ -826,7 +848,7 @@ vector<raw_dfa> buildAnchoredDfas(RoseBuildImpl &build) {
|
||||
|
||||
aligned_unique_ptr<anchored_matcher_info>
|
||||
buildAnchoredMatcher(RoseBuildImpl &build, vector<raw_dfa> &dfas,
|
||||
size_t *asize) {
|
||||
const vector<u32> &litPrograms, size_t *asize) {
|
||||
const CompileContext &cc = build.cc;
|
||||
|
||||
if (dfas.empty()) {
|
||||
@@ -835,6 +857,10 @@ buildAnchoredMatcher(RoseBuildImpl &build, vector<raw_dfa> &dfas,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
for (auto &rdfa : dfas) {
|
||||
remapIdsToPrograms(rdfa, litPrograms);
|
||||
}
|
||||
|
||||
vector<aligned_unique_ptr<NFA>> nfas;
|
||||
vector<u32> start_offset; // start offset for each dfa (dots removed)
|
||||
size_t total_size = buildNfas(dfas, &nfas, &start_offset, cc, build.rm);
|
||||
|
||||
Reference in New Issue
Block a user