@@ -638,6 +638,7 @@ typedef struct gc_function_map {
638638 void (* declare_weak_references )(void * objspace_ptr , VALUE obj );
639639 bool (* handle_weak_references_alive_p )(void * objspace_ptr , VALUE obj );
640640 // Compaction
641+ void (* register_pinning_obj )(void * objspace_ptr , VALUE obj );
641642 bool (* object_moved_p )(void * objspace_ptr , VALUE obj );
642643 VALUE (* location )(void * objspace_ptr , VALUE value );
643644 // Write barriers
@@ -813,6 +814,7 @@ ruby_modular_gc_init(void)
813814 load_modular_gc_func (declare_weak_references );
814815 load_modular_gc_func (handle_weak_references_alive_p );
815816 // Compaction
817+ load_modular_gc_func (register_pinning_obj );
816818 load_modular_gc_func (object_moved_p );
817819 load_modular_gc_func (location );
818820 // Write barriers
@@ -894,6 +896,7 @@ ruby_modular_gc_init(void)
894896# define rb_gc_impl_declare_weak_references rb_gc_functions.declare_weak_references
895897# define rb_gc_impl_handle_weak_references_alive_p rb_gc_functions.handle_weak_references_alive_p
896898// Compaction
899+ # define rb_gc_impl_register_pinning_obj rb_gc_functions.register_pinning_obj
897900# define rb_gc_impl_object_moved_p rb_gc_functions.object_moved_p
898901# define rb_gc_impl_location rb_gc_functions.location
899902// Write barriers
@@ -1049,6 +1052,12 @@ rb_wb_protected_newobj_of(rb_execution_context_t *ec, VALUE klass, VALUE flags,
10491052 return newobj_of (rb_ec_ractor_ptr (ec ), klass , flags , shape_id , TRUE, size );
10501053}
10511054
1055+ void
1056+ rb_gc_register_pinning_obj (VALUE obj )
1057+ {
1058+ rb_gc_impl_register_pinning_obj (rb_gc_get_objspace (), obj );
1059+ }
1060+
10521061#define UNEXPECTED_NODE (func ) \
10531062 rb_bug(#func"(): GC does not handle T_NODE 0x%x(%p) 0x%"PRIxVALUE, \
10541063 BUILTIN_TYPE(obj), (void*)(obj), RBASIC(obj)->flags)
@@ -1069,6 +1078,8 @@ rb_data_object_wrap(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FU
10691078 if (klass ) rb_data_object_check (klass );
10701079 VALUE obj = newobj_of (GET_RACTOR (), klass , T_DATA , ROOT_SHAPE_ID , !dmark , sizeof (struct RTypedData ));
10711080
1081+ rb_gc_register_pinning_obj (obj );
1082+
10721083 struct RData * data = (struct RData * )obj ;
10731084 data -> dmark = dmark ;
10741085 data -> dfree = dfree ;
@@ -1093,6 +1104,8 @@ typed_data_alloc(VALUE klass, VALUE typed_flag, void *datap, const rb_data_type_
10931104 bool wb_protected = (type -> flags & RUBY_FL_WB_PROTECTED ) || !type -> function .dmark ;
10941105 VALUE obj = newobj_of (GET_RACTOR (), klass , T_DATA | RUBY_TYPED_FL_IS_TYPED_DATA , ROOT_SHAPE_ID , wb_protected , size );
10951106
1107+ rb_gc_register_pinning_obj (obj );
1108+
10961109 struct RTypedData * data = (struct RTypedData * )obj ;
10971110 data -> fields_obj = 0 ;
10981111 * (VALUE * )& data -> type = ((VALUE )type ) | typed_flag ;
0 commit comments