diff options
| author | John Hawthorn <john@hawthorn.email> | 2025-06-07 20:10:05 -0700 |
|---|---|---|
| committer | nagachika <nagachika@ruby-lang.org> | 2025-10-05 09:37:26 +0900 |
| commit | b202a1fe034e9e4e77fb778ad032c01d014d677f (patch) | |
| tree | 979ae2bb99345f2cdc32c7778db92ced375dad67 | |
| parent | 7a4c7eac9b262fd7036d86b58d0dc2f188bd5838 (diff) | |
Use write barriers when loading catch table
Found by wbcheck
| -rw-r--r-- | compile.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -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); |
