Skip to content

Commit e146fcc

Browse files
committed
zstd, brotli: convert bracket access to unsafe_get/unsafe_set
Eliminates bounds checks in all hot paths. zstd ~205 sites, brotli ~200+ sites converted.
1 parent cdc4b80 commit e146fcc

12 files changed

Lines changed: 629 additions & 625 deletions

brotli/bitbuf.mbt

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ fn BitReader::refill(self : BitReader) -> Unit {
1919
// Fast path: load 8 bytes at once into an empty buffer
2020
let d = self.data
2121
let p = self.byte_pos
22-
self.bits = d[p].to_uint().to_uint64() |
23-
(d[p + 1].to_uint().to_uint64() << 8) |
24-
(d[p + 2].to_uint().to_uint64() << 16) |
25-
(d[p + 3].to_uint().to_uint64() << 24) |
26-
(d[p + 4].to_uint().to_uint64() << 32) |
27-
(d[p + 5].to_uint().to_uint64() << 40) |
28-
(d[p + 6].to_uint().to_uint64() << 48) |
29-
(d[p + 7].to_uint().to_uint64() << 56)
22+
self.bits = d.unsafe_get(p).to_uint().to_uint64() |
23+
(d.unsafe_get(p + 1).to_uint().to_uint64() << 8) |
24+
(d.unsafe_get(p + 2).to_uint().to_uint64() << 16) |
25+
(d.unsafe_get(p + 3).to_uint().to_uint64() << 24) |
26+
(d.unsafe_get(p + 4).to_uint().to_uint64() << 32) |
27+
(d.unsafe_get(p + 5).to_uint().to_uint64() << 40) |
28+
(d.unsafe_get(p + 6).to_uint().to_uint64() << 48) |
29+
(d.unsafe_get(p + 7).to_uint().to_uint64() << 56)
3030
self.byte_pos += 8
3131
self.n_bits = 64
3232
} else if remaining >= 7 && self.n_bits <= 8 {
@@ -35,19 +35,19 @@ fn BitReader::refill(self : BitReader) -> Unit {
3535
let p = self.byte_pos
3636
let n = self.n_bits
3737
self.bits = self.bits |
38-
(d[p].to_uint().to_uint64() << n) |
39-
(d[p + 1].to_uint().to_uint64() << (n + 8)) |
40-
(d[p + 2].to_uint().to_uint64() << (n + 16)) |
41-
(d[p + 3].to_uint().to_uint64() << (n + 24)) |
42-
(d[p + 4].to_uint().to_uint64() << (n + 32)) |
43-
(d[p + 5].to_uint().to_uint64() << (n + 40)) |
44-
(d[p + 6].to_uint().to_uint64() << (n + 48))
38+
(d.unsafe_get(p).to_uint().to_uint64() << n) |
39+
(d.unsafe_get(p + 1).to_uint().to_uint64() << (n + 8)) |
40+
(d.unsafe_get(p + 2).to_uint().to_uint64() << (n + 16)) |
41+
(d.unsafe_get(p + 3).to_uint().to_uint64() << (n + 24)) |
42+
(d.unsafe_get(p + 4).to_uint().to_uint64() << (n + 32)) |
43+
(d.unsafe_get(p + 5).to_uint().to_uint64() << (n + 40)) |
44+
(d.unsafe_get(p + 6).to_uint().to_uint64() << (n + 48))
4545
self.byte_pos += 7
4646
self.n_bits += 56
4747
} else {
4848
while self.n_bits <= 56 && self.byte_pos < self.data.length() {
4949
self.bits = self.bits |
50-
(self.data[self.byte_pos].to_uint().to_uint64() << self.n_bits)
50+
(self.data.unsafe_get(self.byte_pos).to_uint().to_uint64() << self.n_bits)
5151
self.byte_pos += 1
5252
self.n_bits += 8
5353
}
@@ -157,7 +157,7 @@ fn BitWriter::flush(self : BitWriter) -> Unit {
157157
// At most 8 bytes can be flushed (64 bits / 8)
158158
self.ensure_capacity(8)
159159
while self.n_bits >= 8 {
160-
self.buf[self.pos] = (self.bits & 0xFFUL).to_uint().to_byte()
160+
self.buf.unsafe_set(self.pos, (self.bits & 0xFFUL).to_uint().to_byte())
161161
self.pos += 1
162162
self.bits = self.bits >> 8
163163
self.n_bits -= 8
@@ -168,7 +168,7 @@ fn BitWriter::flush(self : BitWriter) -> Unit {
168168
fn BitWriter::flush_final(self : BitWriter) -> Unit {
169169
if self.n_bits > 0 {
170170
self.ensure_capacity(1)
171-
self.buf[self.pos] = (self.bits & 0xFFUL).to_uint().to_byte()
171+
self.buf.unsafe_set(self.pos, (self.bits & 0xFFUL).to_uint().to_byte())
172172
self.pos += 1
173173
self.bits = 0UL
174174
self.n_bits = 0

0 commit comments

Comments
 (0)