@@ -3187,6 +3187,59 @@ update_superclasses(void *objspace, VALUE obj)
3187
3187
extern rb_symbols_t ruby_global_symbols ;
3188
3188
#define global_symbols ruby_global_symbols
3189
3189
3190
+ struct global_vm_tbl_iter_data {
3191
+ vm_tbl_iter_callback_func callback ;
3192
+ vm_tbl_update_callback_func update_callback ;
3193
+ void * data ;
3194
+ };
3195
+
3196
+ static int
3197
+ vm_table_iter_wrapper (st_data_t key , st_data_t value , st_data_t data , int error )
3198
+ {
3199
+ struct global_vm_tbl_iter_data * iter_data = (struct global_vm_tbl_iter_data * )data ;
3200
+ vm_tbl_iter_callback_func callback = iter_data -> callback ;
3201
+
3202
+ return (* callback )((VALUE )key , iter_data -> data );
3203
+ }
3204
+
3205
+ static int
3206
+ vm_table_update_wrapper (st_data_t * key , st_data_t * value , st_data_t data , int existing )
3207
+ {
3208
+ struct global_vm_tbl_iter_data * iter_data = (struct global_vm_tbl_iter_data * )data ;
3209
+ vm_tbl_update_callback_func callback = iter_data -> update_callback ;
3210
+
3211
+ return (* callback )((VALUE * )key , iter_data -> data );
3212
+ }
3213
+
3214
+ void
3215
+ rb_gc_vm_weak_tbl_iter (vm_tbl_iter_callback_func cb , vm_tbl_update_callback_func ucb , void * data )
3216
+ {
3217
+ rb_vm_t * vm = GET_VM ();
3218
+
3219
+ struct global_vm_tbl_iter_data iter_data = {
3220
+ .callback = cb ,
3221
+ .update_callback = ucb ,
3222
+ .data = data
3223
+ };
3224
+
3225
+ #define ITER_TABLE_WITH_CB (tbl ) do { \
3226
+ if (tbl->num_entries > 0) { \
3227
+ st_foreach_with_replace( \
3228
+ tbl, \
3229
+ vm_table_iter_wrapper, \
3230
+ vm_table_update_wrapper, \
3231
+ (st_data_t)&iter_data \
3232
+ ); \
3233
+ } \
3234
+ } while (0)
3235
+
3236
+ ITER_TABLE_WITH_CB (vm -> ci_table );
3237
+ ITER_TABLE_WITH_CB (vm -> overloaded_cme_table );
3238
+
3239
+ st_table * generic_iv_tbl = rb_generic_ivtbl_get ();
3240
+ ITER_TABLE_WITH_CB (generic_iv_tbl );
3241
+ }
3242
+
3190
3243
void
3191
3244
rb_gc_update_vm_references (void * objspace )
3192
3245
{
0 commit comments