@@ -91,6 +91,8 @@ RB_THREAD_LOCAL_SPECIFIER VALUE marking_parent_object;
9191
9292#include <pthread.h>
9393
94+ static inline VALUE rb_mmtk_call_object_closure (VALUE obj , bool pin );
95+
9496static void
9597rb_mmtk_init_gc_worker_thread (MMTk_VMWorkerThread gc_thread_tls )
9698{
@@ -361,15 +363,22 @@ make_final_job(struct objspace *objspace, VALUE obj, VALUE table)
361363}
362364
363365static int
364- rb_mmtk_update_finalizer_table_i (st_data_t key , st_data_t value , st_data_t data )
366+ rb_mmtk_update_finalizer_table_i (st_data_t key , st_data_t value , st_data_t data , int error )
365367{
366368 RUBY_ASSERT (RB_FL_TEST (key , RUBY_FL_FINALIZE ));
367369 RUBY_ASSERT (mmtk_is_reachable ((MMTk_ObjectReference )value ));
368370 RUBY_ASSERT (RB_BUILTIN_TYPE (value ) == T_ARRAY );
369371
370372 struct objspace * objspace = (struct objspace * )data ;
371373
372- if (!mmtk_is_reachable ((MMTk_ObjectReference )key )) {
374+ if (mmtk_is_reachable ((MMTk_ObjectReference )key )) {
375+ VALUE new_key_location = rb_mmtk_call_object_closure ((VALUE )key , false);
376+
377+ if (new_key_location != key ) {
378+ return ST_REPLACE ;
379+ }
380+ }
381+ else {
373382 make_final_job (objspace , (VALUE )key , (VALUE )value );
374383
375384 rb_postponed_job_trigger (objspace -> finalizer_postponed_job );
@@ -380,13 +389,25 @@ rb_mmtk_update_finalizer_table_i(st_data_t key, st_data_t value, st_data_t data)
380389 return ST_CONTINUE ;
381390}
382391
392+ static int
393+ rb_mmtk_update_finalizer_table_replace_i (st_data_t * key , st_data_t * value , st_data_t data , int existing )
394+ {
395+ * key = rb_mmtk_call_object_closure ((VALUE )* key , false);
396+
397+ return ST_CONTINUE ;
398+ }
399+
383400static void
384401rb_mmtk_update_finalizer_table (void )
385402{
386403 struct objspace * objspace = rb_gc_get_objspace ();
387404
388- // TODO: replace with st_foreach_with_replace when GC is moving
389- st_foreach (objspace -> finalizer_table , rb_mmtk_update_finalizer_table_i , (st_data_t )objspace );
405+ st_foreach_with_replace (
406+ objspace -> finalizer_table ,
407+ rb_mmtk_update_finalizer_table_i ,
408+ rb_mmtk_update_finalizer_table_replace_i ,
409+ (st_data_t )objspace
410+ );
390411}
391412
392413static int
0 commit comments