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