wuffs gen -version=0.3.0-alpha.14
diff --git a/release/c/wuffs-v0.3.c b/release/c/wuffs-v0.3.c
index 3bfce32..5651ca9 100644
--- a/release/c/wuffs-v0.3.c
+++ b/release/c/wuffs-v0.3.c
@@ -65,15 +65,15 @@
 // each major.minor branch, the commit count should increase monotonically.
 //
 // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// 57d47c633ce692dff24a804382935f46f7074ebf committed on 2020-09-08.
+// fa50f4de67da25a320584164ed12869603898a16 committed on 2020-09-21.
 #define WUFFS_VERSION 0x000030000
 #define WUFFS_VERSION_MAJOR 0
 #define WUFFS_VERSION_MINOR 3
 #define WUFFS_VERSION_PATCH 0
-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.13"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 2702
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20200908
-#define WUFFS_VERSION_STRING "0.3.0-alpha.13+2702.20200908"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.14"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 2715
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20200921
+#define WUFFS_VERSION_STRING "0.3.0-alpha.14+2715.20200921"
 
 // Define WUFFS_CONFIG__STATIC_FUNCTIONS to make all of Wuffs' functions have
 // static storage. The motivation is discussed in the "ALLOW STATIC
@@ -513,8 +513,8 @@
 // --------
 
 typedef struct {
-  uint64_t hi;
   uint64_t lo;
+  uint64_t hi;
 } wuffs_base__multiply_u64__output;
 
 // wuffs_base__multiply_u64 returns x*y as a 128-bit value.
@@ -522,6 +522,13 @@
 // The maximum inclusive output hi_lo is 0xFFFFFFFFFFFFFFFE_0000000000000001.
 static inline wuffs_base__multiply_u64__output  //
 wuffs_base__multiply_u64(uint64_t x, uint64_t y) {
+#if defined(__SIZEOF_INT128__)
+  __uint128_t z = ((__uint128_t)x) * ((__uint128_t)y);
+  wuffs_base__multiply_u64__output o;
+  o.lo = ((uint64_t)(z));
+  o.hi = ((uint64_t)(z >> 64));
+  return o;
+#else
   uint64_t x0 = x & 0xFFFFFFFF;
   uint64_t x1 = x >> 32;
   uint64_t y0 = y & 0xFFFFFFFF;
@@ -532,9 +539,10 @@
   uint64_t w2 = t >> 32;
   w1 += x0 * y1;
   wuffs_base__multiply_u64__output o;
-  o.hi = (x1 * y1) + w2 + (w1 >> 32);
   o.lo = x * y;
+  o.hi = (x1 * y1) + w2 + (w1 >> 32);
   return o;
+#endif
 }
 
 // --------
@@ -7654,11 +7662,13 @@
 
 #define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1225364496
 
-#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_NEW_LINE 1225364497
+#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_COMMENT 1225364497
 
-#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_R_TILDE_N 1225364498
+#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_NEW_LINE 1225364498
 
-#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364499
+#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_R_TILDE_N 1225364499
+
+#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1225364500
 
 // ---------------- Struct Declarations
 
@@ -7748,10 +7758,12 @@
     wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
     wuffs_base__vtable null_vtable;
 
-    bool f_quirks[20];
+    bool f_quirks[21];
     bool f_allow_leading_ars;
     bool f_allow_leading_ubom;
+    bool f_allow_trailing_comment;
     bool f_end_of_data;
+    uint8_t f_comment_type;
 
     uint32_t p_decode_tokens[1];
     uint32_t p_decode_leading[1];
@@ -9979,20 +9991,20 @@
 // --------
 
 // wuffs_base__private_implementation__powers_of_10 contains truncated
