Delete from finalizer_table before running finalizer

The finalizer could trigger a GC, which would cause FL_FINALIZE to be
out of sync with the finalizer table.
This commit is contained in:
Peter Zhu 2024-02-29 09:36:01 -05:00
parent d5bca0668c
commit 950c60623b

6
gc.c
View File

@ -4304,11 +4304,11 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
while (list) {
struct force_finalize_list *curr = list;
FL_UNSET(curr->obj, FL_FINALIZE);
run_finalizer(objspace, curr->obj, curr->table);
st_data_t obj = (st_data_t)curr->obj;
st_delete(finalizer_table, &obj, 0);
FL_UNSET(curr->obj, FL_FINALIZE);
run_finalizer(objspace, curr->obj, curr->table);
list = curr->next;
xfree(curr);