std/jpeg: have fill_bitstream call copy_from_slice
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c index 1364331..893a1bd 100644 --- a/release/c/wuffs-unsupported-snapshot.c +++ b/release/c/wuffs-unsupported-snapshot.c
@@ -39731,7 +39731,6 @@ wuffs_jpeg__decoder__fill_bitstream( wuffs_jpeg__decoder* self, wuffs_base__io_buffer* a_src) { - uint32_t v_i = 0; uint32_t v_wi = 0; uint8_t v_c = 0; uint32_t v_n = 0; @@ -39748,22 +39747,16 @@ } if (self->private_impl.f_bitstream_ri <= 0) { - } else if (self->private_impl.f_bitstream_ri == self->private_impl.f_bitstream_wi) { + } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) { self->private_impl.f_bitstream_ri = 0; self->private_impl.f_bitstream_wi = 0; } else { - v_i = 0; - while (self->private_impl.f_bitstream_ri < self->private_impl.f_bitstream_wi) { - self->private_data.f_bitstream_buffer[v_i] = self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_ri]; - self->private_impl.f_bitstream_ri += 1; - v_i += 1; - if (v_i >= self->private_impl.f_bitstream_ri) { - goto label__0__break; - } - } - label__0__break:; + v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri); + wuffs_base__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer, + self->private_impl.f_bitstream_ri, + self->private_impl.f_bitstream_wi)); self->private_impl.f_bitstream_ri = 0; - self->private_impl.f_bitstream_wi = v_i; + self->private_impl.f_bitstream_wi = v_wi; } v_wi = self->private_impl.f_bitstream_wi; while ((v_wi < 2048) && (((uint64_t)(io2_a_src - iop_a_src)) > 0)) { @@ -39773,16 +39766,16 @@ v_wi += 1; iop_a_src += 1; } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1) { - goto label__1__break; + goto label__0__break; } else if ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8) > 0) { - goto label__1__break; + goto label__0__break; } else { self->private_data.f_bitstream_buffer[v_wi] = 255; v_wi += 1; iop_a_src += 2; } } - label__1__break:; + label__0__break:; if (((uint64_t)(io2_a_src - iop_a_src)) > 1) { if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255) && ((wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8) > 0)) { v_n = (wuffs_base__u32__min(v_wi, 2016) + 32);
diff --git a/std/jpeg/decode_jpeg.wuffs b/std/jpeg/decode_jpeg.wuffs index cdd26fd..c5b5953 100644 --- a/std/jpeg/decode_jpeg.wuffs +++ b/std/jpeg/decode_jpeg.wuffs
@@ -1233,7 +1233,6 @@ } pri func decoder.fill_bitstream!(src: base.io_reader) { - var i : base.u32[..= 0x800] var wi : base.u32[..= 0x800] var c : base.u8 var n : base.u32[..= 0x800] @@ -1241,29 +1240,15 @@ // Compact unread bytes to the start of the buffer. if this.bitstream_ri <= 0 { // No-op. - } else if this.bitstream_ri == this.bitstream_wi { + } else if this.bitstream_ri >= this.bitstream_wi { this.bitstream_ri = 0 this.bitstream_wi = 0 } else { - // TODO: have a built-in (calling memmove) to compact a slice? - i = 0 - assert i < this.bitstream_ri via "a < b: a == c; c < b"(c: 0) - while this.bitstream_ri < this.bitstream_wi, - pre i < this.bitstream_ri, - { - assert this.bitstream_ri < 0x800 via "a < b: a < c; c <= b"(c: this.bitstream_wi) - assert i < 0x800 via "a < b: a < c; c < b"(c: this.bitstream_ri) - this.bitstream_buffer[i] = this.bitstream_buffer[this.bitstream_ri] - this.bitstream_ri += 1 - i += 1 - // TODO: this if statement should be unnecessary. Instead, we - // should be able to "assert i < this.bitstream_ri". - if i >= this.bitstream_ri { - break // Unreachable. - } - } endwhile + assert this.bitstream_wi > this.bitstream_ri via "a > b: b < a"() + wi = this.bitstream_wi - this.bitstream_ri + this.bitstream_buffer[..].copy_from_slice!(s: this.bitstream_buffer[this.bitstream_ri .. this.bitstream_wi]) this.bitstream_ri = 0 - this.bitstream_wi = i + this.bitstream_wi = wi } wi = this.bitstream_wi