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
36 changes: 18 additions & 18 deletions enum.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ static VALUE
enum_grep0(VALUE obj, VALUE pat, VALUE test)
{
VALUE ary = rb_ary_new();
struct MEMO *memo = MEMO_NEW(pat, ary, test);
struct MEMO *memo = rb_imemo_memo_new(pat, ary, test);
rb_block_call_func_t fn;
if (rb_block_given_p()) {
fn = grep_iter_i;
Expand Down Expand Up @@ -317,7 +317,7 @@ enum_count(int argc, VALUE *argv, VALUE obj)
func = count_i;
}

memo = MEMO_NEW(item, 0, 0);
memo = rb_imemo_memo_new(item, 0, 0);
rb_block_call(obj, id_each, 0, 0, func, (VALUE)memo);
return imemo_count_value(memo);
}
Expand Down Expand Up @@ -382,7 +382,7 @@ enum_find(int argc, VALUE *argv, VALUE obj)

if_none = rb_check_arity(argc, 0, 1) ? argv[0] : Qnil;
RETURN_ENUMERATOR(obj, argc, argv);
memo = MEMO_NEW(Qundef, 0, 0);
memo = rb_imemo_memo_new(Qundef, 0, 0);
if (rb_block_pair_yield_optimizable())
rb_block_call2(obj, id_each, 0, 0, find_i_fast, (VALUE)memo, RB_BLOCK_NO_USE_PACKED_ARGS);
else
Expand Down Expand Up @@ -467,7 +467,7 @@ enum_find_index(int argc, VALUE *argv, VALUE obj)
func = find_index_i;
}

memo = MEMO_NEW(Qnil, condition_value, 0);
memo = rb_imemo_memo_new(Qnil, condition_value, 0);
rb_block_call(obj, id_each, 0, 0, func, (VALUE)memo);
return memo->v1;
}
Expand Down Expand Up @@ -1084,7 +1084,7 @@ enum_inject(int argc, VALUE *argv, VALUE obj)
return ary_inject_op(obj, init, op);
}

memo = MEMO_NEW(init, Qnil, op);
memo = rb_imemo_memo_new(init, Qnil, op);
rb_block_call(obj, id_each, 0, 0, iter, (VALUE)memo);
if (UNDEF_P(memo->v1)) return Qnil;
return memo->v1;
Expand Down Expand Up @@ -1142,7 +1142,7 @@ enum_partition(VALUE obj)

RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);

memo = MEMO_NEW(rb_ary_new(), rb_ary_new(), 0);
memo = rb_imemo_memo_new(rb_ary_new(), rb_ary_new(), 0);
rb_block_call(obj, id_each, 0, 0, partition_i, (VALUE)memo);

return rb_assoc_new(memo->v1, memo->v2);
Expand Down Expand Up @@ -1345,7 +1345,7 @@ enum_first(int argc, VALUE *argv, VALUE obj)
return enum_take(obj, argv[0]);
}
else {
memo = MEMO_NEW(Qnil, 0, 0);
memo = rb_imemo_memo_new(Qnil, 0, 0);
rb_block_call(obj, id_each, 0, 0, first_i, (VALUE)memo);
return memo->v1;
}
Expand Down Expand Up @@ -1722,7 +1722,7 @@ enum_sort_by(VALUE obj)
RBASIC_CLEAR_CLASS(ary);
buf = rb_ary_hidden_new(SORT_BY_BUFSIZE*2);
rb_ary_store(buf, SORT_BY_BUFSIZE*2-1, Qnil);
memo = MEMO_NEW(0, 0, 0);
memo = rb_imemo_memo_new(0, 0, 0);
data = (struct sort_by_data *)&memo->v1;
RB_OBJ_WRITE(memo, &data->ary, ary);
RB_OBJ_WRITE(memo, &data->buf, buf);
Expand Down Expand Up @@ -1766,7 +1766,7 @@ enum_sort_by(VALUE obj)
#define ENUM_BLOCK_CALL(name) \
rb_block_call2(obj, id_each, 0, 0, ENUMFUNC(name), (VALUE)memo, rb_block_given_p() && rb_block_pair_yield_optimizable() ? RB_BLOCK_NO_USE_PACKED_ARGS : 0);

#define MEMO_ENUM_NEW(v1) (rb_check_arity(argc, 0, 1), MEMO_NEW((v1), (argc ? *argv : 0), 0))
#define MEMO_ENUM_NEW(v1) (rb_check_arity(argc, 0, 1), rb_imemo_memo_new((v1), (argc ? *argv : 0), 0))

