Skip to content

Commit

Permalink
Refactors
Browse files Browse the repository at this point in the history
  • Loading branch information
peterzhu2118 committed Oct 9, 2024
1 parent 899524c commit 184cff6
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 56 deletions.
95 changes: 47 additions & 48 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -3242,105 +3242,104 @@ update_superclasses(void *objspace, VALUE obj)
extern rb_symbols_t ruby_global_symbols;
#define global_symbols ruby_global_symbols

struct global_vm_tbl_iter_data {
vm_tbl_iter_callback_func callback;
vm_tbl_update_callback_func update_callback;
struct global_vm_table_foreach_data {
vm_table_foreach_callback_func callback;
vm_table_update_callback_func update_callback;
void *data;
};

static int
vm_table_iter_wrapper(st_data_t key, st_data_t value, st_data_t data, int error)
vm_table_foreach(st_data_t key, st_data_t value, st_data_t data, int error)
{
struct global_vm_tbl_iter_data *iter_data = (struct global_vm_tbl_iter_data *)data;
vm_tbl_iter_callback_func callback = iter_data->callback;
struct global_vm_table_foreach_data *iter_data = (struct global_vm_table_foreach_data *)data;

return (*callback)((VALUE)key, iter_data->data);
return iter_data->callback((VALUE)key, iter_data->data);
}

static int
vm_table_update_wrapper(st_data_t *key, st_data_t *value, st_data_t data, int existing)
vm_table_update(st_data_t *key, st_data_t *value, st_data_t data, int existing)
{
struct global_vm_tbl_iter_data *iter_data = (struct global_vm_tbl_iter_data *)data;
vm_tbl_update_callback_func callback = iter_data->update_callback;
struct global_vm_table_foreach_data *iter_data = (struct global_vm_table_foreach_data *)data;

return (*callback)((VALUE *)key, iter_data->data);
return iter_data->update_callback((VALUE *)key, iter_data->data);
}

static int
vm_frozen_strings_iter_wrapper(st_data_t key, st_data_t value, st_data_t data, int error)
vm_gen_ivar_foreach(st_data_t key, st_data_t value, st_data_t data, int error)
{
GC_ASSERT(RB_TYPE_P((VALUE)key, T_STRING));

int retval = vm_table_iter_wrapper(key, value, data, error);
if( retval == ST_DELETE) {
FL_UNSET((VALUE)key, RSTRING_FSTR);
int retval = vm_table_foreach(key, value, data, error);
if (retval == ST_DELETE) {
FL_UNSET((VALUE)key, FL_EXIVAR);
}
return retval;
}

static int
vm_gen_ivar_iter_wrapper(st_data_t key, st_data_t value, st_data_t data, int error)
vm_frozen_strings_foreach(st_data_t key, st_data_t value, st_data_t data, int error)
{
int retval = vm_table_iter_wrapper(key, value, data, error);
if( retval == ST_DELETE) {
FL_UNSET((VALUE)key, FL_EXIVAR);
GC_ASSERT(RB_TYPE_P((VALUE)key, T_STRING));

int retval = vm_table_foreach(key, value, data, error);
if (retval == ST_DELETE) {
FL_UNSET((VALUE)key, RSTRING_FSTR);
}
return retval;
}

void
rb_gc_vm_weak_tbl_iter(vm_tbl_iter_callback_func cb, vm_tbl_update_callback_func ucb, void *data, enum rb_gc_vm_weak_tbl_idx tbl_idx)
rb_gc_vm_weak_table_foreach(vm_table_foreach_callback_func callback,
vm_table_update_callback_func update_callback,
void *data,
enum rb_gc_vm_weak_tables table)
{
rb_vm_t *vm = GET_VM();

GC_ASSERT(tbl_idx <= ALL_VM_WEAK_TABLES);

struct global_vm_tbl_iter_data iter_data = {
.callback = cb,
.update_callback = ucb,
struct global_vm_table_foreach_data foreach_data = {
.callback = callback,
.update_callback = update_callback,
.data = data
};

#define ITER_TABLE_WITH_CB(tbl) do { \
if (tbl->num_entries > 0) { \
st_foreach_with_replace( \
tbl, \
vm_table_iter_wrapper, \
vm_table_update_wrapper, \
(st_data_t)&iter_data \
vm_table_foreach, \
vm_table_update, \
(st_data_t)&foreach_data \
); \
} \
} while (0)

switch (tbl_idx) {
switch (table) {
case RB_GC_VM_CI_TABLE: {
ITER_TABLE_WITH_CB(vm->ci_table);
break;
ITER_TABLE_WITH_CB(vm->ci_table);
break;
}
case RB_GC_VM_OVERLOADED_CME_TABLE: {
ITER_TABLE_WITH_CB(vm->overloaded_cme_table);
break;
ITER_TABLE_WITH_CB(vm->overloaded_cme_table);
break;
}
case RB_GC_VM_GLOBAL_SYMBOLS_TABLE: {
ITER_TABLE_WITH_CB(global_symbols.str_sym);
break;
ITER_TABLE_WITH_CB(global_symbols.str_sym);
break;
}
case RB_GC_VM_GENERIC_IV_TABLE: {
st_table *generic_iv_tbl = rb_generic_ivtbl_get();
if (generic_iv_tbl->num_entries > 0) {
st_foreach_with_replace(generic_iv_tbl, vm_gen_ivar_iter_wrapper, vm_table_update_wrapper, (st_data_t)&iter_data);
}
break;
st_table *generic_iv_tbl = rb_generic_ivtbl_get();
if (generic_iv_tbl->num_entries > 0) {
st_foreach_with_replace(generic_iv_tbl, vm_gen_ivar_foreach, vm_table_update, (st_data_t)&foreach_data);
}
break;
}
case RB_GC_VM_FROZEN_STRINGS_TABLE: {
st_table *frozen_strings = GET_VM()->frozen_strings;
if (frozen_strings->num_entries > 0) {
st_foreach_with_replace(frozen_strings, vm_frozen_strings_iter_wrapper, vm_table_update_wrapper, (st_data_t)&iter_data);
}
break;
st_table *frozen_strings = GET_VM()->frozen_strings;
if (frozen_strings->num_entries > 0) {
st_foreach_with_replace(frozen_strings, vm_frozen_strings_foreach, vm_table_update, (st_data_t)&foreach_data);
}
break;
}
default:
rb_bug("rb_gc_vm_weak_tbl_iter: unknown table %d", tbl_idx);
rb_bug("rb_gc_vm_weak_table_foreach: unknown table %d", table);
}
}

Expand Down
10 changes: 5 additions & 5 deletions gc/gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ struct rb_gc_vm_context {
struct rb_execution_context_struct *ec;
};

typedef int (*vm_tbl_iter_callback_func)(VALUE value, void *data);
typedef int (*vm_tbl_update_callback_func)(VALUE *value, void *data);
typedef int (*vm_table_foreach_callback_func)(VALUE value, void *data);
typedef int (*vm_table_update_callback_func)(VALUE *value, void *data);


enum rb_gc_vm_weak_tbl_idx {
enum rb_gc_vm_weak_tables {
RB_GC_VM_CI_TABLE,
RB_GC_VM_OVERLOADED_CME_TABLE,
RB_GC_VM_GLOBAL_SYMBOLS_TABLE,
Expand Down Expand Up @@ -68,8 +68,8 @@ uint32_t rb_gc_get_shape(VALUE obj);
void rb_gc_set_shape(VALUE obj, uint32_t shape_id);
uint32_t rb_gc_rebuild_shape(VALUE obj, size_t heap_id);
size_t rb_obj_memsize_of(VALUE obj);
short rb_gc_vm_weak_tbl_count(void);
void rb_gc_vm_weak_tbl_iter(vm_tbl_iter_callback_func cb, vm_tbl_update_callback_func ucb, void *data, enum rb_gc_vm_weak_tbl_idx tbl_idx);
short rb_gc_vm_weak_table_count(void);
void rb_gc_vm_weak_table_foreach(vm_table_foreach_callback_func callback, vm_table_update_callback_func update_callback, void *data, enum rb_gc_vm_weak_tables table);
RUBY_SYMBOL_EXPORT_END


Expand Down
6 changes: 3 additions & 3 deletions gc/mmtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,11 +370,11 @@ rb_mmtk_global_tables_count(void)
}

static void
rb_mmtk_update_global_tables(int tbl_idx)
rb_mmtk_update_global_tables(int table)
{
RUBY_ASSERT(tbl_idx < RB_GC_VM_WEAK_TABLE_COUNT);
RUBY_ASSERT(table < RB_GC_VM_WEAK_TABLE_COUNT);

rb_gc_vm_weak_tbl_iter(rb_mmtk_update_table_i, NULL, NULL, (enum rb_gc_vm_weak_tbl_idx)tbl_idx);
rb_gc_vm_weak_table_foreach(rb_mmtk_update_table_i, NULL, NULL, (enum rb_gc_vm_weak_tables)table);
}

// Bootup
Expand Down

0 comments on commit 184cff6

Please sign in to comment.