From dfb45705e616bdaccde0f3a2bc74414ed50fbd4e Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Sun, 12 Mar 2023 20:14:56 -0400 Subject: [PATCH] LibCompress: Make DeflateCompressor::write() use loop, not recursion This is performance-neutral, but Instruments.app had a hard time visualizing the very deeply nested stack frames here. No behavior change. --- Userland/Libraries/LibCompress/Deflate.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Userland/Libraries/LibCompress/Deflate.cpp b/Userland/Libraries/LibCompress/Deflate.cpp index 96fa7da2ec..189a0d2fa8 100644 --- a/Userland/Libraries/LibCompress/Deflate.cpp +++ b/Userland/Libraries/LibCompress/Deflate.cpp @@ -477,16 +477,18 @@ ErrorOr DeflateCompressor::write(ReadonlyBytes bytes) { VERIFY(!m_finished); - if (bytes.size() == 0) - return 0; // recursion base case + size_t total_written = 0; + while (!bytes.is_empty()) { + auto n_written = bytes.copy_trimmed_to(pending_block().slice(m_pending_block_size)); + m_pending_block_size += n_written; - auto n_written = bytes.copy_trimmed_to(pending_block().slice(m_pending_block_size)); - m_pending_block_size += n_written; + if (m_pending_block_size == block_size) + TRY(flush()); - if (m_pending_block_size == block_size) - TRY(flush()); - - return n_written + TRY(write(bytes.slice(n_written))); + bytes = bytes.slice(n_written); + total_written += n_written; + } + return total_written; } bool DeflateCompressor::is_eof() const