From: Justin Viiret Date: Mon, 4 Jan 2016 05:02:20 +0000 (+1100) Subject: roseRunProgram: iter state on stack X-Git-Tag: v4.2.0^2~197 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fc4289dbe648c4ff6a1e6016e933e361ed38ffc;p=thirdparty%2Fvectorscan.git roseRunProgram: iter state on stack --- diff --git a/src/rose/program_runtime.h b/src/rose/program_runtime.h index 08dbff1f..26cfce5f 100644 --- a/src/rose/program_runtime.h +++ b/src/rose/program_runtime.h @@ -804,6 +804,10 @@ hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t, u32 programOffset, u64a som = 0; + // Local sparse iterator state for programs that use the SPARSE_ITER_BEGIN + // and SPARSE_ITER_NEXT instructions. + struct mmbit_sparse_state si_state[MAX_SPARSE_ITER_STATES]; + assert(*(const u8 *)pc != ROSE_INSTR_END); for (;;) { @@ -997,13 +1001,10 @@ hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t, u32 programOffset, getByOffset(t, ri->iter_offset); assert(ISALIGNED(it)); - struct hs_scratch *scratch = tctxtToScratch(tctxt); - struct mmbit_sparse_state *s = scratch->sparse_iter_state; - u32 idx = 0; u32 i = mmbit_sparse_iter_begin(getRoleState(tctxt->state), t->rolesWithStateCount, &idx, - it, s); + it, si_state); if (i == MMB_INVALID) { DEBUG_PRINTF("no states in sparse iter are on\n"); assert(ri->fail_jump); // must progress @@ -1011,6 +1012,7 @@ hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t, u32 programOffset, continue; } + struct hs_scratch *scratch = tctxtToScratch(tctxt); fatbit_clear(scratch->handled_roles); const u32 *jumps = getByOffset(t, ri->jump_table); @@ -1028,13 +1030,10 @@ hwlmcb_rv_t roseRunProgram(const struct RoseEngine *t, u32 programOffset, getByOffset(t, ri->iter_offset); assert(ISALIGNED(it)); - struct hs_scratch *scratch = tctxtToScratch(tctxt); - struct mmbit_sparse_state *s = scratch->sparse_iter_state; - u32 idx = 0; u32 i = mmbit_sparse_iter_next(getRoleState(tctxt->state), t->rolesWithStateCount, - ri->state, &idx, it, s); + ri->state, &idx, it, si_state); if (i == MMB_INVALID) { DEBUG_PRINTF("no more states in sparse iter are on\n"); assert(ri->fail_jump); // must progress