In `RefProcSoftWeakFinalPhaseTask`, `complete_gc->do_void()` is called at the end of `rp_work(...)`, but `complete_gc` is passed into `ReferenceProcessor` in `RefProcKeepAliveFinalPhaseTask` and `RefProcPhantomPhaseTask`. There's no technical reason for such inconsistency.
If we move the call, `complete_gc->do_void()`, to the end of `rp_work(...)`, we can merge the discovered list processing for all four kinds of non-strong refs.
If we move the call, `complete_gc->do_void()`, to the end of `rp_work(...)`, we can merge the discovered list processing for all four kinds of non-strong refs.