Allow calling pure functions after seeing an error
Updates #20
diff --git a/cmd/wuffs-c/internal/cgen/func.go b/cmd/wuffs-c/internal/cgen/func.go
index 7809567..f37e316 100644
--- a/cmd/wuffs-c/internal/cgen/func.go
+++ b/cmd/wuffs-c/internal/cgen/func.go
@@ -244,7 +244,13 @@
}
b.writes(";}")
- b.writes("if (self->private_impl.magic != WUFFS_BASE__MAGIC) { return ")
+ if g.currFunk.astFunc.Effect().Pure() {
+ b.writes("if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&")
+ b.writes(" (self->private_impl.magic != WUFFS_BASE__DISABLED)) {")
+ } else {
+ b.writes("if (self->private_impl.magic != WUFFS_BASE__MAGIC) {")
+ }
+ b.writes("return ")
if g.currFunk.returnsStatus {
b.writes("(self->private_impl.magic == WUFFS_BASE__DISABLED) " +
"? wuffs_base__error__disabled_by_previous_error " +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index aefde45..bb4fa0a 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -6339,7 +6339,8 @@
if (!self) {
return ((wuffs_base__range_ii_u64){0});
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return ((wuffs_base__range_ii_u64){0});
}
@@ -8155,7 +8156,8 @@
if (!self) {
return ((wuffs_base__range_ii_u64){0});
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return ((wuffs_base__range_ii_u64){0});
}
@@ -8811,7 +8813,8 @@
if (!self) {
return 0;
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return 0;
}
@@ -8828,7 +8831,8 @@
if (!self) {
return 0;
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return 0;
}
@@ -8842,7 +8846,8 @@
if (!self) {
return 0;
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return 0;
}
@@ -8856,7 +8861,8 @@
if (!self) {
return ((wuffs_base__rect_ie_u32){0});
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return ((wuffs_base__rect_ie_u32){0});
}
@@ -8876,7 +8882,8 @@
if (!self) {
return ((wuffs_base__range_ii_u64){0});
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return ((wuffs_base__range_ii_u64){0});
}
@@ -10925,7 +10932,8 @@
if (!self) {
return ((wuffs_base__range_ii_u64){0});
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return ((wuffs_base__range_ii_u64){0});
}
@@ -11410,7 +11418,8 @@
if (!self) {
return ((wuffs_base__range_ii_u64){0});
}
- if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+ if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+ (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
return ((wuffs_base__range_ii_u64){0});
}
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index c81f937..dbd0284 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -1032,16 +1032,8 @@
return status;
}
- // TODO: want_dirty_rect_is_empty should probably be false, not true. It's
- // true because the error sets the decoder state (specifically, the
- // private_impl.magic field) to WUFFS_BASE__DISABLED, so that
- // frame_dirty_rect returns the zero value (an empty rect).
- //
- // Perhaps "not enough data" should be a warning, not an error??
- //
- // Ditto for the "too much data" test.
return do_test_wuffs_gif_decode_expecting(
- src, wuffs_base__error__not_enough_data, true);
+ src, wuffs_base__error__not_enough_data, false);
}
const char* test_wuffs_gif_decode_too_much_data() {
@@ -1058,7 +1050,7 @@
}
return do_test_wuffs_gif_decode_expecting(
- src, wuffs_base__error__too_much_data, true);
+ src, wuffs_base__error__too_much_data, false);
}
const char* test_wuffs_gif_frame_dirty_rect() {