#define DEFINE_ENUMFUNCS(name) \
static VALUE enum_##name##_func(VALUE result, struct MEMO *memo); \
Expand Down Expand Up @@ -2754,7 +2754,7 @@ enum_min_by(int argc, VALUE *argv, VALUE obj)
if (argc && !NIL_P(num = argv[0]))
return rb_nmin_run(obj, num, 1, 0, 0);

memo = MEMO_NEW(Qundef, Qnil, 0);
memo = rb_imemo_memo_new(Qundef, Qnil, 0);
rb_block_call(obj, id_each, 0, 0, min_by_i, (VALUE)memo);
return memo->v2;
}
Expand Down Expand Up @@ -2828,7 +2828,7 @@ enum_max_by(int argc, VALUE *argv, VALUE obj)
if (argc && !NIL_P(num = argv[0]))
return rb_nmin_run(obj, num, 1, 1, 0);

memo = MEMO_NEW(Qundef, Qnil, 0);
memo = rb_imemo_memo_new(Qundef, Qnil, 0);
rb_block_call(obj, id_each, 0, 0, max_by_i, (VALUE)memo);
return memo->v2;
}
Expand Down Expand Up @@ -2979,7 +2979,7 @@ member_i(RB_BLOCK_CALL_FUNC_ARGLIST(iter, args))
static VALUE
enum_member(VALUE obj, VALUE val)
{
struct MEMO *memo = MEMO_NEW(val, Qfalse, 0);
struct MEMO *memo = rb_imemo_memo_new(val, Qfalse, 0);

rb_block_call(obj, id_each, 0, 0, member_i, (VALUE)memo);
return memo->v2;
Expand Down Expand Up @@ -3231,7 +3231,7 @@ enum_each_slice(VALUE obj, VALUE n)
size = limit_by_enum_size(obj, size);
ary = rb_ary_new2(size);
arity = rb_block_arity();
memo = MEMO_NEW(ary, dont_recycle_block_arg(arity), size);
memo = rb_imemo_memo_new(ary, dont_recycle_block_arg(arity), size);
rb_block_call(obj, id_each, 0, 0, each_slice_i, (VALUE)memo);
ary = memo->v1;
if (RARRAY_LEN(ary) > 0) rb_yield(ary);
Expand Down Expand Up @@ -3307,7 +3307,7 @@ enum_each_cons(VALUE obj, VALUE n)
RETURN_SIZED_ENUMERATOR(obj, 1, &n, enum_each_cons_size);
arity = rb_block_arity();
if (enum_size_over_p(obj, size)) return obj;
memo = MEMO_NEW(rb_ary_new2(size), dont_recycle_block_arg(arity), size);
memo = rb_imemo_memo_new(rb_ary_new2(size), dont_recycle_block_arg(arity), size);
rb_block_call(obj, id_each, 0, 0, each_cons_i, (VALUE)memo);

return obj;
Expand Down Expand Up @@ -3536,7 +3536,7 @@ enum_zip(int argc, VALUE *argv, VALUE obj)
}

/* TODO: use NODE_DOT2 as memo(v, v, -) */
memo = MEMO_NEW(result, args, 0);
memo = rb_imemo_memo_new(result, args, 0);
rb_block_call(obj, id_each, 0, 0, allary ? zip_ary : zip_i, (VALUE)memo);

return result;
Expand Down Expand Up @@ -3579,7 +3579,7 @@ enum_take(VALUE obj, VALUE n)

if (len == 0) return rb_ary_new2(0);
result = rb_ary_new2(len);
memo = MEMO_NEW(result, 0, len);
memo = rb_imemo_memo_new(result, 0, len);
rb_block_call(obj, id_each, 0, 0, take_i, (VALUE)memo);
return result;
}
Expand Down Expand Up @@ -3667,7 +3667,7 @@ enum_drop(VALUE obj, VALUE n)
}

result = rb_ary_new();
memo = MEMO_NEW(result, 0, len);
memo = rb_imemo_memo_new(result, 0, len);
rb_block_call(obj, id_each, 0, 0, drop_i, (VALUE)memo);
return result;
}
Expand Down Expand Up @@ -3726,7 +3726,7 @@ enum_drop_while(VALUE obj)

