Reapply "Mark iseq structs with rb_gc_mark_movable"

This reverts commit 16c18eafb579cf2263c7e0057c4c81358fe62075.
This commit is contained in:
Peter Zhu 2024-04-01 15:46:51 -04:00
parent 25e28559c1
commit 4960a598d6

32
iseq.c
View File

@ -1384,18 +1384,30 @@ rb_iseq_remove_coverage_all(void)
static void static void
iseqw_mark(void *ptr) iseqw_mark(void *ptr)
{ {
rb_gc_mark((VALUE)ptr); rb_gc_mark_movable(*(VALUE *)ptr);
} }
static size_t static size_t
iseqw_memsize(const void *ptr) iseqw_memsize(const void *ptr)
{ {
return rb_iseq_memsize((const rb_iseq_t *)ptr); return rb_iseq_memsize(*(const rb_iseq_t **)ptr);
}
static void
iseqw_ref_update(void *ptr)
{
VALUE *vptr = ptr;
*vptr = rb_gc_location(*vptr);
} }
static const rb_data_type_t iseqw_data_type = { static const rb_data_type_t iseqw_data_type = {
"T_IMEMO/iseq", "T_IMEMO/iseq",
{iseqw_mark, NULL, iseqw_memsize,}, {
iseqw_mark,
RUBY_TYPED_DEFAULT_FREE,
iseqw_memsize,
iseqw_ref_update,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED 0, 0, RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED
}; };
@ -1403,18 +1415,16 @@ static VALUE
iseqw_new(const rb_iseq_t *iseq) iseqw_new(const rb_iseq_t *iseq)
{ {
if (iseq->wrapper) { if (iseq->wrapper) {
if (rb_check_typeddata(iseq->wrapper, &iseqw_data_type) != iseq) { if (*(const rb_iseq_t **)rb_check_typeddata(iseq->wrapper, &iseqw_data_type) != iseq) {
rb_raise(rb_eTypeError, "wrong iseq wrapper: %" PRIsVALUE " for %p", rb_raise(rb_eTypeError, "wrong iseq wrapper: %" PRIsVALUE " for %p",
iseq->wrapper, (void *)iseq); iseq->wrapper, (void *)iseq);
} }
return iseq->wrapper; return iseq->wrapper;
} }
else { else {
union { const rb_iseq_t *in; void *out; } deconst; rb_iseq_t **ptr;
VALUE obj; VALUE obj = TypedData_Make_Struct(rb_cISeq, rb_iseq_t *, &iseqw_data_type, ptr);
deconst.in = iseq; RB_OBJ_WRITE(obj, ptr, iseq);
obj = TypedData_Wrap_Struct(rb_cISeq, &iseqw_data_type, deconst.out);
RB_OBJ_WRITTEN(obj, Qundef, iseq);
/* cache a wrapper object */ /* cache a wrapper object */
RB_OBJ_WRITE((VALUE)iseq, &iseq->wrapper, obj); RB_OBJ_WRITE((VALUE)iseq, &iseq->wrapper, obj);
@ -1738,7 +1748,9 @@ iseqw_s_compile_option_get(VALUE self)
static const rb_iseq_t * static const rb_iseq_t *
iseqw_check(VALUE iseqw) iseqw_check(VALUE iseqw)
{ {
rb_iseq_t *iseq = DATA_PTR(iseqw); rb_iseq_t **iseq_ptr;
TypedData_Get_Struct(iseqw, rb_iseq_t *, &iseqw_data_type, iseq_ptr);
rb_iseq_t *iseq = *iseq_ptr;
if (!ISEQ_BODY(iseq)) { if (!ISEQ_BODY(iseq)) {
rb_ibf_load_iseq_complete(iseq); rb_ibf_load_iseq_complete(iseq);