diff --git a/src/rose/block.c b/src/rose/block.c index cfcb8341..b3833d4b 100644 --- a/src/rose/block.c +++ b/src/rose/block.c @@ -233,7 +233,7 @@ void roseBlockExec_i(const struct RoseEngine *t, struct hs_scratch *scratch, if (ftable) { DEBUG_PRINTF("ftable fd=%u fmd %u\n", t->floatingDistance, t->floatingMinDistance); - if (t->noFloatingRoots && tctxt->depth == 1) { + if (t->noFloatingRoots && !roseHasInFlightMatches(t, state, scratch)) { DEBUG_PRINTF("skip FLOATING: no inflight matches\n"); goto exit; } diff --git a/src/rose/match.h b/src/rose/match.h index 19a07c9a..59d83a42 100644 --- a/src/rose/match.h +++ b/src/rose/match.h @@ -299,4 +299,25 @@ void roseFlushLastByteHistory(const struct RoseEngine *t, u8 *state, mmbit_sparse_iter_unset(role_state, numStates, it, si_state); } +static rose_inline +int roseHasInFlightMatches(const struct RoseEngine *t, u8 *state, + const struct hs_scratch *scratch) { + if (scratch->al_log_sum) { + DEBUG_PRINTF("anchored literals in log\n"); + return 1; + } + + if (scratch->tctxt.filledDelayedSlots) { + DEBUG_PRINTF("delayed literal\n"); + return 1; + } + + if (mmbit_any(getRoleState(state), t->rolesWithStateCount)) { + DEBUG_PRINTF("role state is set\n"); + return 1; + } + + return 0; +} + #endif diff --git a/src/rose/stream.c b/src/rose/stream.c index ab23346a..ae119bcf 100644 --- a/src/rose/stream.c +++ b/src/rose/stream.c @@ -502,7 +502,7 @@ void roseStreamExec(const struct RoseEngine *t, u8 *state, const struct HWLM *ftable = getFLiteralMatcher(t); if (ftable) { - if (t->noFloatingRoots && tctxt->depth == 1) { + if (t->noFloatingRoots && !roseHasInFlightMatches(t, state, scratch)) { DEBUG_PRINTF("skip FLOATING: no inflight matches\n"); goto flush_delay_and_exit; }