From 2cd4b4e28d1a732bc1e5c0e85eda932d1a1372a6 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Fri, 6 Jun 2025 14:16:49 +0200 Subject: [PATCH] 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 is functionally equivalent to just a read. This showed up hot in a wasm parse benchmark. --- AK/LEB128.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/AK/LEB128.h b/AK/LEB128.h index 5a09266e623..920d3e7437f 100644 --- a/AK/LEB128.h +++ b/AK/LEB128.h @@ -28,7 +28,18 @@ public: requires(Unsigned) { // First byte is unrolled for speed - auto byte = TRY(stream.read_value()); + 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 { byte };