Skip to content

Commit 191bf2b

Browse files
wip - iterator for global tables
1 parent 9a607cf commit 191bf2b

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

Diff for: gc.c

+53
Original file line numberDiff line numberDiff line change
@@ -3187,6 +3187,59 @@ update_superclasses(void *objspace, VALUE obj)
31873187
extern rb_symbols_t ruby_global_symbols;
31883188
#define global_symbols ruby_global_symbols
31893189

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+
31903243
void
31913244
rb_gc_update_vm_references(void *objspace)
31923245
{

Diff for: gc/gc.h

+3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ struct st_table *rb_gc_get_overloaded_cme_table(void);
5252
struct st_table *rb_gc_get_ci_table(void);
5353
RUBY_SYMBOL_EXPORT_END
5454

55+
typedef int (*vm_tbl_iter_callback_func)(VALUE value, void *data);
56+
typedef int (*vm_tbl_update_callback_func)(VALUE *value, void *data);
57+
5558
void rb_ractor_finish_marking(void);
5659

5760
// -------------------Private section begin------------------------

0 commit comments

Comments
 (0)