From cc32dd207530e0e9a202c01d832e808525f808d9 Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 12 Mar 2026 20:08:19 +0100 Subject: [PATCH] refactor: optimize decodeUIntLength to iterate instead of recursing --- src/cbor.zig | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/cbor.zig b/src/cbor.zig index 52c40f9..8ae94d1 100644 --- a/src/cbor.zig +++ b/src/cbor.zig @@ -339,21 +339,12 @@ pub fn decodeType(iter: *[]const u8) error{TooShort}!CborType { return .{ .type = type_, .minor = bits.minor, .major = bits.major }; } -fn decodeUIntLengthRecurse(iter: *[]const u8, length: usize, acc: u64) error{TooShort}!u64 { - if (iter.len < 1) - return error.TooShort; - const v: u8 = iter.*[0]; - iter.* = iter.*[1..]; - var i = acc | v; - if (length == 1) - return i; - i <<= 8; - // return @call(.always_tail, decodeUIntLengthRecurse, .{ iter, length - 1, i }); FIXME: @call(.always_tail) seems broken as of 0.11.0-dev.2964+e9cbdb2cf - return decodeUIntLengthRecurse(iter, length - 1, i); -} - -fn decodeUIntLength(iter: *[]const u8, length: usize) !u64 { - return decodeUIntLengthRecurse(iter, length, 0); +fn decodeUIntLength(iter: *[]const u8, length: usize) error{TooShort}!u64 { + if (iter.len < length) return error.TooShort; + var acc: u64 = 0; + for (iter.*[0..length]) |byte| acc = (acc << 8) | byte; + iter.* = iter.*[length..]; + return acc; } fn decodePInt(iter: *[]const u8, minor: u5) error{ TooShort, InvalidPIntType }!u64 {