Move some struct fields to private_data
This means that they are not zero'ed by the initialize methods, which
improves some benchmark numbers. There is a trade-off here, as bugs in
the *.wuffs code could then mean that we are potentially reading
uninitialized memory (bulk data fields). Nonetheless, on some
micro-benchmarks, the relative performance gain on skipping this fixed
cost is stark, up to +96% throughput, or equivalently, -49% in time per
operation.
Callers of the Wuffs libraries have the option to zero-initialize the
entire state (and then pass WUFFS_INITIALIZE__ALREADY_ZEROED) or to
zero-initialize private_impl state but not private_data state (i.e. skip
the bulk data fields).
The numbers below are in two sections: throughput (e.g. MB/s) and time
per operation. Relatively large gains in throughput (e.g. +96%) can
correspond to small absolute gains (e.g. it's the difference between an
operation taking 2.02µs instead of 3.98µs).
--------
name old speed new speed delta
wuffs_adler32_10k/clang5 2.43GB/s ± 0% 2.44GB/s ± 0% +0.13% (p=0.000 n=47+48)
wuffs_adler32_100k/clang5 2.44GB/s ± 0% 2.44GB/s ± 1% +0.10% (p=0.001 n=45+47)
wuffs_adler32_10k/gcc7 3.24GB/s ± 0% 3.24GB/s ± 0% ~ (p=0.933 n=47+46)
wuffs_adler32_100k/gcc7 3.25GB/s ± 0% 3.25GB/s ± 1% ~ (p=0.551 n=42+47)
wuffs_crc32_ieee_10k/clang5 2.87GB/s ± 0% 2.87GB/s ± 0% ~ (p=0.519 n=45+46)
wuffs_crc32_ieee_100k/clang5 2.89GB/s ± 0% 2.89GB/s ± 1% ~ (p=0.479 n=45+45)
wuffs_crc32_ieee_10k/gcc7 3.35GB/s ± 0% 3.38GB/s ± 0% +0.95% (p=0.000 n=44+49)
wuffs_crc32_ieee_100k/gcc7 3.39GB/s ± 1% 3.42GB/s ± 0% +0.96% (p=0.000 n=47+47)
wuffs_deflate_decode_1k/clang5 139MB/s ± 1% 170MB/s ± 1% +22.72% (p=0.000 n=48+47)
wuffs_deflate_decode_10k/clang5 232MB/s ± 1% 241MB/s ± 1% +4.13% (p=0.000 n=48+45)
wuffs_deflate_decode_100k_just_one_read/clang5 274MB/s ± 0% 277MB/s ± 1% +1.14% (p=0.000 n=47+45)
wuffs_deflate_decode_100k_many_big_reads/clang5 226MB/s ± 0% 226MB/s ± 1% ~ (p=0.057 n=48+47)
wuffs_deflate_decode_1k/gcc7 157MB/s ± 1% 198MB/s ± 1% +25.61% (p=0.000 n=45+45)
wuffs_deflate_decode_10k/gcc7 265MB/s ± 0% 272MB/s ± 1% +2.62% (p=0.000 n=47+47)
wuffs_deflate_decode_100k_just_one_read/gcc7 322MB/s ± 0% 323MB/s ± 1% +0.40% (p=0.000 n=46+45)
wuffs_deflate_decode_100k_many_big_reads/gcc7 254MB/s ± 0% 254MB/s ± 0% +0.23% (p=0.000 n=43+46)
wuffs_gif_decode_1k_bw/clang5 246MB/s ± 1% 448MB/s ± 0% +82.21% (p=0.000 n=48+44)
wuffs_gif_decode_1k_color/clang5 145MB/s ± 0% 194MB/s ± 1% +33.70% (p=0.000 n=48+48)
wuffs_gif_decode_10k_bgra/clang5 740MB/s ± 1% 747MB/s ± 0% +0.97% (p=0.000 n=49+45)
wuffs_gif_decode_10k_indexed/clang5 199MB/s ± 1% 201MB/s ± 0% +1.30% (p=0.000 n=46+45)
wuffs_gif_decode_20k/clang5 251MB/s ± 0% 251MB/s ± 0% +0.23% (p=0.000 n=44+44)
wuffs_gif_decode_100k_artificial/clang5 557MB/s ± 1% 557MB/s ± 1% ~ (p=0.653 n=45+47)
wuffs_gif_decode_100k_realistic/clang5 230MB/s ± 0% 229MB/s ± 0% -0.45% (p=0.000 n=45+46)
wuffs_gif_decode_1000k/clang5 236MB/s ± 0% 233MB/s ± 0% -0.91% (p=0.000 n=46+48)
wuffs_gif_decode_anim_screencap/clang5 1.12GB/s ± 1% 1.11GB/s ± 0% -0.74% (p=0.000 n=47+45)
wuffs_gif_decode_1k_bw/gcc7 257MB/s ± 1% 506MB/s ± 0% +96.52% (p=0.000 n=50+46)
wuffs_gif_decode_1k_color/gcc7 146MB/s ± 1% 199MB/s ± 1% +36.35% (p=0.000 n=48+47)
wuffs_gif_decode_10k_bgra/gcc7 632MB/s ± 1% 649MB/s ± 0% +2.80% (p=0.000 n=47+47)
wuffs_gif_decode_10k_indexed/gcc7 198MB/s ± 1% 204MB/s ± 1% +3.32% (p=0.000 n=48+47)
wuffs_gif_decode_20k/gcc7 242MB/s ± 0% 246MB/s ± 0% +1.59% (p=0.000 n=47+48)
wuffs_gif_decode_100k_artificial/gcc7 517MB/s ± 1% 521MB/s ± 0% +0.71% (p=0.000 n=46+46)
wuffs_gif_decode_100k_realistic/gcc7 214MB/s ± 0% 215MB/s ± 0% +0.34% (p=0.000 n=48+44)
wuffs_gif_decode_1000k/gcc7 218MB/s ± 1% 218MB/s ± 0% ~ (p=0.238 n=44+49)
wuffs_gif_decode_anim_screencap/gcc7 1.08GB/s ± 0% 1.07GB/s ± 1% -0.27% (p=0.000 n=45+45)
wuffs_gzip_decode_10k/clang5 213MB/s ± 0% 222MB/s ± 0% +4.08% (p=0.000 n=43+46)
wuffs_gzip_decode_100k/clang5 249MB/s ± 1% 253MB/s ± 0% +1.50% (p=0.000 n=47+46)
wuffs_gzip_decode_10k/gcc7 246MB/s ± 1% 258MB/s ± 0% +4.76% (p=0.000 n=48+47)
wuffs_gzip_decode_100k/gcc7 291MB/s ± 0% 291MB/s ± 0% ~ (p=0.679 n=48+48)
wuffs_lzw_decode_20k/clang5 274MB/s ± 0% 280MB/s ± 0% +2.51% (p=0.000 n=46+47)
wuffs_lzw_decode_100k/clang5 484MB/s ± 0% 487MB/s ± 0% +0.58% (p=0.000 n=46+49)
wuffs_lzw_decode_20k/gcc7 267MB/s ± 0% 274MB/s ± 2% +2.31% (p=0.000 n=41+43)
wuffs_lzw_decode_100k/gcc7 489MB/s ± 1% 486MB/s ± 2% -0.67% (p=0.000 n=47+42)
wuffs_zlib_decode_10k/clang5 212MB/s ± 1% 219MB/s ± 0% +3.66% (p=0.000 n=47+47)
wuffs_zlib_decode_100k/clang5 246MB/s ± 1% 248MB/s ± 0% +0.69% (p=0.000 n=47+46)
wuffs_zlib_decode_10k/gcc7 251MB/s ± 0% 255MB/s ± 0% +1.83% (p=0.000 n=45+44)
wuffs_zlib_decode_100k/gcc7 294MB/s ± 1% 290MB/s ± 0% -1.33% (p=0.000 n=43+42)
--------
name old time/op new time/op delta
wuffs_adler32_10k/clang5 4.54µs ± 1% 4.54µs ± 0% -0.15% (p=0.000 n=48+48)
wuffs_adler32_100k/clang5 41.0µs ± 0% 41.0µs ± 1% -0.10% (p=0.001 n=45+47)
wuffs_adler32_10k/gcc7 3.41µs ± 0% 3.41µs ± 0% ~ (p=0.890 n=47+46)
wuffs_adler32_100k/gcc7 30.8µs ± 0% 30.8µs ± 1% ~ (p=0.557 n=42+47)
wuffs_crc32_ieee_10k/clang5 3.86µs ± 0% 3.86µs ± 0% ~ (p=0.602 n=45+46)
wuffs_crc32_ieee_100k/clang5 34.6µs ± 0% 34.6µs ± 1% ~ (p=0.475 n=45+45)
wuffs_crc32_ieee_10k/gcc7 3.30µs ± 0% 3.27µs ± 0% -0.94% (p=0.000 n=45+49)
wuffs_crc32_ieee_100k/gcc7 29.5µs ± 1% 29.3µs ± 0% -0.95% (p=0.000 n=47+47)
wuffs_deflate_decode_1k/clang5 6.79µs ± 1% 5.54µs ± 1% -18.52% (p=0.000 n=48+47)
wuffs_deflate_decode_10k/clang5 47.8µs ± 1% 45.9µs ± 1% -3.96% (p=0.000 n=48+45)
wuffs_deflate_decode_100k_just_one_read/clang5 365µs ± 0% 361µs ± 1% -1.12% (p=0.000 n=47+45)
wuffs_deflate_decode_100k_many_big_reads/clang5 442µs ± 0% 443µs ± 1% ~ (p=0.057 n=48+47)
wuffs_deflate_decode_1k/gcc7 5.99µs ± 1% 4.77µs ± 1% -20.39% (p=0.000 n=45+45)
wuffs_deflate_decode_10k/gcc7 41.7µs ± 0% 40.6µs ± 1% -2.56% (p=0.000 n=47+47)
wuffs_deflate_decode_100k_just_one_read/gcc7 311µs ± 0% 310µs ± 1% -0.40% (p=0.000 n=46+45)
wuffs_deflate_decode_100k_many_big_reads/gcc7 394µs ± 0% 393µs ± 0% -0.23% (p=0.000 n=43+46)
wuffs_gif_decode_1k_bw/clang5 4.17µs ± 1% 2.29µs ± 0% -45.12% (p=0.000 n=46+44)
wuffs_gif_decode_1k_color/clang5 6.95µs ± 0% 5.20µs ± 1% -25.21% (p=0.000 n=48+48)
wuffs_gif_decode_10k_bgra/clang5 54.5µs ± 1% 54.0µs ± 0% -0.96% (p=0.000 n=49+45)
wuffs_gif_decode_10k_indexed/clang5 50.7µs ± 1% 50.1µs ± 0% -1.28% (p=0.000 n=46+45)
wuffs_gif_decode_20k/clang5 76.6µs ± 0% 76.4µs ± 0% -0.23% (p=0.000 n=44+44)
wuffs_gif_decode_100k_artificial/clang5 248µs ± 1% 248µs ± 1% ~ (p=0.653 n=45+47)
wuffs_gif_decode_100k_realistic/clang5 599µs ± 0% 602µs ± 0% +0.45% (p=0.000 n=45+46)
wuffs_gif_decode_1000k/clang5 4.25ms ± 0% 4.29ms ± 0% +0.92% (p=0.000 n=46+48)
wuffs_gif_decode_anim_screencap/clang5 4.17ms ± 1% 4.20ms ± 0% +0.74% (p=0.000 n=47+45)
wuffs_gif_decode_1k_bw/gcc7 3.98µs ± 1% 2.02µs ± 0% -49.12% (p=0.000 n=50+46)
wuffs_gif_decode_1k_color/gcc7 6.90µs ± 1% 5.06µs ± 0% -26.67% (p=0.000 n=48+46)
wuffs_gif_decode_10k_bgra/gcc7 63.8µs ± 1% 62.1µs ± 0% -2.73% (p=0.000 n=47+47)
wuffs_gif_decode_10k_indexed/gcc7 50.9µs ± 1% 49.3µs ± 1% -3.22% (p=0.000 n=48+47)
wuffs_gif_decode_20k/gcc7 79.3µs ± 0% 78.1µs ± 0% -1.57% (p=0.000 n=47+48)
wuffs_gif_decode_100k_artificial/gcc7 267µs ± 0% 265µs ± 0% -0.69% (p=0.000 n=45+46)
wuffs_gif_decode_100k_realistic/gcc7 643µs ± 0% 641µs ± 0% -0.34% (p=0.000 n=48+44)
wuffs_gif_decode_1000k/gcc7 4.59ms ± 1% 4.58ms ± 0% ~ (p=0.238 n=44+49)
wuffs_gif_decode_anim_screencap/gcc7 4.32ms ± 0% 4.33ms ± 1% +0.27% (p=0.000 n=45+45)
wuffs_gzip_decode_10k/clang5 51.9µs ± 0% 49.8µs ± 0% -3.92% (p=0.000 n=43+46)
wuffs_gzip_decode_100k/clang5 401µs ± 1% 395µs ± 0% -1.48% (p=0.000 n=47+46)
wuffs_gzip_decode_10k/gcc7 44.9µs ± 1% 42.9µs ± 0% -4.54% (p=0.000 n=48+47)
wuffs_gzip_decode_100k/gcc7 343µs ± 0% 343µs ± 0% ~ (p=0.679 n=48+48)
wuffs_lzw_decode_20k/clang5 70.2µs ± 0% 68.5µs ± 0% -2.45% (p=0.000 n=46+47)
wuffs_lzw_decode_100k/clang5 207µs ± 0% 206µs ± 0% -0.58% (p=0.000 n=46+49)
wuffs_lzw_decode_20k/gcc7 71.8µs ± 0% 70.2µs ± 2% -2.25% (p=0.000 n=41+43)
wuffs_lzw_decode_100k/gcc7 204µs ± 1% 206µs ± 2% +0.67% (p=0.000 n=47+42)
wuffs_zlib_decode_10k/clang5 52.3µs ± 1% 50.4µs ± 0% -3.53% (p=0.000 n=47+47)
wuffs_zlib_decode_100k/clang5 406µs ± 1% 404µs ± 0% -0.68% (p=0.000 n=47+46)
wuffs_zlib_decode_10k/gcc7 44.2µs ± 0% 43.4µs ± 0% -1.79% (p=0.000 n=45+44)
wuffs_zlib_decode_100k/gcc7 340µs ± 1% 345µs ± 0% +1.35% (p=0.000 n=43+42)
--------
diff --git a/lang/parse/parse.go b/lang/parse/parse.go
index b111859..0a30c24 100644
--- a/lang/parse/parse.go
+++ b/lang/parse/parse.go
@@ -247,6 +247,13 @@
if err != nil {
return nil, err
}
+ if x := p.peek1(); x == t.IDOpenParen {
+ extraFields, err := p.parseList(t.IDCloseParen, (*parser).parseExtraFieldNode)
+ if err != nil {
+ return nil, err
+ }
+ fields = append(fields, extraFields...)
+ }
if x := p.peek1(); x != t.IDSemicolon {
got := p.tm.ByID(x)
return nil, fmt.Errorf(`parse: expected (implicit) ";", got %q at %s:%d`, got, p.filename, p.line())
@@ -331,6 +338,14 @@
}
func (p *parser) parseFieldNode() (*a.Node, error) {
+ return p.parseFieldNode1(0)
+}
+
+func (p *parser) parseExtraFieldNode() (*a.Node, error) {
+ return p.parseFieldNode1(a.FlagsPrivateData)
+}
+
+func (p *parser) parseFieldNode1(flags a.Flags) (*a.Node, error) {
name, err := p.parseIdent()
if err != nil {
return nil, err
@@ -339,7 +354,6 @@
if err != nil {
return nil, err
}
- flags := a.Flags(0)
if pkg := typ.Innermost().QID()[0]; (pkg != 0) && (pkg != t.IDBase) {
flags |= a.FlagsPrivateData
}
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 5443a03..8f79c9b 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -2856,10 +2856,6 @@
uint32_t f_n_bits;
uint32_t f_history_index;
bool f_end_of_block;
- uint32_t f_huffs[2][1024];
- uint32_t f_n_huffs_bits[2];
- uint8_t f_history[32768];
- uint8_t f_code_lengths[320];
uint32_t p_decode_io_writer[1];
uint32_t p_decode_blocks[1];
@@ -2869,6 +2865,11 @@
} private_impl;
struct {
+ uint32_t f_huffs[2][1024];
+ uint32_t f_n_huffs_bits[2];
+ uint8_t f_history[32768];
+ uint8_t f_code_lengths[320];
+
struct {
uint32_t v_final;
} s_decode_blocks[1];
@@ -3071,14 +3072,18 @@
uint32_t f_output_ri;
uint32_t f_output_wi;
uint32_t f_read_from_return_value;
+
+ uint32_t p_decode_io_writer[1];
+ uint32_t p_write_to[1];
+ } private_impl;
+
+ struct {
uint8_t f_suffixes[4096][8];
uint16_t f_prefixes[4096];
uint16_t f_lm1s[4096];
uint8_t f_output[8199];
- uint32_t p_decode_io_writer[1];
- uint32_t p_write_to[1];
- } private_impl;
+ } private_data;
#else // WUFFS_IMPLEMENTATION
@@ -3297,9 +3302,6 @@
uint64_t f_compressed_ri;
uint64_t f_compressed_wi;
wuffs_base__pixel_swizzler f_swizzler;
- uint8_t f_compressed[4096];
- uint8_t f_palettes[2][1024];
- uint8_t f_dst_palette[1024];
uint32_t p_decode_image_config[1];
uint32_t p_decode_frame_config[1];
@@ -3318,6 +3320,9 @@
} private_impl;
struct {
+ uint8_t f_compressed[4096];
+ uint8_t f_palettes[2][1024];
+ uint8_t f_dst_palette[1024];
wuffs_lzw__decoder f_lzw;
struct {
@@ -6365,7 +6370,7 @@
v_written = wuffs_base__slice_u8__suffix(v_written, 32768);
wuffs_base__slice_u8__copy_from_slice(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}),
v_written);
@@ -6374,7 +6379,7 @@
v_n_copied = wuffs_base__slice_u8__copy_from_slice(
wuffs_base__slice_u8__subslice_i(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}),
(self->private_impl.f_history_index & 32767)),
@@ -6383,7 +6388,7 @@
v_written = wuffs_base__slice_u8__subslice_i(v_written, v_n_copied);
v_n_copied = wuffs_base__slice_u8__copy_from_slice(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}),
v_written);
@@ -6730,23 +6735,23 @@
wuffs_base__status v_status = NULL;
while (v_i < 144) {
- self->private_impl.f_code_lengths[v_i] = 8;
+ self->private_data.f_code_lengths[v_i] = 8;
v_i += 1;
}
while (v_i < 256) {
- self->private_impl.f_code_lengths[v_i] = 9;
+ self->private_data.f_code_lengths[v_i] = 9;
v_i += 1;
}
while (v_i < 280) {
- self->private_impl.f_code_lengths[v_i] = 7;
+ self->private_data.f_code_lengths[v_i] = 7;
v_i += 1;
}
while (v_i < 288) {
- self->private_impl.f_code_lengths[v_i] = 8;
+ self->private_data.f_code_lengths[v_i] = 8;
v_i += 1;
}
while (v_i < 320) {
- self->private_impl.f_code_lengths[v_i] = 5;
+ self->private_data.f_code_lengths[v_i] = 5;
v_i += 1;
}
v_status = wuffs_deflate__decoder__init_huff(self, 0, 0, 288, 257);
@@ -6863,14 +6868,14 @@
v_bits |= (v_b1 << v_n_bits);
v_n_bits += 8;
}
- self->private_impl.f_code_lengths[wuffs_deflate__code_order[v_i]] =
+ self->private_data.f_code_lengths[wuffs_deflate__code_order[v_i]] =
((uint8_t)((v_bits & 7)));
v_bits >>= 3;
v_n_bits -= 3;
v_i += 1;
}
while (v_i < 19) {
- self->private_impl.f_code_lengths[wuffs_deflate__code_order[v_i]] = 0;
+ self->private_data.f_code_lengths[wuffs_deflate__code_order[v_i]] = 0;
v_i += 1;
}
v_status = wuffs_deflate__decoder__init_huff(self, 0, 0, 19, 4095);
@@ -6878,12 +6883,12 @@
status = v_status;
goto exit;
}
- v_mask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
+ v_mask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[0]) - 1);
v_i = 0;
label_0_continue:;
while (v_i < (v_n_lit + v_n_dist)) {
while (true) {
- v_table_entry = self->private_impl.f_huffs[0][(v_bits & v_mask)];
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_mask)];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
@@ -6910,7 +6915,7 @@
}
v_table_entry = ((v_table_entry >> 8) & 255);
if (v_table_entry < 16) {
- self->private_impl.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
+ self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
v_i += 1;
goto label_0_continue;
}
@@ -6923,7 +6928,7 @@
status = wuffs_deflate__error__bad_huffman_code_length_repetition;
goto exit;
}
- v_rep_symbol = self->private_impl.f_code_lengths[(v_i - 1)];
+ v_rep_symbol = self->private_data.f_code_lengths[(v_i - 1)];
v_rep_count = 3;
} else if (v_table_entry == 17) {
v_n_extra_bits = 3;
@@ -6959,7 +6964,7 @@
status = wuffs_deflate__error__bad_huffman_code_length_count;
goto exit;
}
- self->private_impl.f_code_lengths[v_i] = v_rep_symbol;
+ self->private_data.f_code_lengths[v_i] = v_rep_symbol;
v_i += 1;
v_rep_count -= 1;
}
@@ -6968,7 +6973,7 @@
status = wuffs_deflate__error__bad_huffman_code_length_count;
goto exit;
}
- if (self->private_impl.f_code_lengths[256] == 0) {
+ if (self->private_data.f_code_lengths[256] == 0) {
status = wuffs_deflate__error__missing_end_of_block_code;
goto exit;
}
@@ -7052,10 +7057,10 @@
v_i = a_n_codes0;
while (v_i < a_n_codes1) {
- if (v_counts[self->private_impl.f_code_lengths[v_i]] >= 320) {
+ if (v_counts[self->private_data.f_code_lengths[v_i]] >= 320) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- v_counts[self->private_impl.f_code_lengths[v_i]] += 1;
+ v_counts[self->private_data.f_code_lengths[v_i]] += 1;
v_i += 1;
}
if ((((uint32_t)(v_counts[0])) + a_n_codes0) == a_n_codes1) {
@@ -7095,13 +7100,13 @@
if (v_i < a_n_codes0) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- if (self->private_impl.f_code_lengths[v_i] != 0) {
- if (v_offsets[self->private_impl.f_code_lengths[v_i]] >= 320) {
+ if (self->private_data.f_code_lengths[v_i] != 0) {
+ if (v_offsets[self->private_data.f_code_lengths[v_i]] >= 320) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- v_symbols[v_offsets[self->private_impl.f_code_lengths[v_i]]] =
+ v_symbols[v_offsets[self->private_data.f_code_lengths[v_i]]] =
((uint16_t)((v_i - a_n_codes0)));
- v_offsets[self->private_impl.f_code_lengths[v_i]] += 1;
+ v_offsets[self->private_data.f_code_lengths[v_i]] += 1;
}
v_i += 1;
}
@@ -7128,9 +7133,9 @@
}
label_1_break:;
if (v_max_cl <= 9) {
- self->private_impl.f_n_huffs_bits[a_which] = v_max_cl;
+ self->private_data.f_n_huffs_bits[a_which] = v_max_cl;
} else {
- self->private_impl.f_n_huffs_bits[a_which] = 9;
+ self->private_data.f_n_huffs_bits[a_which] = 9;
}
v_i = 0;
if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) ||
@@ -7144,7 +7149,7 @@
if (v_max_cl < 9) {
v_initial_high_bits = (((uint32_t)(1)) << v_max_cl);
}
- v_prev_cl = ((uint32_t)(self->private_impl.f_code_lengths[(
+ v_prev_cl = ((uint32_t)(self->private_data.f_code_lengths[(
a_n_codes0 + ((uint32_t)(v_symbols[0])))]));
v_prev_redirect_key = 4294967295;
v_top = 0;
@@ -7156,7 +7161,7 @@
if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- v_cl = ((uint32_t)(self->private_impl.f_code_lengths[(
+ v_cl = ((uint32_t)(self->private_data.f_code_lengths[(
a_n_codes0 + ((uint32_t)(v_symbols[v_i])))]));
if (v_cl > v_prev_cl) {
v_code <<= (v_cl - v_prev_cl);
@@ -7199,7 +7204,7 @@
v_redirect_key =
(((uint32_t)(wuffs_deflate__reverse8[(v_redirect_key >> 1)])) |
((v_redirect_key & 1) << 8));
- self->private_impl.f_huffs[a_which][v_redirect_key] =
+ self->private_data.f_huffs[a_which][v_redirect_key] =
(268435465 | (v_top << 8) | (v_j << 4));
}
}
@@ -7232,7 +7237,7 @@
if ((v_top + ((v_high_bits | v_reversed_key) & 511)) >= 1024) {
return wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
}
- self->private_impl
+ self->private_data
.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511))] =
v_value;
}
@@ -7310,8 +7315,8 @@
}
v_bits = self->private_impl.f_bits;
v_n_bits = self->private_impl.f_n_bits;
- v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
- v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
+ v_lmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[0]) - 1);
+ v_dmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[1]) - 1);
label_0_continue:;
while ((((uint64_t)(io1_a_dst - iop_a_dst)) >= 258) &&
(((uint64_t)(io1_a_src - iop_a_src)) >= 12)) {
@@ -7324,7 +7329,7 @@
v_n_bits += 8;
} else {
}
- v_table_entry = self->private_impl.f_huffs[0][(v_bits & v_lmask)];
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)];
v_table_entry_n_bits = (v_table_entry & 15);
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
@@ -7354,7 +7359,7 @@
wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
goto exit;
}
- v_table_entry = self->private_impl
+ v_table_entry = self->private_data
.f_huffs[0][(v_redir_top + (v_bits & v_redir_mask))];
v_table_entry_n_bits = (v_table_entry & 15);
v_bits >>= v_table_entry_n_bits;
@@ -7418,7 +7423,7 @@
v_n_bits += 8;
} else {
}
- v_table_entry = self->private_impl.f_huffs[1][(v_bits & v_dmask)];
+ v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)];
v_table_entry_n_bits = (v_table_entry & 15);
v_bits >>= v_table_entry_n_bits;
v_n_bits -= v_table_entry_n_bits;
@@ -7439,7 +7444,7 @@
wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state;
goto exit;
}
- v_table_entry = self->private_impl
+ v_table_entry = self->private_data
.f_huffs[1][(v_redir_top + (v_bits & v_redir_mask))];
v_table_entry_n_bits = (v_table_entry & 15);
v_bits >>= v_table_entry_n_bits;
@@ -7496,7 +7501,7 @@
&iop_a_dst, io1_a_dst, v_hlen,
wuffs_base__slice_u8__subslice_i(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}),
(v_hdist & 32767)));
@@ -7507,7 +7512,7 @@
wuffs_base__io_writer__copy_n_from_slice(
&iop_a_dst, io1_a_dst, v_hlen,
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}));
goto label_1_break;
@@ -7647,12 +7652,12 @@
}
v_bits = self->private_impl.f_bits;
v_n_bits = self->private_impl.f_n_bits;
- v_lmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[0]) - 1);
- v_dmask = ((((uint32_t)(1)) << self->private_impl.f_n_huffs_bits[1]) - 1);
+ v_lmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[0]) - 1);
+ v_dmask = ((((uint32_t)(1)) << self->private_data.f_n_huffs_bits[1]) - 1);
label_0_continue:;
while (!(self->private_impl.p_decode_huffman_slow[0] != 0)) {
while (true) {
- v_table_entry = self->private_impl.f_huffs[0][(v_bits & v_lmask)];
+ v_table_entry = self->private_data.f_huffs[0][(v_bits & v_lmask)];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
@@ -7694,7 +7699,7 @@
goto exit;
}
v_table_entry =
- self->private_impl
+ self->private_data
.f_huffs[0][(v_redir_top + (v_bits & v_redir_mask))];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
@@ -7772,7 +7777,7 @@
v_n_bits -= v_table_entry_n_bits;
}
while (true) {
- v_table_entry = self->private_impl.f_huffs[1][(v_bits & v_dmask)];
+ v_table_entry = self->private_data.f_huffs[1][(v_bits & v_dmask)];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
v_bits >>= v_table_entry_n_bits;
@@ -7802,7 +7807,7 @@
goto exit;
}
v_table_entry =
- self->private_impl
+ self->private_data
.f_huffs[1][(v_redir_top + (v_bits & v_redir_mask))];
v_table_entry_n_bits = (v_table_entry & 15);
if (v_n_bits >= v_table_entry_n_bits) {
@@ -7879,7 +7884,7 @@
&iop_a_dst, io1_a_dst, v_hlen,
wuffs_base__slice_u8__subslice_i(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}),
(v_hdist & 32767)));
@@ -7904,7 +7909,7 @@
&iop_a_dst, io1_a_dst, v_hlen,
wuffs_base__slice_u8__subslice_i(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_history,
+ .ptr = self->private_data.f_history,
.len = 32768,
}),
(v_hdist & 32767)));
@@ -8130,8 +8135,8 @@
self->private_impl.f_output_wi = 0;
v_i = 0;
while (v_i < self->private_impl.f_clear_code) {
- self->private_impl.f_lm1s[v_i] = 0;
- self->private_impl.f_suffixes[v_i][0] = ((uint8_t)(v_i));
+ self->private_data.f_lm1s[v_i] = 0;
+ self->private_data.f_suffixes[v_i][0] = ((uint8_t)(v_i));
v_i += 1;
}
label_0_continue:;
@@ -8258,23 +8263,23 @@
v_bits >>= v_width;
v_n_bits -= v_width;
if (v_code < v_clear_code) {
- self->private_impl.f_output[v_output_wi] = ((uint8_t)(v_code));
+ self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code));
v_output_wi = ((v_output_wi + 1) & 8191);
if (v_save_code <= 4095) {
- v_lm1_a = ((self->private_impl.f_lm1s[v_prev_code] + 1) & 4095);
- self->private_impl.f_lm1s[v_save_code] = v_lm1_a;
+ v_lm1_a = ((self->private_data.f_lm1s[v_prev_code] + 1) & 4095);
+ self->private_data.f_lm1s[v_save_code] = v_lm1_a;
if ((v_lm1_a % 8) != 0) {
- self->private_impl.f_prefixes[v_save_code] =
- self->private_impl.f_prefixes[v_prev_code];
- memcpy(self->private_impl.f_suffixes[v_save_code],
- self->private_impl.f_suffixes[v_prev_code],
- sizeof(self->private_impl.f_suffixes[v_save_code]));
- self->private_impl.f_suffixes[v_save_code][(v_lm1_a % 8)] =
+ self->private_data.f_prefixes[v_save_code] =
+ self->private_data.f_prefixes[v_prev_code];
+ memcpy(self->private_data.f_suffixes[v_save_code],
+ self->private_data.f_suffixes[v_prev_code],
+ sizeof(self->private_data.f_suffixes[v_save_code]));
+ self->private_data.f_suffixes[v_save_code][(v_lm1_a % 8)] =
((uint8_t)(v_code));
} else {
- self->private_impl.f_prefixes[v_save_code] =
+ self->private_data.f_prefixes[v_save_code] =
((uint16_t)(v_prev_code));
- self->private_impl.f_suffixes[v_save_code][0] = ((uint8_t)(v_code));
+ self->private_data.f_suffixes[v_save_code][0] = ((uint8_t)(v_code));
}
v_save_code += 1;
if (v_width < 12) {
@@ -8296,43 +8301,43 @@
v_c = v_prev_code;
}
v_o = ((v_output_wi +
- (((uint32_t)(self->private_impl.f_lm1s[v_c])) & 4294967288)) &
+ (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288)) &
8191);
v_output_wi =
- ((v_output_wi + 1 + ((uint32_t)(self->private_impl.f_lm1s[v_c]))) &
+ ((v_output_wi + 1 + ((uint32_t)(self->private_data.f_lm1s[v_c]))) &
8191);
- v_steps = (((uint32_t)(self->private_impl.f_lm1s[v_c])) >> 3);
+ v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3);
while (true) {
- memcpy((self->private_impl.f_output) + (v_o),
- (self->private_impl.f_suffixes[v_c]), 8);
+ memcpy((self->private_data.f_output) + (v_o),
+ (self->private_data.f_suffixes[v_c]), 8);
if (v_steps <= 0) {
goto label_1_break;
}
v_steps -= 1;
v_o = ((v_o - 8) & 8191);
- v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c]));
+ v_c = ((uint32_t)(self->private_data.f_prefixes[v_c]));
}
label_1_break:;
- v_first_byte = self->private_impl.f_suffixes[v_c][0];
+ v_first_byte = self->private_data.f_suffixes[v_c][0];
if (v_code == v_save_code) {
- self->private_impl.f_output[v_output_wi] = v_first_byte;
+ self->private_data.f_output[v_output_wi] = v_first_byte;
v_output_wi = ((v_output_wi + 1) & 8191);
}
if (v_save_code <= 4095) {
- v_lm1_b = ((self->private_impl.f_lm1s[v_prev_code] + 1) & 4095);
- self->private_impl.f_lm1s[v_save_code] = v_lm1_b;
+ v_lm1_b = ((self->private_data.f_lm1s[v_prev_code] + 1) & 4095);
+ self->private_data.f_lm1s[v_save_code] = v_lm1_b;
if ((v_lm1_b % 8) != 0) {
- self->private_impl.f_prefixes[v_save_code] =
- self->private_impl.f_prefixes[v_prev_code];
- memcpy(self->private_impl.f_suffixes[v_save_code],
- self->private_impl.f_suffixes[v_prev_code],
- sizeof(self->private_impl.f_suffixes[v_save_code]));
- self->private_impl.f_suffixes[v_save_code][(v_lm1_b % 8)] =
+ self->private_data.f_prefixes[v_save_code] =
+ self->private_data.f_prefixes[v_prev_code];
+ memcpy(self->private_data.f_suffixes[v_save_code],
+ self->private_data.f_suffixes[v_prev_code],
+ sizeof(self->private_data.f_suffixes[v_save_code]));
+ self->private_data.f_suffixes[v_save_code][(v_lm1_b % 8)] =
v_first_byte;
} else {
- self->private_impl.f_prefixes[v_save_code] =
+ self->private_data.f_prefixes[v_save_code] =
((uint16_t)(v_prev_code));
- self->private_impl.f_suffixes[v_save_code][0] =
+ self->private_data.f_suffixes[v_save_code][0] =
((uint8_t)(v_first_byte));
}
v_save_code += 1;
@@ -8418,7 +8423,7 @@
}
v_s = wuffs_base__slice_u8__subslice_ij(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_output,
+ .ptr = self->private_data.f_output,
.len = 8199,
}),
self->private_impl.f_output_ri, self->private_impl.f_output_wi);
@@ -8472,7 +8477,7 @@
if (self->private_impl.f_output_ri <= self->private_impl.f_output_wi) {
v_s = wuffs_base__slice_u8__subslice_ij(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_output,
+ .ptr = self->private_data.f_output,
.len = 8199,
}),
self->private_impl.f_output_ri, self->private_impl.f_output_wi);
@@ -9446,21 +9451,21 @@
v_argb = t_3;
}
v_argb |= 4278190080;
- self->private_impl.f_palettes[0][((4 * v_i) + 0)] =
+ self->private_data.f_palettes[0][((4 * v_i) + 0)] =
((uint8_t)(((v_argb >> 0) & 255)));
- self->private_impl.f_palettes[0][((4 * v_i) + 1)] =
+ self->private_data.f_palettes[0][((4 * v_i) + 1)] =
((uint8_t)(((v_argb >> 8) & 255)));
- self->private_impl.f_palettes[0][((4 * v_i) + 2)] =
+ self->private_data.f_palettes[0][((4 * v_i) + 2)] =
((uint8_t)(((v_argb >> 16) & 255)));
- self->private_impl.f_palettes[0][((4 * v_i) + 3)] =
+ self->private_data.f_palettes[0][((4 * v_i) + 3)] =
((uint8_t)(((v_argb >> 24) & 255)));
v_i += 1;
}
while (v_i < 256) {
- self->private_impl.f_palettes[0][((4 * v_i) + 0)] = 0;
- self->private_impl.f_palettes[0][((4 * v_i) + 1)] = 0;
- self->private_impl.f_palettes[0][((4 * v_i) + 2)] = 0;
- self->private_impl.f_palettes[0][((4 * v_i) + 3)] = 255;
+ self->private_data.f_palettes[0][((4 * v_i) + 0)] = 0;
+ self->private_data.f_palettes[0][((4 * v_i) + 1)] = 0;
+ self->private_data.f_palettes[0][((4 * v_i) + 2)] = 0;
+ self->private_data.f_palettes[0][((4 * v_i) + 3)] = 255;
v_i += 1;
}
}
@@ -10280,54 +10285,54 @@
v_argb = t_1;
}
v_argb |= 4278190080;
- self->private_impl.f_palettes[1][((4 * v_i) + 0)] =
+ self->private_data.f_palettes[1][((4 * v_i) + 0)] =
((uint8_t)(((v_argb >> 0) & 255)));
- self->private_impl.f_palettes[1][((4 * v_i) + 1)] =
+ self->private_data.f_palettes[1][((4 * v_i) + 1)] =
((uint8_t)(((v_argb >> 8) & 255)));
- self->private_impl.f_palettes[1][((4 * v_i) + 2)] =
+ self->private_data.f_palettes[1][((4 * v_i) + 2)] =
((uint8_t)(((v_argb >> 16) & 255)));
- self->private_impl.f_palettes[1][((4 * v_i) + 3)] =
+ self->private_data.f_palettes[1][((4 * v_i) + 3)] =
((uint8_t)(((v_argb >> 24) & 255)));
v_i += 1;
}
while (v_i < 256) {
- self->private_impl.f_palettes[1][((4 * v_i) + 0)] = 0;
- self->private_impl.f_palettes[1][((4 * v_i) + 1)] = 0;
- self->private_impl.f_palettes[1][((4 * v_i) + 2)] = 0;
- self->private_impl.f_palettes[1][((4 * v_i) + 3)] = 255;
+ self->private_data.f_palettes[1][((4 * v_i) + 0)] = 0;
+ self->private_data.f_palettes[1][((4 * v_i) + 1)] = 0;
+ self->private_data.f_palettes[1][((4 * v_i) + 2)] = 0;
+ self->private_data.f_palettes[1][((4 * v_i) + 3)] = 255;
v_i += 1;
}
} else if (self->private_impl.f_gc_has_transparent_index) {
wuffs_base__slice_u8__copy_from_slice(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_palettes[1],
+ .ptr = self->private_data.f_palettes[1],
.len = 1024,
}),
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_palettes[0],
+ .ptr = self->private_data.f_palettes[0],
.len = 1024,
}));
} else {
self->private_impl.f_which_palette = 0;
}
if (self->private_impl.f_gc_has_transparent_index) {
- self->private_impl.f_palettes[1][(
+ self->private_data.f_palettes[1][(
(4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0)] =
0;
- self->private_impl.f_palettes[1][(
+ self->private_data.f_palettes[1][(
(4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1)] =
0;
- self->private_impl.f_palettes[1][(
+ self->private_data.f_palettes[1][(
(4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2)] =
0;
- self->private_impl.f_palettes[1][(
+ self->private_data.f_palettes[1][(
(4 * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3)] =
0;
}
v_dst_palette = wuffs_base__pixel_buffer__palette(a_dst);
if (((uint64_t)(v_dst_palette.len)) == 0) {
v_dst_palette = ((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_dst_palette,
+ .ptr = self->private_data.f_dst_palette,
.len = 1024,
});
}
@@ -10336,7 +10341,7 @@
wuffs_base__pixel_buffer__pixel_format(a_dst), v_dst_palette,
1191444488,
((wuffs_base__slice_u8){
- .ptr = self->private_impl
+ .ptr = self->private_data
.f_palettes[self->private_impl.f_which_palette],
.len = 1024,
}));
@@ -10471,7 +10476,7 @@
wuffs_base__slice_u8__copy_from_slice(
wuffs_base__slice_u8__subslice_i(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_compressed,
+ .ptr = self->private_data.f_compressed,
.len = 4096,
}),
self->private_impl.f_compressed_wi),
@@ -10515,7 +10520,7 @@
&v_r, &u_r, &iop_v_r, &io1_v_r,
wuffs_base__slice_u8__subslice_ij(
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_compressed,
+ .ptr = self->private_data.f_compressed,
.len = 4096,
}),
self->private_impl.f_compressed_ri,
@@ -10661,7 +10666,7 @@
v_n = wuffs_base__pixel_swizzler__swizzle_packed(
&self->private_impl.f_swizzler, v_dst,
((wuffs_base__slice_u8){
- .ptr = self->private_impl.f_dst_palette,
+ .ptr = self->private_data.f_dst_palette,
.len = 1024,
}),
v_src);
diff --git a/std/deflate/decode_deflate.wuffs b/std/deflate/decode_deflate.wuffs
index 389561b..ec4a981 100644
--- a/std/deflate/decode_deflate.wuffs
+++ b/std/deflate/decode_deflate.wuffs
@@ -72,6 +72,8 @@
// TODO: can decode_huffman_xxx signal this in band instead of out of band?
end_of_block base.bool,
+ util base.utility,
+)(
// huffs and n_huffs_bits are the lookup tables for Huffman decodings.
//
// There are up to 2 Huffman decoders active at any one time. As per this
@@ -123,8 +125,6 @@
// code_lengths[args.n_codes0 + i] holds the number of bits in the i'th
// code.
code_lengths array[320] base.u8[..15],
-
- util base.utility,
)
pub func decoder.workbuf_len() base.range_ii_u64 {
diff --git a/std/gif/decode_gif.wuffs b/std/gif/decode_gif.wuffs
index 6241fd0..c36ef18 100644
--- a/std/gif/decode_gif.wuffs
+++ b/std/gif/decode_gif.wuffs
@@ -114,16 +114,17 @@
compressed_ri base.u64,
compressed_wi base.u64,
- swizzler base.pixel_swizzler,
- util base.utility,
- lzw lzw.decoder,
-
+ swizzler base.pixel_swizzler,
+ util base.utility,
+)(
compressed array[4096] base.u8,
// palettes[0] and palettes[1] are the Global and Local Color Table.
palettes array[2] array[4 * 256] base.u8,
// dst_palette is the swizzled color table.
dst_palette array[4 * 256] base.u8,
+
+ lzw lzw.decoder,
)
pub func decoder.decode_image_config?(dst nptr base.image_config, src base.io_reader) {
diff --git a/std/lzw/decode_lzw.wuffs b/std/lzw/decode_lzw.wuffs
index 4e2eb35..76316c9 100644
--- a/std/lzw/decode_lzw.wuffs
+++ b/std/lzw/decode_lzw.wuffs
@@ -53,6 +53,8 @@
// might as well save it explicitly as a decoder field.
read_from_return_value base.u32,
+ util base.utility,
+)(
// read_from per-code state.
suffixes array[4096] array[8] base.u8,
prefixes array[4096] base.u16[..4095],
@@ -63,8 +65,6 @@
// output[output_ri:output_wi] is the buffered output, connecting read_from
// with write_to and flush.
output array[8192 + 7] base.u8,
-
- util base.utility,
)
pub func decoder.set_literal_width!(lw base.u32[2..8]) {
diff --git a/test/c/std/deflate.c b/test/c/std/deflate.c
index e68542a..6e7b4b8 100644
--- a/test/c/std/deflate.c
+++ b/test/c/std/deflate.c
@@ -386,7 +386,7 @@
wuffs_base__io_buffer history_got = ((wuffs_base__io_buffer){
.data = ((wuffs_base__slice_u8){
- .ptr = dec.private_impl.f_history,
+ .ptr = dec.private_data.f_history,
.len = full_history_size,
}),
});
@@ -440,6 +440,8 @@
const uint32_t fragment_length = 4;
wuffs_deflate__decoder dec;
+ memset(&(dec.private_data.f_history), 0,
+ sizeof(dec.private_data.f_history));
status =
wuffs_deflate__decoder__initialize(&dec, sizeof dec, WUFFS_VERSION, 0);
if (status) {
@@ -468,7 +470,7 @@
int j;
for (j = -2; j < (int)(fragment_length) + 2; j++) {
uint32_t index = (starting_history_index + j) & 0x7FFF;
- uint8_t got = dec.private_impl.f_history[index];
+ uint8_t got = dec.private_data.f_history[index];
uint8_t want = (0 <= j && j < fragment_length) ? fragment[j] : 0;
if (got != want) {
RETURN_FAIL("i=%d: starting_history_index=0x%04" PRIX32
@@ -532,23 +534,24 @@
if (status) {
RETURN_FAIL("initialize: \"%s\"", status);
}
+ memset(&(dec.private_data.f_huffs), 0, sizeof(dec.private_data.f_huffs));
int i;
int n = 0;
- dec.private_impl.f_code_lengths[n++] = 1;
- dec.private_impl.f_code_lengths[n++] = 2;
- dec.private_impl.f_code_lengths[n++] = 3;
- dec.private_impl.f_code_lengths[n++] = 4;
- dec.private_impl.f_code_lengths[n++] = 5;
- dec.private_impl.f_code_lengths[n++] = 6;
- dec.private_impl.f_code_lengths[n++] = 7;
- dec.private_impl.f_code_lengths[n++] = 9;
- dec.private_impl.f_code_lengths[n++] = 10;
+ dec.private_data.f_code_lengths[n++] = 1;
+ dec.private_data.f_code_lengths[n++] = 2;
+ dec.private_data.f_code_lengths[n++] = 3;
+ dec.private_data.f_code_lengths[n++] = 4;
+ dec.private_data.f_code_lengths[n++] = 5;
+ dec.private_data.f_code_lengths[n++] = 6;
+ dec.private_data.f_code_lengths[n++] = 7;
+ dec.private_data.f_code_lengths[n++] = 9;
+ dec.private_data.f_code_lengths[n++] = 10;
for (i = 0; i < 19; i++) {
- dec.private_impl.f_code_lengths[n++] = 12;
+ dec.private_data.f_code_lengths[n++] = 12;
}
- dec.private_impl.f_code_lengths[n++] = 13;
- dec.private_impl.f_code_lengths[n++] = 13;
+ dec.private_data.f_code_lengths[n++] = 13;
+ dec.private_data.f_code_lengths[n++] = 13;
status = wuffs_deflate__decoder__init_huff(&dec, 0, 0, n, 257);
if (status) {
@@ -558,10 +561,10 @@
// There is one 1st-level table (9 bits), and three 2nd-level tables (3, 3
// and 4 bits). f_huffs[0]'s elements should be non-zero for those tables and
// should be zero outside of those tables.
- const int n_f_huffs = sizeof(dec.private_impl.f_huffs[0]) /
- sizeof(dec.private_impl.f_huffs[0][0]);
+ const int n_f_huffs = sizeof(dec.private_data.f_huffs[0]) /
+ sizeof(dec.private_data.f_huffs[0][0]);
for (i = 0; i < n_f_huffs; i++) {
- bool got = dec.private_impl.f_huffs[0][i] == 0;
+ bool got = dec.private_data.f_huffs[0][i] == 0;
bool want = i >= (1 << 9) + (1 << 3) + (1 << 3) + (1 << 4);
if (got != want) {
RETURN_FAIL("huffs[0][%d] == 0: got %d, want %d", i, got, want);
@@ -574,19 +577,19 @@
// - 0b111111111 (0x01FF) to the table offset 528 (0x0210), a 4-bit table.
uint32_t got;
uint32_t want;
- got = dec.private_impl.f_huffs[0][0x017F];
+ got = dec.private_data.f_huffs[0][0x017F];
want = 0x10020039;
if (got != want) {
RETURN_FAIL("huffs[0][0x017F]: got 0x%08" PRIX32 ", want 0x%08" PRIX32, got,
want);
}
- got = dec.private_impl.f_huffs[0][0x00FF];
+ got = dec.private_data.f_huffs[0][0x00FF];
want = 0x10020839;
if (got != want) {
RETURN_FAIL("huffs[0][0x00FF]: got 0x%08" PRIX32 ", want 0x%08" PRIX32, got,
want);
}
- got = dec.private_impl.f_huffs[0][0x01FF];
+ got = dec.private_data.f_huffs[0][0x01FF];
want = 0x10021049;
if (got != want) {
RETURN_FAIL("huffs[0][0x01FF]: got 0x%08" PRIX32 ", want 0x%08" PRIX32, got,
@@ -599,7 +602,7 @@
0x80000801, 0x80000A03, 0x80000801, 0x80000C03,
};
for (i = 0; i < 8; i++) {
- got = dec.private_impl.f_huffs[0][0x0200 + i];
+ got = dec.private_data.f_huffs[0][0x0200 + i];
want = wants[i];
if (got != want) {
RETURN_FAIL("huffs[0][0x%04" PRIX32 "]: got 0x%08" PRIX32