Drop args- and this-related facts after ? call
diff --git a/lang/check/bounds.go b/lang/check/bounds.go
index 17b4509..69b1a70 100644
--- a/lang/check/bounds.go
+++ b/lang/check/bounds.go
@@ -195,6 +195,14 @@
return o, nil
}
+func updateFactsForSuspension(x *a.Expr) (*a.Expr, error) {
+ if x.Mentions(exprArgs) || x.Mentions(exprThis) {
+ return nil, nil
+ }
+ // TODO: drop any facts involving ptr-typed local variables?
+ return x, nil
+}
+
func (q *checker) bcheckBlock(block []*a.Node) error {
unreachable := false
for _, o := range block {
@@ -213,16 +221,9 @@
// No-op.
case a.KRet:
if o.AsRet().Keyword() == t.IDYield {
- // Drop any facts involving args or this.
- if err := q.facts.update(func(x *a.Expr) (*a.Expr, error) {
- if x.Mentions(exprArgs) || x.Mentions(exprThis) {
- return nil, nil
- }
- return x, nil
- }); err != nil {
+ if err := q.facts.update(updateFactsForSuspension); err != nil {
return err
}
- // TODO: drop any facts involving ptr-typed local variables?
continue
}
}
@@ -423,6 +424,12 @@
return err
}
+ if rhs.Effect().Coroutine() && (op != t.IDEqQuestion) {
+ if err := q.facts.update(updateFactsForSuspension); err != nil {
+ return err
+ }
+ }
+
if lhs == nil {
return nil
}
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index e0e7078..b446d4b 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -18535,8 +18535,8 @@
uint32_t t_0 = *iop_a_src++;
v_b0 = t_0;
}
- self->private_impl.f_bits |= (v_b0 << self->private_impl.f_n_bits);
- self->private_impl.f_n_bits += 8;
+ self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3));
+ self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3) + 8);
}
v_final = (self->private_impl.f_bits & 1);
v_type = ((self->private_impl.f_bits >> 1) & 3);
diff --git a/std/deflate/decode_deflate.wuffs b/std/deflate/decode_deflate.wuffs
index df5c72f..31b75e3 100644
--- a/std/deflate/decode_deflate.wuffs
+++ b/std/deflate/decode_deflate.wuffs
@@ -228,8 +228,8 @@
post this.n_bits >= 3,
{
b0 = args.src.read_u8_as_u32?()
- this.bits |= b0 << this.n_bits
- this.n_bits += 8
+ this.bits |= b0 << (this.n_bits & 3)
+ this.n_bits = (this.n_bits & 3) + 8
} endwhile
final = this.bits & 0x01
type = (this.bits >> 1) & 0x03