}
static
-vector<mmbit_sparse_iter>
-buildActiveLeftIter(const vector<LeftNfaInfo> &leftTable) {
- vector<mmbit_sparse_iter> out;
-
+u32 writeActiveLeftIter(build_context &bc,
+ const vector<LeftNfaInfo> &leftInfoTable) {
vector<u32> 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<mmbit_sparse_iter> iter;
+ mmbBuildSparseIterator(iter, keys, verify_u32(leftInfoTable.size()));
+ return bc.engine_blob.add_iterator(iter);
}
static
}
static
-u32 buildEagerQueueIter(const set<u32> &eager, u32 leftfixBeginQueue,
- u32 queue_count,
- build_context &bc) {
+u32 writeEagerQueueIter(const set<u32> &eager, u32 leftfixBeginQueue,
+ u32 queue_count, build_context &bc) {
if (eager.empty()) {
return 0;
}
&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);
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);
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);