I had a major slowdown with my weakmap marking patch stack that was causing everything to timeout when run within the browser (but not the shell), which ended up being because I had introduced an unwanted read barrier during transplanting (!). So after fixing that, I scanned through and found a bunch more places where we are unmarking gray on stuff that cannot escape to anywhere.
Initially, I did this by adding an unbarriered iterator invariant. It got messy because I was using the same set of constructors, which already forward
Args... and have multiple variants, so I'd have to double those. It felt kind of gross, so I fell back on doing explicit .unbarrieredGet() when accessing the iterator. Arguably, this approach is prone to someone accidentally adding another access that will default to the barriered version. Anyway, I guess this is what reviews are for.
Note that this does not fix bug 1515934, which I haven't looked at yet.