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