From b202a1fe034e9e4e77fb778ad032c01d014d677f Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Sat, 7 Jun 2025 20:10:05 -0700 Subject: Use write barriers when loading catch table Found by wbcheck --- compile.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/compile.c b/compile.c index 82671ec348..a31a933ff8 100644 --- a/compile.c +++ b/compile.c @@ -12186,7 +12186,7 @@ ibf_dump_catch_table(struct ibf_dump *dump, const rb_iseq_t *iseq) } static struct iseq_catch_table * -ibf_load_catch_table(const struct ibf_load *load, ibf_offset_t catch_table_offset, unsigned int size) +ibf_load_catch_table(const struct ibf_load *load, ibf_offset_t catch_table_offset, unsigned int size, const rb_iseq_t *parent_iseq) { if (size) { struct iseq_catch_table *table = ruby_xmalloc(iseq_catch_table_bytes(size)); @@ -12203,7 +12203,8 @@ ibf_load_catch_table(const struct ibf_load *load, ibf_offset_t catch_table_offse table->entries[i].cont = (unsigned int)ibf_load_small_value(load, &reading_pos); table->entries[i].sp = (unsigned int)ibf_load_small_value(load, &reading_pos); - table->entries[i].iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)iseq_index); + rb_iseq_t *catch_iseq = (rb_iseq_t *)ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)iseq_index); + RB_OBJ_WRITE(parent_iseq, &table->entries[i].iseq, catch_iseq); } return table; } @@ -12697,7 +12698,7 @@ ibf_load_iseq_each(struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t offset) load_body->insns_info.body = ibf_load_insns_info_body(load, insns_info_body_offset, insns_info_size); load_body->insns_info.positions = ibf_load_insns_info_positions(load, insns_info_positions_offset, insns_info_size); load_body->local_table = ibf_load_local_table(load, local_table_offset, local_table_size); - load_body->catch_table = ibf_load_catch_table(load, catch_table_offset, catch_table_size); + load_body->catch_table = ibf_load_catch_table(load, catch_table_offset, catch_table_size, iseq); const rb_iseq_t *parent_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)parent_iseq_index); const rb_iseq_t *local_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)local_iseq_index); const rb_iseq_t *mandatory_only_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)mandatory_only_iseq_index); -- cgit v1.2.3