In GCAlloc, we test whether the first word is zero (this came in with bug #573737 and may actually be redundant now, I'm investigating), then we clear kFinalizable, then we run the destructor. The clearing of the bit before the destructor call is supposed to make the GC more resilient; if the destructor throws, then the clearing is important (according to a comment). IMO, if the destructor throws while we're in a GC critical section then we're already long past gone, but perhaps this has some relevance to OOM handling? In GCLargeAlloc, we just run the finalizer: no zero check, no bit clearing. Then the object is freed. In the reaper, we assert that the first word is not zero, then we run the destructor without clearing the bit. Then the object is freed.