From b6254ca11f7fb5c5cd77a9ad4e084678a08b86af Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Mon, 27 Feb 2017 16:55:02 +1100 Subject: [PATCH] rose: move active leftfix iter to engine blob --- src/rose/rose_build_bytecode.cpp | 38 ++++++++++++-------------------- 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/src/rose/rose_build_bytecode.cpp b/src/rose/rose_build_bytecode.cpp index 18df4b18..12b51757 100644 --- a/src/rose/rose_build_bytecode.cpp +++ b/src/rose/rose_build_bytecode.cpp @@ -2601,26 +2601,25 @@ u32 writeProgram(build_context &bc, RoseProgram &&program) { } static -vector -buildActiveLeftIter(const vector &leftTable) { - vector out; - +u32 writeActiveLeftIter(build_context &bc, + const vector &leftInfoTable) { vector keys; - for (size_t i = 0; i < leftTable.size(); i++) { - if (!leftTable[i].transient) { - DEBUG_PRINTF("rose %zu is active\n", i); + for (size_t i = 0; i < leftInfoTable.size(); i++) { + if (!leftInfoTable[i].transient) { + DEBUG_PRINTF("leftfix %zu is active\n", i); keys.push_back(verify_u32(i)); } } - DEBUG_PRINTF("%zu active roses\n", keys.size()); + DEBUG_PRINTF("%zu active leftfixes\n", keys.size()); if (keys.empty()) { - return out; + return 0; } - mmbBuildSparseIterator(out, keys, leftTable.size()); - return out; + vector iter; + mmbBuildSparseIterator(iter, keys, verify_u32(leftInfoTable.size())); + return bc.engine_blob.add_iterator(iter); } static @@ -5149,9 +5148,8 @@ void fillMatcherDistances(const RoseBuildImpl &build, RoseEngine *engine) { } static -u32 buildEagerQueueIter(const set &eager, u32 leftfixBeginQueue, - u32 queue_count, - build_context &bc) { +u32 writeEagerQueueIter(const set &eager, u32 leftfixBeginQueue, + u32 queue_count, build_context &bc) { if (eager.empty()) { return 0; } @@ -5372,8 +5370,9 @@ aligned_unique_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { &longLitStreamStateRequired); proto.lastByteHistoryIterOffset = buildLastByteIter(g, bc); - proto.eagerIterOffset = buildEagerQueueIter( + proto.eagerIterOffset = writeEagerQueueIter( eager_queues, proto.leftfixBeginQueue, queue_count, bc); + proto.activeLeftIterOffset = writeActiveLeftIter(bc, leftInfoTable); addSomRevNfas(bc, proto, ssm); @@ -5457,13 +5456,6 @@ aligned_unique_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { proto.nfaInfoOffset = currOffset; currOffset += sizeof(NfaInfo) * queue_count; - auto activeLeftIter = buildActiveLeftIter(leftInfoTable); - if (!activeLeftIter.empty()) { - currOffset = ROUNDUP_N(currOffset, alignof(mmbit_sparse_iter)); - proto.activeLeftIterOffset = currOffset; - currOffset += activeLeftIter.size() * sizeof(mmbit_sparse_iter); - } - proto.activeArrayCount = proto.leftfixBeginQueue; proto.activeLeftCount = verify_u32(leftInfoTable.size()); proto.rosePrefixCount = countRosePrefixes(leftInfoTable); @@ -5608,8 +5600,6 @@ aligned_unique_ptr RoseBuildImpl::buildFinalEngine(u32 minWidth) { fillLookaroundTables(ptr + proto.lookaroundTableOffset, ptr + proto.lookaroundReachOffset, bc.lookaround); - copy_bytes(ptr + engine->activeLeftIterOffset, activeLeftIter); - // Safety check: we shouldn't have written anything to the engine blob // after we copied it into the engine bytecode. assert(bc.engine_blob.size() == engineBlobSize);