RETURN_ENUMERATOR(obj, 0, 0);
result = rb_ary_new();
memo = MEMO_NEW(result, 0, FALSE);
memo = rb_imemo_memo_new(result, 0, FALSE);
rb_block_call(obj, id_each, 0, 0, drop_while_i, (VALUE)memo);
return result;
}
Expand Down
18 changes: 13 additions & 5 deletions enumerator.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ enumerator_with_index(int argc, VALUE *argv, VALUE obj)
rb_check_arity(argc, 0, 1);
RETURN_SIZED_ENUMERATOR(obj, argc, argv, enumerator_enum_size);
memo = (!argc || NIL_P(memo = argv[0])) ? INT2FIX(0) : rb_to_int(memo);
return enumerator_block_call(obj, enumerator_with_index_i, (VALUE)MEMO_NEW(memo, 0, 0));
return enumerator_block_call(obj, enumerator_with_index_i, (VALUE)rb_imemo_memo_new(memo, 0, 0));
}

/*
Expand Down Expand Up @@ -1613,7 +1613,7 @@ lazy_init_yielder(RB_BLOCK_CALL_FUNC_ARGLIST(_, m))
VALUE memos = rb_attr_get(yielder, id_memo);
struct MEMO *result;

result = MEMO_NEW(m, rb_enum_values_pack(argc, argv),
result = rb_imemo_memo_new(m, rb_enum_values_pack(argc, argv),
argc > 1 ? LAZY_MEMO_PACKED : 0);
return lazy_yielder_result(result, yielder, procs_array, memos, 0);
}
Expand Down Expand Up @@ -3581,9 +3581,9 @@ enum_product_enum_size(VALUE obj, VALUE args, VALUE eobj)
struct product_state {
VALUE obj;
VALUE block;
int index;
int argc;
VALUE *argv;
int index;
};

static VALUE product_each(VALUE, struct product_state *);
Expand Down Expand Up @@ -3622,15 +3622,23 @@ enum_product_run(VALUE obj, VALUE block)
{
struct enum_product *ptr = enum_product_ptr(obj);
int argc = RARRAY_LENINT(ptr->enums);
if (argc == 0) { /* no need to allocate state.argv */
rb_funcall(block, id_call, 1, rb_ary_new());
return obj;
}

VALUE argsbuf = 0;
struct product_state state = {
.obj = obj,
.block = block,
.index = 0,
.argc = argc,
.argv = ALLOCA_N(VALUE, argc),
.argv = ALLOCV_N(VALUE, argsbuf, argc),
};

return product_each(obj, &state);
VALUE ret = product_each(obj, &state);
ALLOCV_END(argsbuf);
return ret;
}

