Shrink cbor.decoder.decode_tokens coroutine state
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 41a0196..9d2b4cd 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -5616,8 +5616,6 @@
   struct {
     struct {
       uint32_t v_depth;
-      uint32_t v_token_length;
-      uint8_t v_c;
     } s_decode_tokens[1];
   } private_data;
 
@@ -16396,8 +16394,6 @@
   uint32_t coro_susp_point = self->private_impl.p_decode_tokens[0];
   if (coro_susp_point) {
     v_depth = self->private_data.s_decode_tokens[0].v_depth;
-    v_token_length = self->private_data.s_decode_tokens[0].v_token_length;
-    v_c = self->private_data.s_decode_tokens[0].v_c;
   }
   switch (coro_susp_point) {
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
@@ -16426,16 +16422,17 @@
         v_c = wuffs_base__load_u8be__no_bounds_check(iop_a_src);
         if ((24 <= (v_c & 31)) && ((v_c & 31) <= 27)) {
           v_token_length = (1 + (((uint32_t)(1)) << (v_c & 3)));
-          if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
-            if (a_src && a_src->meta.closed) {
-              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
-              goto exit;
-            }
+          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)(v_token_length))) {
+            (iop_a_src += v_token_length, wuffs_base__make_empty_struct());
+          } else if (a_src && a_src->meta.closed) {
+            status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
+            goto exit;
+          } else {
             status = wuffs_base__make_status(wuffs_base__suspension__short_read);
             WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
+            v_c = 0;
             goto label__outer__continue;
           }
-          (iop_a_src += v_token_length, wuffs_base__make_empty_struct());
         } else {
           (iop_a_src += 1, wuffs_base__make_empty_struct());
         }
@@ -16480,8 +16477,6 @@
   self->private_impl.p_decode_tokens[0] = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
   self->private_data.s_decode_tokens[0].v_depth = v_depth;
-  self->private_data.s_decode_tokens[0].v_token_length = v_token_length;
-  self->private_data.s_decode_tokens[0].v_c = v_c;
 
   goto exit;
   exit:
diff --git a/std/cbor/decode_cbor.wuffs b/std/cbor/decode_cbor.wuffs
index 90d89b8..fefdb5c 100644
--- a/std/cbor/decode_cbor.wuffs
+++ b/std/cbor/decode_cbor.wuffs
@@ -55,14 +55,15 @@
 		c = args.src.peek_u8()
 		if (0x18 <= (c & 0x1F)) and ((c & 0x1F) <= 0x1B) {
 			token_length = 1 + ((1 as base.u32) << (c & 0x03))
-			if args.src.available() < (token_length as base.u64) {
-				if args.src.is_closed() {
-					return "#bad input"
-				}
+			if args.src.available() >= (token_length as base.u64) {
+				args.src.skip_u32_fast!(actual: token_length, worst_case: token_length)
+			} else if args.src.is_closed() {
+				return "#bad input"
+			} else {
 				yield? base."$short read"
+				c = 0
 				continue.outer
 			}
-			args.src.skip_u32_fast!(actual: token_length, worst_case: token_length)
 		} else {
 			args.src.skip_u32_fast!(actual: 1, worst_case: 1)
 		}