Unused CI (introduced from peephole optimization, etc) can be NULL
so introduce NULL check.
This commit is contained in:
Koichi Sasada 2020-02-22 10:26:15 +09:00
Родитель af12e38675
Коммит 31748e69c8
1 изменённых файлов: 39 добавлений и 26 удалений

Просмотреть файл

@ -10294,6 +10294,7 @@ ibf_dump_ci_entries(struct ibf_dump *dump, const rb_iseq_t *iseq)
for (i = 0; i < ci_size; i++) {
const struct rb_callinfo *ci = cds[i].ci;
if (ci != NULL) {
ibf_dump_write_small_value(dump, ibf_dump_id(dump, vm_ci_mid(ci)));
ibf_dump_write_small_value(dump, vm_ci_flag(ci));
ibf_dump_write_small_value(dump, vm_ci_argc(ci));
@ -10311,6 +10312,11 @@ ibf_dump_ci_entries(struct ibf_dump *dump, const rb_iseq_t *iseq)
ibf_dump_write_small_value(dump, 0);
}
}
else {
// TODO: truncate NULL ci from call_data.
ibf_dump_write_small_value(dump, (VALUE)-1);
}
}
return offset;
}
@ -10331,6 +10337,7 @@ ibf_load_ci_entries(const struct ibf_load *load,
for (i = 0; i < ci_size; i++) {
VALUE mid_index = ibf_load_small_value(load, &reading_pos);
if (mid_index != (VALUE)-1) {
ID mid = ibf_load_id(load, mid_index);
unsigned int flag = (unsigned int)ibf_load_small_value(load, &reading_pos);
unsigned int argc = (unsigned int)ibf_load_small_value(load, &reading_pos);
@ -10350,6 +10357,12 @@ ibf_load_ci_entries(const struct ibf_load *load,
RB_OBJ_WRITTEN(load->iseq, Qundef, cds[i].ci);
cds[i].cc = vm_cc_empty();
}
else {
// NULL ci
cds[i].ci = NULL;
cds[i].cc = NULL;
}
}
}
static ibf_offset_t