wuffs gen -version=0.3.0-beta.7
diff --git a/release/c/wuffs-v0.3.c b/release/c/wuffs-v0.3.c
index 3701a21..4d64d99 100644
--- a/release/c/wuffs-v0.3.c
+++ b/release/c/wuffs-v0.3.c
@@ -84,15 +84,15 @@
 // each major.minor branch, the commit count should increase monotonically.
 //
 // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// 3842c519c9961500d96efee0ff7aafbd20833570 committed on 2021-07-05.
+// 6a30c1ede0dc765fbbc443b2536b7691485be9fb committed on 2021-07-18.
 #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 "beta.6"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3065
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20210705
-#define WUFFS_VERSION_STRING "0.3.0-beta.6+3065.20210705"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "beta.7"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3069
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20210718
+#define WUFFS_VERSION_STRING "0.3.0-beta.7+3069.20210718"
 
 // ---------------- Configuration
 
@@ -40054,54 +40054,50 @@
 
 // --------
 
-#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                       \
-  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                           \
-    if (tok_status.repr == nullptr) {                                    \
-    } else if (tok_status.repr == wuffs_base__suspension__short_write) { \
-      tok_buf.compact();                                                 \
-    } else if (tok_status.repr == wuffs_base__suspension__short_read) {  \
-      if (!io_error_message.empty()) {                                   \
-        ret_error_message = std::move(io_error_message);                 \
-        goto done;                                                       \
-      } else if (cursor_index != io_buf->meta.ri) {                      \
-        ret_error_message =                                              \
-            "wuffs_aux::DecodeJson: internal error: bad cursor_index";   \
-        goto done;                                                       \
-      } else if (io_buf->meta.closed) {                                  \
-        ret_error_message =                                              \
-            "wuffs_aux::DecodeJson: internal error: io_buf is closed";   \
-        goto done;                                                       \
-      }                                                                  \
-      io_buf->compact();                                                 \
-      if (io_buf->meta.wi >= io_buf->data.len) {                         \
-        ret_error_message =                                              \
-            "wuffs_aux::DecodeJson: internal error: io_buf is full";     \
-        goto done;                                                       \
-      }                                                                  \
-      cursor_index = io_buf->meta.ri;                                    \
-      io_error_message = input.CopyIn(io_buf);                           \
-    } else {                                                             \
-      ret_error_message = tok_status.message();                          \
-      goto done;                                                         \
-    }                                                                    \
-    if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {      \
-      ret_error_message =                                                \
-          "wuffs_aux::DecodeJson: internal error: bad WORKBUF_LEN";      \
-      goto done;                                                         \
-    }                                                                    \
-    wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();        \
-    tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);         \
-  }                                                                      \
-  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];         \
-  uint64_t token_len = token.length();                                   \
-  if ((io_buf->meta.ri < cursor_index) ||                                \
-      ((io_buf->meta.ri - cursor_index) < token_len)) {                  \
-    ret_error_message =                                                  \
-        "wuffs_aux::DecodeJson: internal error: bad token indexes";      \
-    goto done;                                                           \
-  }                                                                      \
-  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                  \
-  (void)(token_ptr);                                                     \
+#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                          \
+  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                              \
+    if (tok_status.repr == nullptr) {                                       \
+      goto done;                                                            \
+    } else if (tok_status.repr == wuffs_base__suspension__short_write) {    \
+      tok_buf.compact();                                                    \
+    } else if (tok_status.repr == wuffs_base__suspension__short_read) {     \
+      if (!io_error_message.empty()) {                                      \
+        ret_error_message = std::move(io_error_message);                    \
+        goto done;                                                          \
+      } else if (cursor_index != io_buf->meta.ri) {                         \
+        ret_error_message =                                                 \
+            "wuffs_aux::DecodeJson: internal error: bad cursor_index";      \
+        goto done;                                                          \
+      } else if (io_buf->meta.closed) {                                     \
+        ret_error_message =                                                 \
+            "wuffs_aux::DecodeJson: internal error: io_buf is closed";      \
+        goto done;                                                          \
+      }                                                                     \
+      io_buf->compact();                                                    \
+      if (io_buf->meta.wi >= io_buf->data.len) {                            \
+        ret_error_message =                                                 \
+            "wuffs_aux::DecodeJson: internal error: io_buf is full";        \
+        goto done;                                                          \
+      }                                                                     \
+      cursor_index = io_buf->meta.ri;                                       \
+      io_error_message = input.CopyIn(io_buf);                              \
+    } else {                                                                \
+      ret_error_message = tok_status.message();                             \
+      goto done;                                                            \
+    }                                                                       \
+    tok_status =                                                            \
+        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \
+  }                                                                         \
+  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];            \
+  uint64_t token_len = token.length();                                      \
+  if ((io_buf->meta.ri < cursor_index) ||                                   \
+      ((io_buf->meta.ri - cursor_index) < token_len)) {                     \
+    ret_error_message =                                                     \
+        "wuffs_aux::DecodeJson: internal error: bad token indexes";         \
+    goto done;                                                              \
+  }                                                                         \
+  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                     \
+  (void)(token_ptr);                                                        \
   cursor_index += static_cast<size_t>(token_len)
 
 // --------
@@ -40372,6 +40368,10 @@
     if (!dec) {
       ret_error_message = "wuffs_aux::DecodeJson: out of memory";
       goto done;
+    } else if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
+      ret_error_message =
+          "wuffs_aux::DecodeJson: internal error: bad WORKBUF_LEN";
+      goto done;
     }
     bool allow_tilde_n_tilde_r_tilde_t = false;
     for (size_t i = 0; i < quirks.len; i++) {
@@ -40387,7 +40387,8 @@
     wuffs_base__token_buffer tok_buf =
         wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
             &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
-    wuffs_base__status tok_status = wuffs_base__make_status(nullptr);
+    wuffs_base__status tok_status =
+        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8());
 
     // Prepare other state.
     uint32_t depth = 0;
@@ -40401,7 +40402,7 @@
       }
       std::pair<std::string, size_t> split = DecodeJson_SplitJsonPointer(
           json_pointer, i + 1, allow_tilde_n_tilde_r_tilde_t);
-      i = std::move(split.second);
+      i = split.second;
       if (i == 0) {
         ret_error_message = DecodeJson_BadJsonPointer;
         goto done;
@@ -40536,7 +40537,22 @@
       goto done;
 
     parsed_a_value:
-      if (!ret_error_message.empty() || (depth == 0)) {
+      // If an error was encountered, we are done. Otherwise, (depth == 0)
+      // after parsing a value is equivalent to having decoded the entire JSON
+      // value (for an empty json_pointer query) or having decoded the
+      // pointed-to JSON value (for a non-empty json_pointer query). In the
+      // latter case, we are also done.
+      //
+      // However, if quirks like WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER or
+      // WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF are passed, decoding
+      // the entire JSON value should also consume any trailing filler, in case
+      // the DecodeJson caller wants to subsequently check that the input is
+      // completely exhausted (and otherwise raise "valid JSON followed by
+      // further (unexpected) data"). We aren't done yet. Instead, keep the
+      // loop running until WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN's
+      // decode_tokens returns an ok status.
+      if (!ret_error_message.empty() ||
+          ((depth == 0) && !json_pointer.empty())) {
         goto done;
       }
     }