summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <[email protected]>2024-02-29 09:36:01 -0500
committerPeter Zhu <[email protected]>2024-02-29 09:38:13 -0500
commit950c60623b83fb778df6b928ccbe46b2e54b18b6 (patch)
treedd9e71e5b1b6051a1b8fdea59c4b4c176c107a7a
parentd5bca0668c6006e0e155d6d293ec3d9b9b2c386b (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.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/gc.c b/gc.c
index 56ef075c5a..9d0f332ff5 100644
--- a/gc.c
+++ b/gc.c
@@ -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);