Bug report
Both mark_at_start and gc_collect_increment (its caller) decrement work_to_do by the number of objects marked. This can result in incremental collections being delayed longer than expected... I think in extreme situations, collection could be delayed indefinitely, resulting in leaks.
The fix is simple, just remove one of the decrements.
Linked PRs