| ... | @@ -397,23 +397,17 @@ fn takeBitsEnding(d: *Decompress, comptime U: type) !U { | ... | @@ -397,23 +397,17 @@ fn takeBitsEnding(d: *Decompress, comptime U: type) !U { |
| 397 | const remaining_bits = d.remaining_bits; | 397 | const remaining_bits = d.remaining_bits; |
| 398 | const next_bits = d.next_bits; | 398 | const next_bits = d.next_bits; |
| 399 | const in = d.input; | 399 | const in = d.input; |
| 400 | var u: U = 0; | 400 | const n = in.bufferedLen(); |
| 401 | var remaining_needed_bits = @bitSizeOf(U) - remaining_bits; | 401 | assert(n < @sizeOf(usize)); |
| 402 | while (@bitSizeOf(U) >= 8 and remaining_needed_bits >= 8) { | 402 | const needed_bits = @bitSizeOf(U) - remaining_bits; |
| 403 | const byte = try in.takeByte(); | 403 | if (n * 8 < needed_bits) return error.EndOfStream; |
| 404 | u = (u << 8) | byte; | 404 | const next_int = in.takeVarInt(usize, .little, n) catch |err| switch (err) { |
| 405 | remaining_needed_bits -= 8; | 405 | error.ReadFailed => return error.ReadFailed, |
| 406 | } | 406 | error.EndOfStream => unreachable, |
| 407 | if (remaining_needed_bits == 0) { | 407 | }; |
| 408 | d.next_bits = 0; | 408 | const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits); |
| 409 | d.remaining_bits = 0; | 409 | d.next_bits = next_int >> needed_bits; |
| 410 | } else { | 410 | d.remaining_bits = @intCast(n * 8 - @as(usize, needed_bits)); |
| 411 | const byte = try in.takeByte(); | | |
| 412 | u = @intCast((@as(usize, u) << remaining_needed_bits) | (byte & ((@as(usize, 1) << remaining_needed_bits) - 1))); | | |
| 413 | d.next_bits = @as(usize, byte) >> remaining_needed_bits; | | |
| 414 | d.remaining_bits = @intCast(8 - remaining_needed_bits); | | |
| 415 | } | | |
| 416 | u = @intCast((@as(usize, u) << remaining_bits) | next_bits); | | |
| 417 | return u; | 411 | return u; |
| 418 | } | 412 | } |
| 419 | | 413 | |