summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2024-03-27 12:53:43 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2024-03-27 13:26:22 +0900
commit16c18eafb579cf2263c7e0057c4c81358fe62075 (patch)
tree04822f8d14130b37f8e38dd4462e341f9beee1a9
parent0c114dfcc79cb4690705ec88ebf9147e5c03702d (diff)
Revert "Mark iseq structs with rb_gc_mark_movable"
This reverts commit a31ca3500d995b6706f94ff72166d699c5faeb27 which broke debug inspector API.
-rw-r--r--iseq.c30
1 files changed, 9 insertions, 21 deletions
diff --git a/iseq.c b/iseq.c
index 3e45c7b621..c2657f29d7 100644
--- a/iseq.c
+++ b/iseq.c
@@ -1386,30 +1386,18 @@ rb_iseq_remove_coverage_all(void)
static void
iseqw_mark(void *ptr)
{
- rb_gc_mark_movable(*(VALUE *)ptr);
+ rb_gc_mark((VALUE)ptr);
}
static size_t
iseqw_memsize(const void *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);
+ return rb_iseq_memsize((const rb_iseq_t *)ptr);
}
static const rb_data_type_t iseqw_data_type = {
"T_IMEMO/iseq",
- {
- iseqw_mark,
- RUBY_TYPED_DEFAULT_FREE,
- iseqw_memsize,
- iseqw_ref_update,
- },
+ {iseqw_mark, NULL, iseqw_memsize,},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY|RUBY_TYPED_WB_PROTECTED
};
@@ -1424,9 +1412,11 @@ iseqw_new(const rb_iseq_t *iseq)
return iseq->wrapper;
}
else {
- rb_iseq_t **ptr;
- VALUE obj = TypedData_Make_Struct(rb_cISeq, rb_iseq_t *, &iseqw_data_type, ptr);
- RB_OBJ_WRITE(obj, ptr, iseq);
+ union { const rb_iseq_t *in; void *out; } deconst;
+ VALUE obj;
+ deconst.in = iseq;
+ obj = TypedData_Wrap_Struct(rb_cISeq, &iseqw_data_type, deconst.out);
+ RB_OBJ_WRITTEN(obj, Qundef, iseq);
/* cache a wrapper object */
RB_OBJ_WRITE((VALUE)iseq, &iseq->wrapper, obj);
@@ -1750,9 +1740,7 @@ iseqw_s_compile_option_get(VALUE self)
static const rb_iseq_t *
iseqw_check(VALUE iseqw)
{
- rb_iseq_t **iseq_ptr;
- TypedData_Get_Struct(iseqw, rb_iseq_t *, &iseqw_data_type, iseq_ptr);
- rb_iseq_t *iseq = *iseq_ptr;
+ rb_iseq_t *iseq = DATA_PTR(iseqw);
if (!ISEQ_BODY(iseq)) {
rb_ibf_load_iseq_complete(iseq);