AK: Skip vcalls to Stream::read_value and read_until_filled in LEB128

...for the first byte.
This function only really needs to read a single byte at that point, so
read_until_filled() is useless and read_value<u8> is functionally
equivalent to just a read.

This showed up hot in a wasm parse benchmark.
This commit is contained in:
Ali Mohammad Pur 2025-06-06 14:16:49 +02:00 committed by Ali Mohammad Pur
commit 2cd4b4e28d
Notes: github-actions[bot] 2025-08-08 10:56:32 +00:00

View file

@ -28,7 +28,18 @@ public:
requires(Unsigned<ValueType>)
{
// First byte is unrolled for speed
auto byte = TRY(stream.read_value<u8>());
u8 byte;
do {
auto result = stream.read_some({ &byte, 1 });
if (result.is_error() && result.error().is_errno() && (result.error().code() == EAGAIN || result.error().code() == EINTR))
continue;
if (result.is_error())
return result.release_error();
if (result.value().size() != 1)
return Error::from_string_literal("EOF reached before expected end");
break;
} while (true);
if ((byte & 0x80) == 0)
return LEB128<ValueType> { byte };