Skip to content

Commit 3fb7c4f

Browse files
jhawthornk0kubun
authored andcommitted
Use write barriers when loading catch table
Found by wbcheck
1 parent eb2f79f commit 3fb7c4f

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

compile.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13142,7 +13142,7 @@ ibf_dump_catch_table(struct ibf_dump *dump, const rb_iseq_t *iseq)
1314213142
}
1314313143

1314413144
static struct iseq_catch_table *
13145-
ibf_load_catch_table(const struct ibf_load *load, ibf_offset_t catch_table_offset, unsigned int size)
13145+
ibf_load_catch_table(const struct ibf_load *load, ibf_offset_t catch_table_offset, unsigned int size, const rb_iseq_t *parent_iseq)
1314613146
{
1314713147
if (size) {
1314813148
struct iseq_catch_table *table = ruby_xmalloc(iseq_catch_table_bytes(size));
@@ -13159,7 +13159,8 @@ ibf_load_catch_table(const struct ibf_load *load, ibf_offset_t catch_table_offse
1315913159
table->entries[i].cont = (unsigned int)ibf_load_small_value(load, &reading_pos);
1316013160
table->entries[i].sp = (unsigned int)ibf_load_small_value(load, &reading_pos);
1316113161

13162-
table->entries[i].iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)iseq_index);
13162+
rb_iseq_t *catch_iseq = (rb_iseq_t *)ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)iseq_index);
13163+
RB_OBJ_WRITE(parent_iseq, &table->entries[i].iseq, catch_iseq);
1316313164
}
1316413165
return table;
1316513166
}
@@ -13664,7 +13665,7 @@ ibf_load_iseq_each(struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t offset)
1366413665
load_body->insns_info.body = ibf_load_insns_info_body(load, insns_info_body_offset, insns_info_size);
1366513666
load_body->insns_info.positions = ibf_load_insns_info_positions(load, insns_info_positions_offset, insns_info_size);
1366613667
load_body->local_table = ibf_load_local_table(load, local_table_offset, local_table_size);
13667-
load_body->catch_table = ibf_load_catch_table(load, catch_table_offset, catch_table_size);
13668+
load_body->catch_table = ibf_load_catch_table(load, catch_table_offset, catch_table_size, iseq);
1366813669
const rb_iseq_t *parent_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)parent_iseq_index);
1366913670
const rb_iseq_t *local_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)local_iseq_index);
1367013671
const rb_iseq_t *mandatory_only_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)mandatory_only_iseq_index);

0 commit comments

Comments
 (0)