summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2026-01-31 14:14:28 +0100
committerJean Boussier <jean.boussier@gmail.com>2026-01-31 17:54:33 +0100
commit250fdd13c7a2e80bb4c58469dfc732e60a3a8b54 (patch)
treec25d44883e0a115a1dcdc6addbee10326c3302ae
parent50e987bdca0f160412b27b97c8ef49d28b8c515e (diff)
iseq.c: Replace ruby_xfree by ruby_sized_xfree
-rw-r--r--internal/gc.h2
-rw-r--r--iseq.c50
-rw-r--r--iseq.h8
3 files changed, 33 insertions, 27 deletions
diff --git a/internal/gc.h b/internal/gc.h
index b28fd25bce..e719a3ddc3 100644
--- a/internal/gc.h
+++ b/internal/gc.h
@@ -314,7 +314,7 @@ ruby_sized_xfree_inlined(void *ptr, size_t size)
((v) = (T *)ruby_sized_xrealloc2((void *)(v), (m), sizeof(T), (n)))
# define SIZED_FREE(v) ruby_sized_xfree((void *)(v), sizeof(*(v)))
-# define SIZED_FREE_N(v, n) ruby_sized_xfree((void *)(v), sizeof(*(v)) * n)
+# define SIZED_FREE_N(v, n) ruby_sized_xfree((void *)(v), sizeof(*(v)) * (n))
static inline void *
ruby_sized_realloc_n(void *ptr, size_t new_count, size_t element_size, size_t old_count)
diff --git a/iseq.c b/iseq.c
index 88aa29dce3..c418e17869 100644
--- a/iseq.c
+++ b/iseq.c
@@ -88,7 +88,7 @@ free_arena(struct iseq_compile_data_storage *cur)
while (cur) {
next = cur->next;
- ruby_xfree(cur);
+ ruby_sized_xfree(cur, offsetof(struct iseq_compile_data_storage, buff) + cur->size * sizeof(char));
cur = next;
}
}
@@ -102,7 +102,7 @@ compile_data_free(struct iseq_compile_data *compile_data)
if (compile_data->ivar_cache_table) {
rb_id_table_free(compile_data->ivar_cache_table);
}
- ruby_xfree(compile_data);
+ SIZED_FREE(compile_data);
}
}
@@ -152,13 +152,14 @@ iseq_clear_ic_references(const rb_iseq_t *iseq)
if (segments == NULL)
continue;
- for (int i = 0; segments[i]; i++) {
+ int i;
+ for (i = 0; segments[i]; i++) {
ID id = segments[i];
if (id == idNULL) continue;
remove_from_constant_cache(id, ic);
}
- ruby_xfree((void *)segments);
+ SIZED_FREE_N(segments, i + 1);
}
}
@@ -198,38 +199,41 @@ rb_iseq_free(const rb_iseq_t *iseq)
#if USE_ZJIT
rb_zjit_iseq_free(iseq);
#endif
- ruby_xfree((void *)body->iseq_encoded);
- ruby_xfree((void *)body->insns_info.body);
- ruby_xfree((void *)body->insns_info.positions);
+ SIZED_FREE_N(body->iseq_encoded, body->iseq_size);
+ SIZED_FREE_N(body->insns_info.body, body->insns_info.size);
+ SIZED_FREE_N(body->insns_info.positions, body->insns_info.size);
#if VM_INSN_INFO_TABLE_IMPL == 2
ruby_xfree(body->insns_info.succ_index_table);
#endif
- ruby_xfree((void *)body->is_entries);
- ruby_xfree(body->call_data);
- ruby_xfree((void *)body->catch_table);
- ruby_xfree((void *)body->param.opt_table);
+ SIZED_FREE_N(body->is_entries, ISEQ_IS_SIZE(body));
+ SIZED_FREE_N(body->call_data, body->ci_size);
+ if (body->catch_table) {
+ ruby_sized_xfree(body->catch_table, iseq_catch_table_bytes(body->catch_table->size));
+ }
+ SIZED_FREE_N(body->param.opt_table, body->param.opt_num + 1);
if (ISEQ_MBITS_BUFLEN(body->iseq_size) > 1 && body->mark_bits.list) {
- ruby_xfree((void *)body->mark_bits.list);
+ SIZED_FREE_N(body->mark_bits.list, ISEQ_MBITS_BUFLEN(body->iseq_size));
}
- ruby_xfree(body->variable.original_iseq);
+ ISEQ_ORIGINAL_ISEQ_CLEAR(iseq);
- if (body->param.keyword != NULL) {
- if (body->param.keyword->table != &body->local_table[body->param.keyword->bits_start - body->param.keyword->num])
- ruby_xfree((void *)body->param.keyword->table);
- if (body->param.keyword->default_values) {
- ruby_xfree((void *)body->param.keyword->default_values);
+ struct rb_iseq_param_keyword *pkw = (struct rb_iseq_param_keyword *)body->param.keyword;
+ if (pkw != NULL) {
+ if (pkw->table != &body->local_table[pkw->bits_start - pkw->num])
+ SIZED_FREE_N(pkw->table, pkw->required_num);
+ if (pkw->default_values) {
+ SIZED_FREE_N(pkw->default_values, pkw->num - pkw->required_num);
}
- ruby_xfree((void *)body->param.keyword);
+ SIZED_FREE(pkw);
}
if (LIKELY(body->local_table != rb_iseq_shared_exc_local_tbl)) {
- ruby_xfree((void *)body->local_table);
+ SIZED_FREE_N(body->local_table, body->local_table_size);
}
- ruby_xfree((void *)body->lvar_states);
+ SIZED_FREE_N(body->lvar_states, body->local_table_size);
compile_data_free(ISEQ_COMPILE_DATA(iseq));
if (body->outer_variables) rb_id_table_free(body->outer_variables);
- ruby_xfree(body);
+ SIZED_FREE(body);
}
RUBY_FREE_LEAVE("iseq");
@@ -758,7 +762,7 @@ rb_iseq_insns_info_encode_positions(const rb_iseq_t *iseq)
if (body->insns_info.succ_index_table) ruby_xfree(body->insns_info.succ_index_table);
body->insns_info.succ_index_table = succ_index_table_create(max_pos, data, size);
#if VM_CHECK_MODE == 0
- ruby_xfree(body->insns_info.positions);
+ SIZED_FREE_N(body->insns_info.positions, body->insns_info.size);
body->insns_info.positions = NULL;
#endif
#endif
diff --git a/iseq.h b/iseq.h
index 5221c8aeb4..b9bc03c23c 100644
--- a/iseq.h
+++ b/iseq.h
@@ -68,9 +68,11 @@ ISEQ_ORIGINAL_ISEQ(const rb_iseq_t *iseq)
static inline void
ISEQ_ORIGINAL_ISEQ_CLEAR(const rb_iseq_t *iseq)
{
- void *ptr = ISEQ_BODY(iseq)->variable.original_iseq;
- ISEQ_BODY(iseq)->variable.original_iseq = NULL;
- ruby_xfree(ptr);
+ VALUE *ptr = (VALUE *)ISEQ_BODY(iseq)->variable.original_iseq;
+ if (ptr) {
+ ISEQ_BODY(iseq)->variable.original_iseq = NULL;
+ SIZED_FREE_N(ptr, ISEQ_BODY(iseq)->iseq_size);
+ }
}
static inline VALUE *