/*
Expand Down
21 changes: 21 additions & 0 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -638,6 +638,7 @@ typedef struct gc_function_map {
void (*declare_weak_references)(void *objspace_ptr, VALUE obj);
bool (*handle_weak_references_alive_p)(void *objspace_ptr, VALUE obj);
// Compaction
void (*register_pinning_obj)(void *objspace_ptr, VALUE obj);
bool (*object_moved_p)(void *objspace_ptr, VALUE obj);
VALUE (*location)(void *objspace_ptr, VALUE value);
// Write barriers
Expand Down Expand Up @@ -813,6 +814,7 @@ ruby_modular_gc_init(void)
load_modular_gc_func(declare_weak_references);
load_modular_gc_func(handle_weak_references_alive_p);
// Compaction
load_modular_gc_func(register_pinning_obj);
load_modular_gc_func(object_moved_p);
load_modular_gc_func(location);
// Write barriers
Expand Down Expand Up @@ -894,6 +896,7 @@ ruby_modular_gc_init(void)
# define rb_gc_impl_declare_weak_references rb_gc_functions.declare_weak_references
# define rb_gc_impl_handle_weak_references_alive_p rb_gc_functions.handle_weak_references_alive_p
// Compaction
# define rb_gc_impl_register_pinning_obj rb_gc_functions.register_pinning_obj
# define rb_gc_impl_object_moved_p rb_gc_functions.object_moved_p
# define rb_gc_impl_location rb_gc_functions.location
// Write barriers
Expand Down Expand Up @@ -1049,6 +1052,12 @@ rb_wb_protected_newobj_of(rb_execution_context_t *ec, VALUE klass, VALUE flags,
return newobj_of(rb_ec_ractor_ptr(ec), klass, flags, shape_id, TRUE, size);
}

void
rb_gc_register_pinning_obj(VALUE obj)
{
rb_gc_impl_register_pinning_obj(rb_gc_get_objspace(), obj);
}

#define UNEXPECTED_NODE(func) \
rb_bug(#func"(): GC does not handle T_NODE 0x%x(%p) 0x%"PRIxVALUE, \
BUILTIN_TYPE(obj), (void*)(obj), RBASIC(obj)->flags)
Expand All @@ -1069,6 +1078,8 @@ rb_data_object_wrap(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FU
if (klass) rb_data_object_check(klass);
VALUE obj = newobj_of(GET_RACTOR(), klass, T_DATA, ROOT_SHAPE_ID, !dmark, sizeof(struct RTypedData));

rb_gc_register_pinning_obj(obj);

struct RData *data = (struct RData *)obj;
data->dmark = dmark;
data->dfree = dfree;
Expand All @@ -1093,6 +1104,8 @@ typed_data_alloc(VALUE klass, VALUE typed_flag, void *datap, const rb_data_type_
bool wb_protected = (type->flags & RUBY_FL_WB_PROTECTED) || !type->function.dmark;
VALUE obj = newobj_of(GET_RACTOR(), klass, T_DATA | RUBY_TYPED_FL_IS_TYPED_DATA, ROOT_SHAPE_ID, wb_protected, size);

rb_gc_register_pinning_obj(obj);

struct RTypedData *data = (struct RTypedData *)obj;
data->fields_obj = 0;
*(VALUE *)&data->type = ((VALUE)type) | typed_flag;
Expand Down Expand Up @@ -3160,6 +3173,14 @@ gc_mark_classext_iclass(rb_classext_t *ext, bool prime, VALUE box_value, void *a

#define TYPED_DATA_REFS_OFFSET_LIST(d) (size_t *)(uintptr_t)RTYPEDDATA_TYPE(d)->function.dmark

void
rb_gc_move_obj_during_marking(VALUE from, VALUE to)
{
if (rb_obj_gen_fields_p(to)) {
rb_mark_generic_ivar(from);
}
}

void
rb_gc_mark_children(void *objspace, VALUE obj)
{
Expand Down
6 changes: 6 additions & 0 deletions gc/default/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -7059,6 +7059,12 @@ gc_sort_heap_by_compare_func(rb_objspace_t *objspace, gc_compact_compare_func co
}
#endif

void
rb_gc_impl_register_pinning_obj(void *objspace_ptr, VALUE obj)
{
/* no-op */
}

bool
rb_gc_impl_object_moved_p(void *objspace_ptr, VALUE obj)
{
Expand Down
1 change: 1 addition & 0 deletions gc/gc.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ MODULAR_GC_FN void *rb_gc_get_ractor_newobj_cache(void);
MODULAR_GC_FN void rb_gc_initialize_vm_context(struct rb_gc_vm_context *context);
MODULAR_GC_FN void rb_gc_worker_thread_set_vm_context(struct rb_gc_vm_context *context);
MODULAR_GC_FN void rb_gc_worker_thread_unset_vm_context(struct rb_gc_vm_context *context);
MODULAR_GC_FN void rb_gc_move_obj_during_marking(VALUE from, VALUE to);
#endif

#if USE_MODULAR_GC
Expand Down
1 change: 1 addition & 0 deletions gc/gc_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ GC_IMPL_FN void rb_gc_impl_mark_maybe(void *objspace_ptr, VALUE obj);
GC_IMPL_FN void rb_gc_impl_declare_weak_references(void *objspace_ptr, VALUE obj);
GC_IMPL_FN bool rb_gc_impl_handle_weak_references_alive_p(void *objspace_ptr, VALUE obj);
// Compaction
GC_IMPL_FN void rb_gc_impl_register_pinning_obj(void *objspace_ptr, VALUE obj);
GC_IMPL_FN bool rb_gc_impl_object_moved_p(void *objspace_ptr, VALUE obj);
GC_IMPL_FN VALUE rb_gc_impl_location(void *objspace_ptr, VALUE value);
// Write barriers
Expand Down
2 changes: 1 addition & 1 deletion gc/mmtk/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ probe = "0.5"
sysinfo = "0.32.0"

[dependencies.mmtk]
features = ["is_mmtk_object", "object_pinning", "sticky_immix_non_moving_nursery", "immix_non_moving"]
features = ["is_mmtk_object", "object_pinning", "sticky_immix_non_moving_nursery"]

# Uncomment the following lines to use mmtk-core from the official repository.
git = "https://github.com/mmtk/mmtk-core.git"
Expand Down
Loading