Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 27 additions & 72 deletions enumerator.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,28 +280,20 @@ enumerator_ptr(VALUE obj)
}

static void
proc_entry_mark(void *p)
proc_entry_mark_and_move(void *p)
{
struct proc_entry *ptr = p;
rb_gc_mark_movable(ptr->proc);
rb_gc_mark_movable(ptr->memo);
}

static void
proc_entry_compact(void *p)
{
struct proc_entry *ptr = p;
ptr->proc = rb_gc_location(ptr->proc);
ptr->memo = rb_gc_location(ptr->memo);
rb_gc_mark_and_move(&ptr->proc);
rb_gc_mark_and_move(&ptr->memo);
}

static const rb_data_type_t proc_entry_data_type = {
"proc_entry",
{
proc_entry_mark,
proc_entry_mark_and_move,
RUBY_TYPED_DEFAULT_FREE,
NULL, // Nothing allocated externally, so don't need a memsize function
proc_entry_compact,
proc_entry_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
};
Expand Down Expand Up @@ -1280,26 +1272,19 @@ enumerator_size(VALUE obj)
* Yielder
*/
static void
yielder_mark(void *p)
yielder_mark_and_move(void *p)
{
struct yielder *ptr = p;
rb_gc_mark_movable(ptr->proc);
}

static void
yielder_compact(void *p)
{
struct yielder *ptr = p;
ptr->proc = rb_gc_location(ptr->proc);
rb_gc_mark_and_move(&ptr->proc);
}

static const rb_data_type_t yielder_data_type = {
"yielder",
{
yielder_mark,
yielder_mark_and_move,
RUBY_TYPED_DEFAULT_FREE,
NULL,
yielder_compact,
yielder_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
};
Expand Down Expand Up @@ -1410,28 +1395,20 @@ yielder_new(void)
* Generator
*/
static void
generator_mark(void *p)
{
struct generator *ptr = p;
rb_gc_mark_movable(ptr->proc);
rb_gc_mark_movable(ptr->obj);
}

static void
generator_compact(void *p)
generator_mark_and_move(void *p)
{
struct generator *ptr = p;
ptr->proc = rb_gc_location(ptr->proc);
ptr->obj = rb_gc_location(ptr->obj);
rb_gc_mark_and_move(&ptr->proc);
rb_gc_mark_and_move(&ptr->obj);
}

static const rb_data_type_t generator_data_type = {
"generator",
{
generator_mark,
generator_mark_and_move,
RUBY_TYPED_DEFAULT_FREE,
NULL,
generator_compact,
generator_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
};
Expand Down Expand Up @@ -2894,19 +2871,11 @@ stop_result(VALUE self)
*/

static void
producer_mark(void *p)
producer_mark_and_move(void *p)
{
struct producer *ptr = p;
rb_gc_mark_movable(ptr->init);
rb_gc_mark_movable(ptr->proc);
}

static void
producer_compact(void *p)
{
struct producer *ptr = p;
ptr->init = rb_gc_location(ptr->init);
ptr->proc = rb_gc_location(ptr->proc);
rb_gc_mark_and_move(&ptr->init);
rb_gc_mark_and_move(&ptr->proc);
}

#define producer_free RUBY_TYPED_DEFAULT_FREE
Expand All @@ -2920,10 +2889,10 @@ producer_memsize(const void *p)
static const rb_data_type_t producer_data_type = {
"producer",
{
producer_mark,
producer_mark_and_move,
producer_free,
producer_memsize,
producer_compact,
producer_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
};
Expand Down Expand Up @@ -3082,17 +3051,10 @@ enumerator_s_produce(int argc, VALUE *argv, VALUE klass)
*/

static void
enum_chain_mark(void *p)
enum_chain_mark_and_move(void *p)
{
struct enum_chain *ptr = p;
rb_gc_mark_movable(ptr->enums);
}

static void
enum_chain_compact(void *p)
{
struct enum_chain *ptr = p;
ptr->enums = rb_gc_location(ptr->enums);
rb_gc_mark_and_move(&ptr->enums);
}

#define enum_chain_free RUBY_TYPED_DEFAULT_FREE
Expand All @@ -3106,10 +3068,10 @@ enum_chain_memsize(const void *p)
static const rb_data_type_t enum_chain_data_type = {
"chain",
{
enum_chain_mark,
enum_chain_mark_and_move,
enum_chain_free,
enum_chain_memsize,
enum_chain_compact,
enum_chain_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};
Expand Down Expand Up @@ -3404,17 +3366,10 @@ enumerator_plus(VALUE obj, VALUE eobj)
*/

static void
enum_product_mark(void *p)
{
struct enum_product *ptr = p;
rb_gc_mark_movable(ptr->enums);
}

static void
enum_product_compact(void *p)
enum_product_mark_and_move(void *p)
{
struct enum_product *ptr = p;
ptr->enums = rb_gc_location(ptr->enums);
rb_gc_mark_and_move(&ptr->enums);
}

#define enum_product_free RUBY_TYPED_DEFAULT_FREE
Expand All @@ -3428,10 +3383,10 @@ enum_product_memsize(const void *p)
static const rb_data_type_t enum_product_data_type = {
"product",
{
enum_product_mark,
enum_product_mark_and_move,
enum_product_free,
enum_product_memsize,
enum_product_compact,
enum_product_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};
Expand Down
21 changes: 6 additions & 15 deletions error.c
Original file line number Diff line number Diff line change
Expand Up @@ -2517,30 +2517,21 @@ typedef struct name_error_message_struct {
} name_error_message_t;

static void
name_err_mesg_mark(void *p)
name_err_mesg_mark_and_move(void *p)
{
name_error_message_t *ptr = (name_error_message_t *)p;
rb_gc_mark_movable(ptr->mesg);
rb_gc_mark_movable(ptr->recv);
rb_gc_mark_movable(ptr->name);
}

static void
name_err_mesg_update(void *p)
{
name_error_message_t *ptr = (name_error_message_t *)p;
ptr->mesg = rb_gc_location(ptr->mesg);
ptr->recv = rb_gc_location(ptr->recv);
ptr->name = rb_gc_location(ptr->name);
rb_gc_mark_and_move(&ptr->mesg);
rb_gc_mark_and_move(&ptr->recv);
rb_gc_mark_and_move(&ptr->name);
}

static const rb_data_type_t name_err_mesg_data_type = {
"name_err_mesg",
{
name_err_mesg_mark,
name_err_mesg_mark_and_move,
RUBY_TYPED_DEFAULT_FREE,
NULL, // No external memory to report,
name_err_mesg_update,
name_err_mesg_mark_and_move,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_EMBEDDABLE
};
Expand Down
4 changes: 2 additions & 2 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -3028,7 +3028,7 @@ rb_gc_mark_roots(void *objspace, const char **categoryp)
mark_current_machine_context(ec);

MARK_CHECKPOINT("global_symbols");
rb_sym_global_symbols_mark();
rb_sym_global_symbols_mark_and_move();

MARK_CHECKPOINT("finish");

Expand Down Expand Up @@ -4045,7 +4045,7 @@ rb_gc_update_vm_references(void *objspace)

rb_vm_update_references(vm);
rb_gc_update_global_tbl();
rb_sym_global_symbols_update_references();
rb_sym_global_symbols_mark_and_move();

#if USE_YJIT
void rb_yjit_root_update_references(void); // in Rust
Expand Down
3 changes: 3 additions & 0 deletions imemo.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,9 @@ rb_imemo_mark_and_move(VALUE obj, bool reference_updating)
}
}
else {
RUBY_ASSERT(RB_TYPE_P(cc->klass, T_CLASS) || RB_TYPE_P(cc->klass, T_ICLASS));
RUBY_ASSERT(IMEMO_TYPE_P((VALUE)cc->cme_, imemo_ment));

rb_gc_mark_weak((VALUE *)&cc->klass);
if ((vm_cc_super_p(cc) || vm_cc_refinement_p(cc))) {
rb_gc_mark_movable((VALUE)cc->cme_);
Expand Down
3 changes: 1 addition & 2 deletions internal/symbol.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
#endif

/* symbol.c */
void rb_sym_global_symbols_mark(void);
void rb_sym_global_symbols_update_references(void);
void rb_sym_global_symbols_mark_and_move(void);
VALUE rb_to_symbol_type(VALUE obj);
VALUE rb_sym_intern(const char *ptr, long len, rb_encoding *enc);
VALUE rb_sym_intern_ascii(const char *ptr, long len);
Expand Down
30 changes: 7 additions & 23 deletions marshal.c
Original file line number Diff line number Diff line change
Expand Up @@ -2572,19 +2572,19 @@ Init_marshal(void)
}

static int
marshal_compat_table_mark_i(st_data_t key, st_data_t value, st_data_t _)
marshal_compat_table_mark_and_move_i(st_data_t key, st_data_t value, st_data_t _)
{
marshal_compat_t *p = (marshal_compat_t *)value;
rb_gc_mark_movable(p->newclass);
rb_gc_mark_movable(p->oldclass);
rb_gc_mark_and_move(&p->newclass);
rb_gc_mark_and_move(&p->oldclass);
return ST_CONTINUE;
}

static void
marshal_compat_table_mark(void *tbl)
marshal_compat_table_mark_and_move(void *tbl)
{
if (!tbl) return;
st_foreach(tbl, marshal_compat_table_mark_i, 0);
st_foreach(tbl, marshal_compat_table_mark_and_move_i, 0);
}

static int
Expand All @@ -2607,29 +2607,13 @@ marshal_compat_table_memsize(const void *data)
return st_memsize(data) + sizeof(marshal_compat_t) * st_table_size(data);
}

static int
marshal_compat_table_compact_i(st_data_t key, st_data_t value, st_data_t _)
{
marshal_compat_t *p = (marshal_compat_t *)value;
p->newclass = rb_gc_location(p->newclass);
p->oldclass = rb_gc_location(p->oldclass);
return ST_CONTINUE;
}

static void
marshal_compat_table_compact(void *tbl)
{
if (!tbl) return;
st_foreach(tbl, marshal_compat_table_compact_i, 0);
}

static const rb_data_type_t marshal_compat_type = {
.wrap_struct_name = "marshal_compat_table",
.function = {
.dmark = marshal_compat_table_mark,
.dmark = marshal_compat_table_mark_and_move,
.dfree = marshal_compat_table_free,
.dsize = marshal_compat_table_memsize,
.dcompact = marshal_compat_table_compact,
.dcompact = marshal_compat_table_mark_and_move,
},
.flags = RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY,
};
Expand Down
4 changes: 1 addition & 3 deletions set.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,7 @@ set_foreach_replace(st_data_t key, st_data_t argp, int error)
static int
set_replace_ref(st_data_t *key, st_data_t argp, int existing)
{
if (rb_gc_location((VALUE)*key) != (VALUE)*key) {
*key = rb_gc_location((VALUE)*key);
}
rb_gc_mark_and_move((VALUE *)key);

return ST_CONTINUE;
}
Expand Down
21 changes: 4 additions & 17 deletions shape.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,26 +296,13 @@ rb_shape_get_root_shape(void)
}

static void
shape_tree_mark(void *data)
shape_tree_mark_and_move(void *data)
{
rb_shape_t *cursor = rb_shape_get_root_shape();
rb_shape_t *end = RSHAPE(rb_shape_tree.next_shape_id - 1);
while (cursor <= end) {
if (cursor->edges && !SINGLE_CHILD_P(cursor->edges)) {
rb_gc_mark_movable(cursor->edges);
}
cursor++;
}
}

static void
shape_tree_compact(void *data)
{
rb_shape_t *cursor = rb_shape_get_root_shape();
rb_shape_t *end = RSHAPE(rb_shape_tree.next_shape_id - 1);
while (cursor <= end) {
if (cursor->edges && !SINGLE_CHILD_P(cursor->edges)) {
cursor->edges = rb_gc_location(cursor->edges);
rb_gc_mark_and_move(&cursor->edges);
}
cursor++;
}
Expand All @@ -330,10 +317,10 @@ shape_tree_memsize(const void *data)
static const rb_data_type_t shape_tree_type = {
.wrap_struct_name = "VM/shape_tree",
.function = {
.dmark = shape_tree_mark,
.dmark = shape_tree_mark_and_move,
.dfree = NULL, // Nothing to free, done at VM exit in rb_shape_free_all,
.dsize = shape_tree_memsize,
.dcompact = shape_tree_compact,
.dcompact = shape_tree_mark_and_move,
},
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
};
Expand Down
Loading