-// approximations to the powers of 10, ranging from 1e-326 to 1e+310 inclusive,
-// as 637 uint32_t quintuples (128-bit mantissa, 32-bit base-2 exponent biased
-// by 0x04BE (which is 1214)). The array size is 637 * 5 = 3185.
+// approximations to the powers of 10, ranging from 1e-307 to 1e+288 inclusive,
+// as 596 uint32_t quintuples (128-bit mantissa, 32-bit base-2 exponent biased
+// by 0x04BE (which is 1214)). The array size is 596 * 5 = 2980.
 //
 // The 1214 bias in this look-up table equals 1023 + 191. 1023 is the bias for
 // IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and
 // wuffs_base__private_implementation__parse_number_f64_eisel_lemire works with
 // multiples-of-64-bit mantissas.
 //
-// For example, the third approximation, for 1e-324, consists of the uint32_t
-// quintuple (0x828675B9, 0x52064CAC, 0x5DCE35EA, 0xCF42894A, 0x000A). The
+// For example, the third approximation, for 1e-305, consists of the uint32_t
+// quintuple (0xFE94DE87, 0x331ACDAB, 0x29ABA83C, 0xE0B62E29, 0x0049,). The
 // first four form a little-endian uint128_t value. The last one is an int32_t
 // value: -1140. Together, they represent the approximation to 1e-324:
-//   0xCF42894A_5DCE35EA_52064CAC_828675B9 * (2 ** (0x000A - 0x04BE))
+//   0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE))
 //
 // Similarly, 1e+4 is approximated by the uint64_t quintuple
 // (0x00000000, 0x00000000, 0x00000000, 0x9C400000, 0x044C) which means:
@@ -10003,26 +10015,7 @@
 //   0xED63A231_D4C4FB27.4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE))
 //
 // This table was generated by by script/print-mpb-powers-of-10.go
