diff options
author | Peter Zhu <[email protected]> | 2024-02-29 09:36:01 -0500 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2024-02-29 09:38:13 -0500 |
commit | 950c60623b83fb778df6b928ccbe46b2e54b18b6 (patch) | |
tree | dd9e71e5b1b6051a1b8fdea59c4b4c176c107a7a | |
parent | d5bca0668c6006e0e155d6d293ec3d9b9b2c386b (diff) |
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.
-rw-r--r-- | gc.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -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); |