limex: make NFAAccept::squash rel to LimEx base

This commit is contained in:
Justin Viiret 2016-09-05 09:56:58 +10:00 committed by Matthew Barr
parent 77fe1ef6e5
commit 5e3fa7a266
3 changed files with 15 additions and 21 deletions

View File

@ -115,8 +115,7 @@ void SQUASH_UNTUG_BR_FN(const IMPL_NFA_T *limex,
static really_inline static really_inline
char PROCESS_ACCEPTS_IMPL_FN(const IMPL_NFA_T *limex, const STATE_T *s, char PROCESS_ACCEPTS_IMPL_FN(const IMPL_NFA_T *limex, const STATE_T *s,
STATE_T *squash, const ENG_STATE_T *squashMasks, STATE_T *squash, const STATE_T *acceptMask,
const STATE_T *acceptMask,
const struct NFAAccept *acceptTable, u64a offset, const struct NFAAccept *acceptTable, u64a offset,
NfaCallback callback, void *context) { NfaCallback callback, void *context) {
assert(s); assert(s);
@ -151,10 +150,9 @@ char PROCESS_ACCEPTS_IMPL_FN(const IMPL_NFA_T *limex, const STATE_T *s,
return 1; return 1;
} }
if (squash != NULL && a->squash != MO_INVALID_IDX) { if (squash != NULL && a->squash != MO_INVALID_IDX) {
assert(squashMasks); DEBUG_PRINTF("applying squash mask at offset %u\n", a->squash);
assert(a->squash < limex->squashCount); const ENG_STATE_T *sq =
const ENG_STATE_T *sq = &squashMasks[a->squash]; (const ENG_STATE_T *)((const char *)limex + a->squash);
DEBUG_PRINTF("squash mask %u @ %p\n", a->squash, sq);
*squash = AND_STATE(*squash, LOAD_FROM_ENG(sq)); *squash = AND_STATE(*squash, LOAD_FROM_ENG(sq));
} }
} }
@ -171,11 +169,8 @@ char PROCESS_ACCEPTS_FN(const IMPL_NFA_T *limex, STATE_T *s,
NfaCallback callback, void *context) { NfaCallback callback, void *context) {
// We have squash masks we might have to apply after firing reports. // We have squash masks we might have to apply after firing reports.
STATE_T squash = ONES_STATE; STATE_T squash = ONES_STATE;
const ENG_STATE_T *squashMasks = (const ENG_STATE_T *) return PROCESS_ACCEPTS_IMPL_FN(limex, s, &squash, acceptMask, acceptTable,
((const char *)limex + limex->squashOffset); offset, callback, context);
return PROCESS_ACCEPTS_IMPL_FN(limex, s, &squash, squashMasks, acceptMask,
acceptTable, offset, callback, context);
*s = AND_STATE(*s, squash); *s = AND_STATE(*s, squash);
} }
@ -187,10 +182,8 @@ char PROCESS_ACCEPTS_NOSQUASH_FN(const IMPL_NFA_T *limex, const STATE_T *s,
u64a offset, NfaCallback callback, u64a offset, NfaCallback callback,
void *context) { void *context) {
STATE_T *squash = NULL; STATE_T *squash = NULL;
const ENG_STATE_T *squashMasks = NULL; return PROCESS_ACCEPTS_IMPL_FN(limex, s, squash, acceptMask, acceptTable,
offset, callback, context);
return PROCESS_ACCEPTS_IMPL_FN(limex, s, squash, squashMasks, acceptMask,
acceptTable, offset, callback, context);
} }
// Run EOD accepts. Note that repeat_ctrl and repeat_state may be NULL if this // Run EOD accepts. Note that repeat_ctrl and repeat_state may be NULL if this

View File

@ -2020,12 +2020,13 @@ struct Factory {
maskSetBits(limex->accept, acceptMask); maskSetBits(limex->accept, acceptMask);
maskSetBits(limex->acceptAtEOD, acceptEodMask); maskSetBits(limex->acceptAtEOD, acceptEodMask);
// Transforms the index into the report list into an offset relative to // Transforms the indices (report list, squash mask) into offsets
// the base of the limex. // relative to the base of the limex.
auto report_offset_fn = [&](NFAAccept a) { auto transform_offset_fn = [&](NFAAccept a) {
if (!a.single_report) { if (!a.single_report) {
a.reports = reportListOffset + a.reports * sizeof(ReportID); a.reports = reportListOffset + a.reports * sizeof(ReportID);
} }
a.squash = squashOffset + a.squash * sizeof(tableRow_t);
return a; return a;
}; };
@ -2036,7 +2037,7 @@ struct Factory {
NFAAccept *acceptsTable = (NFAAccept *)(limex_base + acceptsOffset); NFAAccept *acceptsTable = (NFAAccept *)(limex_base + acceptsOffset);
assert(ISALIGNED(acceptsTable)); assert(ISALIGNED(acceptsTable));
transform(accepts.begin(), accepts.end(), acceptsTable, transform(accepts.begin(), accepts.end(), acceptsTable,
report_offset_fn); transform_offset_fn);
// Write eod accept table. // Write eod accept table.
limex->acceptEodOffset = acceptsEodOffset; limex->acceptEodOffset = acceptsEodOffset;
@ -2045,7 +2046,7 @@ struct Factory {
NFAAccept *acceptsEodTable = (NFAAccept *)(limex_base + acceptsEodOffset); NFAAccept *acceptsEodTable = (NFAAccept *)(limex_base + acceptsEodOffset);
assert(ISALIGNED(acceptsEodTable)); assert(ISALIGNED(acceptsEodTable));
transform(acceptsEod.begin(), acceptsEod.end(), acceptsEodTable, transform(acceptsEod.begin(), acceptsEod.end(), acceptsEodTable,
report_offset_fn); transform_offset_fn);
// Write squash mask table. // Write squash mask table.
limex->squashCount = verify_u32(squash.size()); limex->squashCount = verify_u32(squash.size());

View File

@ -192,7 +192,7 @@ struct NFAAccept {
*/ */
u32 reports; u32 reports;
u32 squash; //!< Offset into squash masks, or MO_INVALID_IDX. u32 squash; //!< Offset (from LimEx) into squash masks, or MO_INVALID_IDX.
}; };
#endif #endif