Whether the returned object needs to be cleared or not depends on a
couple things:
- Whether the embedder actually needs the object to be cleared.
- Whether the collector allocated the object from memory that was all
zeroes already.
The goal of course would be to prevent clearing memory if the mutator
was just going to write all over it. But it's hard to know statically
if the memory would have been all zeroes anyway, and in that case if you
did clear it you'd be doing double work. In the end it's simpler to
just require collectors to clear memory in bulk. We can revisit this
later if it is an issue.
Add a new kind of write barrier, one which has a bit per field; the
mutator that sets the bit will need to add the field's location (the
edge) to a remembered set. Here we just have the fast-path
implementation.