Add wbmp.decoder.ack_metadata_chunk
diff --git a/internal/cgen/func.go b/internal/cgen/func.go
index a6dac27..bcfbb43 100644
--- a/internal/cgen/func.go
+++ b/internal/cgen/func.go
@@ -217,15 +217,16 @@
}
g.findDerivedVars()
+ if err := g.writeFuncImplBody(&g.currFunk.bBody); err != nil {
+ return err
+ }
+
if err := g.writeFuncImplPrologue(&g.currFunk.bPrologue); err != nil {
return err
}
if err := g.writeFuncImplBodyResume(&g.currFunk.bBodyResume); err != nil {
return err
}
- if err := g.writeFuncImplBody(&g.currFunk.bBody); err != nil {
- return err
- }
if err := g.writeFuncImplBodySuspend(&g.currFunk.bBodySuspend); err != nil {
return err
}
@@ -362,7 +363,7 @@
}
func (g *gen) writeFuncImplBodyResume(b *buffer) error {
- if g.currFunk.astFunc.Effect().Coroutine() {
+ if g.currFunk.coroSuspPoint > 0 {
// TODO: don't hard-code [0], and allow recursive coroutines.
b.printf("uint32_t coro_susp_point = self->private_impl.%s%s[0];\n",
pPrefix, g.currFunk.astFunc.FuncName().Str(g.tm))
@@ -390,7 +391,7 @@
}
func (g *gen) writeFuncImplBodySuspend(b *buffer) error {
- if g.currFunk.astFunc.Effect().Coroutine() {
+ if g.currFunk.coroSuspPoint > 0 {
// We've reached the end of the function body. Reset the coroutine
// suspension point so that the next call to this function starts at
// the top.
@@ -412,6 +413,9 @@
return err
}
b.writes("\n")
+
+ } else if g.currFunk.astFunc.Effect().Coroutine() {
+ b.writes("\ngoto ok;ok:") // The goto avoids the "unused label" warning.
}
return nil
}
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 2fff95d..fa7c9c4 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -4155,6 +4155,10 @@
wuffs_base__image_config* a_dst,
wuffs_base__io_buffer* a_src);
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_wbmp__decoder__ack_metadata_chunk(wuffs_wbmp__decoder* self,
+ wuffs_base__io_buffer* a_src);
+
// ---------------- Struct Definitions
// These structs' fields, and the sizeof them, are private implementation
@@ -4233,6 +4237,11 @@
return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src);
}
+ inline wuffs_base__status //
+ ack_metadata_chunk(wuffs_base__io_buffer* a_src) {
+ return wuffs_wbmp__decoder__ack_metadata_chunk(this, a_src);
+ }
+
#endif // __cplusplus
}; // struct wuffs_wbmp__decoder__struct
@@ -11907,6 +11916,8 @@
wuffs_base__pixel_buffer* a_dst,
wuffs_base__io_buffer* a_src,
wuffs_base__slice_u8 a_workbuf) {
+ wuffs_base__io_buffer empty_io_buffer = wuffs_base__empty_io_buffer();
+
wuffs_base__status status = wuffs_base__make_status(NULL);
uint64_t v_block_size = 0;
@@ -11935,8 +11946,6 @@
io2_a_src = io0_a_src + a_src->meta.wi;
}
- wuffs_base__io_buffer empty_io_buffer = wuffs_base__empty_io_buffer();
-
uint32_t coro_susp_point = self->private_impl.p_decode_id_part2[0];
if (coro_susp_point) {
v_block_size = self->private_data.s_decode_id_part2[0].v_block_size;
@@ -13015,6 +13024,45 @@
return status;
}
+// -------- func wbmp.decoder.ack_metadata_chunk
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status //
+wuffs_wbmp__decoder__ack_metadata_chunk(wuffs_wbmp__decoder* self,
+ wuffs_base__io_buffer* a_src) {
+ if (!self) {
+ return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+ }
+ if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ return wuffs_base__make_status(
+ (self->private_impl.magic == WUFFS_BASE__DISABLED)
+ ? wuffs_base__error__disabled_by_previous_error
+ : wuffs_base__error__initialize_not_called);
+ }
+ if (!a_src) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ return wuffs_base__make_status(wuffs_base__error__bad_argument);
+ }
+ if ((self->private_impl.active_coroutine != 0) &&
+ (self->private_impl.active_coroutine != 2)) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ return wuffs_base__make_status(
+ wuffs_base__error__interleaved_coroutine_calls);
+ }
+ self->private_impl.active_coroutine = 0;
+ wuffs_base__status status = wuffs_base__make_status(NULL);
+
+ status = wuffs_base__make_status(NULL);
+ goto ok;
+ goto ok;
+ok:
+ goto exit;
+exit:
+ if (wuffs_base__status__is_error(&status)) {
+ self->private_impl.magic = WUFFS_BASE__DISABLED;
+ }
+ return status;
+}
+
#endif // !defined(WUFFS_CONFIG__MODULES) ||
// defined(WUFFS_CONFIG__MODULE__WBMP)
diff --git a/std/wbmp/decode_wbmp.wuffs b/std/wbmp/decode_wbmp.wuffs
index 293b5b6..18b3abf 100644
--- a/std/wbmp/decode_wbmp.wuffs
+++ b/std/wbmp/decode_wbmp.wuffs
@@ -75,3 +75,9 @@
first_frame_is_opaque: true)
}
}
+
+pub func decoder.ack_metadata_chunk?(src: base.io_reader) {
+ // TODO: this final line shouldn't be necessary, here and in some other
+ // std/*/*.wuffs functions.
+ return ok
+}