-static const uint32_t wuffs_base__private_implementation__powers_of_10[3185] = {
-    0xF7604B57, 0x014BB630, 0xFE98746D, 0x84A57695, 0x0004,  // 1e-326
-    0x35385E2D, 0x419EA3BD, 0x7E3E9188, 0xA5CED43B, 0x0007,  // 1e-325
-    0x828675B9, 0x52064CAC, 0x5DCE35EA, 0xCF42894A, 0x000A,  // 1e-324
-    0xD1940993, 0x7343EFEB, 0x7AA0E1B2, 0x818995CE, 0x000E,  // 1e-323
-    0xC5F90BF8, 0x1014EBE6, 0x19491A1F, 0xA1EBFB42, 0x0011,  // 1e-322
-    0x77774EF6, 0xD41A26E0, 0x9F9B60A6, 0xCA66FA12, 0x0014,  // 1e-321
-    0x955522B4, 0x8920B098, 0x478238D0, 0xFD00B897, 0x0017,  // 1e-320
-    0x5D5535B0, 0x55B46E5F, 0x8CB16382, 0x9E20735E, 0x001B,  // 1e-319
-    0x34AA831D, 0xEB2189F7, 0x2FDDBC62, 0xC5A89036, 0x001E,  // 1e-318
-    0x01D523E4, 0xA5E9EC75, 0xBBD52B7B, 0xF712B443, 0x0021,  // 1e-317
-    0x2125366E, 0x47B233C9, 0x55653B2D, 0x9A6BB0AA, 0x0025,  // 1e-316
-    0x696E840A, 0x999EC0BB, 0xEABE89F8, 0xC1069CD4, 0x0028,  // 1e-315
-    0x43CA250D, 0xC00670EA, 0x256E2C76, 0xF148440A, 0x002B,  // 1e-314
-    0x6A5E5728, 0x38040692, 0x5764DBCA, 0x96CD2A86, 0x002F,  // 1e-313
-    0x04F5ECF2, 0xC6050837, 0xED3E12BC, 0xBC807527, 0x0032,  // 1e-312
-    0xC633682E, 0xF7864A44, 0xE88D976B, 0xEBA09271, 0x0035,  // 1e-311
-    0xFBE0211D, 0x7AB3EE6A, 0x31587EA3, 0x93445B87, 0x0039,  // 1e-310
-    0xBAD82964, 0x5960EA05, 0xFDAE9E4C, 0xB8157268, 0x003C,  // 1e-309
-    0x298E33BD, 0x6FB92487, 0x3D1A45DF, 0xE61ACF03, 0x003F,  // 1e-308
+static const uint32_t wuffs_base__private_implementation__powers_of_10[2980] = {
     0x79F8E056, 0xA5D3B6D4, 0x06306BAB, 0x8FD0C162, 0x0043,  // 1e-307
     0x9877186C, 0x8F48A489, 0x87BC8696, 0xB3C4F1BA, 0x0046,  // 1e-306
     0xFE94DE87, 0x331ACDAB, 0x29ABA83C, 0xE0B62E29, 0x0049,  // 1e-305
@@ -10619,28 +10612,6 @@
     0xCCCC485D, 0x49ED8EAB, 0xD4BED6C0, 0x867F59A9, 0x07F5,  // 1e286
     0xBFFF5A74, 0x5C68F256, 0x49EE8C70, 0xA81F3014, 0x07F8,  // 1e287
     0x6FFF3111, 0x73832EEC, 0x5C6A2F8C, 0xD226FC19, 0x07FB,  // 1e288
-    0xC5FF7EAB, 0xC831FD53, 0xD9C25DB7, 0x83585D8F, 0x07FF,  // 1e289
-    0xB77F5E55, 0xBA3E7CA8, 0xD032F525, 0xA42E74F3, 0x0802,  // 1e290
-    0xE55F35EB, 0x28CE1BD2, 0xC43FB26F, 0xCD3A1230, 0x0805,  // 1e291
-    0xCF5B81B3, 0x7980D163, 0x7AA7CF85, 0x80444B5E, 0x0809,  // 1e292
-    0xC332621F, 0xD7E105BC, 0x1951C366, 0xA0555E36, 0x080C,  // 1e293
-    0xF3FEFAA7, 0x8DD9472B, 0x9FA63440, 0xC86AB5C3, 0x080F,  // 1e294
-    0xF0FEB951, 0xB14F98F6, 0x878FC150, 0xFA856334, 0x0812,  // 1e295
-    0x569F33D3, 0x6ED1BF9A, 0xD4B9D8D2, 0x9C935E00, 0x0816,  // 1e296
-    0xEC4700C8, 0x0A862F80, 0x09E84F07, 0xC3B83581, 0x0819,  // 1e297
-    0x2758C0FA, 0xCD27BB61, 0x4C6262C8, 0xF4A642E1, 0x081C,  // 1e298
-    0xB897789C, 0x8038D51C, 0xCFBD7DBD, 0x98E7E9CC, 0x0820,  // 1e299
-    0xE6BD56C3, 0xE0470A63, 0x03ACDD2C, 0xBF21E440, 0x0823,  // 1e300
-    0xE06CAC74, 0x1858CCFC, 0x04981478, 0xEEEA5D50, 0x0826,  // 1e301
-    0x0C43EBC8, 0x0F37801E, 0x02DF0CCB, 0x95527A52, 0x082A,  // 1e302
-    0x8F54E6BA, 0xD3056025, 0x8396CFFD, 0xBAA718E6, 0x082D,  // 1e303
-    0xF32A2069, 0x47C6B82E, 0x247C83FD, 0xE950DF20, 0x0830,  // 1e304
-    0x57FA5441, 0x4CDC331D, 0x16CDD27E, 0x91D28B74, 0x0834,  // 1e305
-    0xADF8E952, 0xE0133FE4, 0x1C81471D, 0xB6472E51, 0x0837,  // 1e306
-    0xD97723A6, 0x58180FDD, 0x63A198E5, 0xE3D8F9E5, 0x083A,  // 1e307
-    0xA7EA7648, 0x570F09EA, 0x5E44FF8F, 0x8E679C2F, 0x083E,  // 1e308
-    0x51E513DA, 0x2CD2CC65, 0x35D63F73, 0xB201833B, 0x0841,  // 1e309
-    0xA65E58D1, 0xF8077F7E, 0x034BCF4F, 0xDE81E40A, 0x0844,  // 1e310
 };
 
 // wuffs_base__private_implementation__f64_powers_of_10 holds powers of 10 that
@@ -11614,8 +11585,14 @@
 //
 // Preconditions:
 //  - man is non-zero.
-//  - exp10 is in the range -326 ..= 310, the same range of the
+//  - exp10 is in the range [-307 ..= 288], the same range of the
 //    wuffs_base__private_implementation__powers_of_10 array.
+//
+// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX],
+// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the
+// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal
+// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are
+// approximately 2.23e–308 and 1.80e+308.
 static int64_t  //
 wuffs_base__private_implementation__parse_number_f64_eisel_lemire(
     uint64_t man,
@@ -11624,7 +11601,7 @@
   // The look-up table was constructed so that it is already normalized: the
   // table entry's mantissa's MSB (most significant bit) is on.
   const uint32_t* po10 =
-      &wuffs_base__private_implementation__powers_of_10[5 * (exp10 + 326)];
+      &wuffs_base__private_implementation__powers_of_10[5 * (exp10 + 307)];
 
   // Normalize the man argument. The (man != 0) precondition means that a
   // non-zero bit exists.
@@ -11642,19 +11619,10 @@
   // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi
   // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore
   // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on.
-#if defined(__SIZEOF_INT128__)
-  // See commit 18449ad75d582dd015c236abc85a16f333b796f3 "Optimize 128-bit muls
-  // in parse_number_f64_eisel" for benchmark numbers.
-  __uint128_t x =
-      ((__uint128_t)man) * (((uint64_t)po10[2]) | (((uint64_t)po10[3]) << 32));
-  uint64_t x_hi = ((uint64_t)(x >> 64));
-  uint64_t x_lo = ((uint64_t)(x));
-#else
   wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(
       man, ((uint64_t)po10[2]) | (((uint64_t)po10[3]) << 32));
   uint64_t x_hi = x.hi;
   uint64_t x_lo = x.lo;
-#endif
 
   // Before we shift right by at least 9 bits, recall that the look-up table
   // entry was possibly truncated. We have so far only calculated a lower bound
@@ -11670,19 +11638,10 @@
     // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit
     // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e).
     // Now calculate y = (man * bits_64_to_127_incl_of_e).
-#if defined(__SIZEOF_INT128__)
-    // See commit 18449ad75d582dd015c236abc85a16f333b796f3 "Optimize 128-bit
-    // muls in parse_number_f64_eisel" for benchmark numbers.
-    __uint128_t y = ((__uint128_t)man) *
-                    (((uint64_t)po10[0]) | (((uint64_t)po10[1]) << 32));
-    uint64_t y_hi = ((uint64_t)(y >> 64));
-    uint64_t y_lo = ((uint64_t)(y));
-#else
     wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(
         man, ((uint64_t)po10[0]) | (((uint64_t)po10[1]) << 32));
     uint64_t y_hi = y.hi;
     uint64_t y_lo = y.lo;
-#endif
 
     // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to
     // calculate the 192-bit product of the 64-bit man by the 128-bit e.
@@ -11739,6 +11698,11 @@
   // carrying up overflowed, shift again.
   ret_mantissa += ret_mantissa & 1;
   ret_mantissa >>= 1;
+  // This if block is equivalent to (but benchmarks slightly faster than) the
+  // following branchless form:
+  //    uint64_t overflow_adjustment = ret_mantissa >> 53;
+  //    ret_mantissa >>= overflow_adjustment;
+  //    ret_exp2 += overflow_adjustment;
   if ((ret_mantissa >> 53) > 0) {
     ret_mantissa >>= 1;
     ret_exp2++;
@@ -11748,12 +11712,6 @@
   // have an implicit mantissa bit. Mask that away and keep the low 52 bits.
   ret_mantissa &= 0x000FFFFFFFFFFFFF;
 
-  // IEEE 754 double-precision floating point has 11 exponent bits. All off (0)
-  // means subnormal numbers. All on (2047) means infinity or NaN.
-  if ((ret_exp2 <= 0) || (2047 <= ret_exp2)) {
-    return -1;
-  }
-
   // Pack the bits and return.
   return ((int64_t)(ret_mantissa | (ret_exp2 << 52)));
 }
@@ -11900,7 +11858,7 @@
         man = (10 * man) + h->digits[i];
       }
       int32_t exp10 = h->decimal_point - ((int32_t)(h->num_digits));
-      if ((man != 0) && (-326 <= exp10) && (exp10 <= 310)) {
+      if ((man != 0) && (-307 <= exp10) && (exp10 <= 288)) {
         int64_t r =
             wuffs_base__private_implementation__parse_number_f64_eisel_lemire(
                 man, exp10);
@@ -12209,14 +12167,13 @@
     }
 
     // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire
-    // preconditions include that exp10 is in the range -326 ..= 310.
-    if ((exp10 < -326) || (310 < exp10)) {
+    // preconditions include that exp10 is in the range [-307 ..= 288].
+    if ((exp10 < -307) || (288 < exp10)) {
       goto fallback;
     }
 
-    // If man and exp10 are small enough, all three of (man), (10 ** exp10) and
-    // (man ** (10 ** exp10)) are exactly representable by a double. We don't
-    // need to run the Eisel-Lemire algorithm.
+    // If both man and (10 ** exp10) are exactly representable by a double, we
+    // don't need to run the Eisel-Lemire algorithm.
     if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) {
       double d = (double)man;
       if (exp10 >= 0) {
@@ -12232,7 +12189,7 @@
 
     // The wuffs_base__private_implementation__parse_number_f64_eisel_lemire
     // preconditions include that man is non-zero. Parsing "0" should be caught
-    // by the "If man and exp10 are small enough" above, but "0e99" might not.
+    // by the "If both man and (10 ** exp10)" above, but "0e99" might not.
     if (man == 0) {
       goto fallback;
     }
@@ -25745,7 +25702,7 @@
 
 #define WUFFS_JSON__QUIRKS_BASE 1225364480
 
-#define WUFFS_JSON__QUIRKS_COUNT 20
+#define WUFFS_JSON__QUIRKS_COUNT 21
 
 // ---------------- Private Initializer Prototypes
 
@@ -25887,7 +25844,7 @@
 
   if (a_quirk >= 1225364480) {
     a_quirk -= 1225364480;
-    if (a_quirk < 20) {
+    if (a_quirk < 21) {
       self->private_impl.f_quirks[a_quirk] = a_enabled;
     }
   }
@@ -26236,7 +26193,7 @@
                   } else {
                     if (((uint64_t)(io2_a_src - iop_a_src)) < 12) {
                       if (a_src && a_src->meta.closed) {
-                        if (self->private_impl.f_quirks[19]) {
+                        if (self->private_impl.f_quirks[20]) {
                           (iop_a_src += 6, wuffs_base__make_empty_struct());
                           *iop_a_dst++ = wuffs_base__make_token(
                               (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
@@ -26287,7 +26244,7 @@
                       goto label__string_loop_outer__continue;
                     }
                   }
-                  if (self->private_impl.f_quirks[19]) {
+                  if (self->private_impl.f_quirks[20]) {
                     if (((uint64_t)(io2_a_src - iop_a_src)) < 6) {
                       status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
                       goto exit;
@@ -26346,7 +26303,7 @@
                         (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
                         (((uint64_t)(10)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
                     goto label__string_loop_outer__continue;
-                  } else if (self->private_impl.f_quirks[19]) {
+                  } else if (self->private_impl.f_quirks[20]) {
                     (iop_a_src += 10, wuffs_base__make_empty_struct());
                     *iop_a_dst++ = wuffs_base__make_token(
                         (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
@@ -26400,7 +26357,7 @@
                     }
                   }
                   if (a_src && a_src->meta.closed) {
-                    if (self->private_impl.f_quirks[19]) {
+                    if (self->private_impl.f_quirks[20]) {
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
                           (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
@@ -26445,7 +26402,7 @@
                     }
                   }
                   if (a_src && a_src->meta.closed) {
-                    if (self->private_impl.f_quirks[19]) {
+                    if (self->private_impl.f_quirks[20]) {
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
                           (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
@@ -26492,7 +26449,7 @@
                     }
                   }
                   if (a_src && a_src->meta.closed) {
-                    if (self->private_impl.f_quirks[19]) {
+                    if (self->private_impl.f_quirks[20]) {
                       *iop_a_dst++ = wuffs_base__make_token(
                           (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
                           (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
@@ -26556,7 +26513,7 @@
                 status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code);
                 goto exit;
               }
-              if (self->private_impl.f_quirks[19]) {
+              if (self->private_impl.f_quirks[20]) {
                 *iop_a_dst++ = wuffs_base__make_token(
                     (((uint64_t)(6356989)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
                     (((uint64_t)(1)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
@@ -26889,7 +26846,7 @@
       v_expect = v_expect_after_value;
     }
     label__outer__break:;
-    if (self->private_impl.f_quirks[17]) {
+    if (self->private_impl.f_quirks[18]) {
       if (a_dst) {
         a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
       }
@@ -27275,6 +27232,7 @@
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
+    self->private_impl.f_comment_type = 0;
     label__0__continue:;
     while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1)) {
       if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) {
@@ -27324,6 +27282,7 @@
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(2)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
                 (((uint64_t)((v_length + 2))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
+            self->private_impl.f_comment_type = 1;
             status = wuffs_base__make_status(NULL);
             goto ok;
           }
@@ -27373,6 +27332,7 @@
             *iop_a_dst++ = wuffs_base__make_token(
                 (((uint64_t)(4)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
                 (((uint64_t)((v_length + 1))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
+            self->private_impl.f_comment_type = 2;
             status = wuffs_base__make_status(NULL);
             goto ok;
           }
@@ -27616,6 +27576,7 @@
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
+    self->private_impl.f_allow_trailing_comment = self->private_impl.f_quirks[17];
     label__outer__continue:;
     while (true) {
       if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0) {
@@ -27648,6 +27609,33 @@
                 (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
             v_whitespace_length = 0;
           }
+          if (self->private_impl.f_allow_trailing_comment) {
+            if (a_dst) {
+              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
+            }
+            if (a_src) {
+              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+            }
+            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+            status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
+            if (a_dst) {
+              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
+            }
+            if (a_src) {
+              iop_a_src = a_src->data.ptr + a_src->meta.ri;
+            }
+            if (status.repr) {
+              goto suspend;
+            }
+            v_c = 0;
+            v_whitespace_length = 0;
+            if (self->private_impl.f_comment_type == 1) {
+              self->private_impl.f_allow_trailing_comment = false;
+              goto label__outer__continue;
+            } else if (self->private_impl.f_comment_type == 2) {
+              goto label__outer__break;
+            }
+          }
           status = wuffs_base__make_status(wuffs_json__error__bad_input);
           goto exit;
         }
@@ -29050,6 +29038,8 @@
     fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
     io_buf = &fallback_io_buf;
   }
+  // cursor_index is discussed at
+  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
   size_t cursor_index = 0;
   std::string ret_error_message;
   std::string io_error_message;
@@ -29674,6 +29664,8 @@
     fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
     io_buf = &fallback_io_buf;
   }
+  // cursor_index is discussed at
+  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
   size_t cursor_index = 0;
   std::string ret_error_message;
   std::string io_error_message;