From 69b3e0ac59f99bbd7e9a76af283f0be1991a3bde Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 15 Apr 2020 12:57:14 +0900 Subject: [PATCH] Create succ_index_table as a part of `iseq_setup` With compiling `CPDEBUG >= 2`, `rb_iseq_disasm` segfaults if this table has not been created. Also `ibf_load_iseq_each` calls `rb_iseq_insns_info_encode_positions`. --- compile.c | 7 +++++++ iseq.c | 8 +------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/compile.c b/compile.c index a32a7f1a0b..3c94818641 100644 --- a/compile.c +++ b/compile.c @@ -1423,6 +1423,13 @@ iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) debugs("[compile step 6 (update_catch_except_flags)] \n"); update_catch_except_flags(iseq->body); +#if VM_INSN_INFO_TABLE_IMPL == 2 + if (iseq->body->insns_info.succ_index_table == NULL) { + debugs("[compile step 7 (rb_iseq_insns_info_encode_positions)] \n"); + rb_iseq_insns_info_encode_positions(iseq); + } +#endif + if (compile_debug > 1) { VALUE str = rb_iseq_disasm(iseq); printf("%s\n", StringValueCStr(str)); diff --git a/iseq.c b/iseq.c index 9a6dad3888..9e9fdeb510 100644 --- a/iseq.c +++ b/iseq.c @@ -615,6 +615,7 @@ void rb_iseq_insns_info_encode_positions(const rb_iseq_t *iseq) { #if VM_INSN_INFO_TABLE_IMPL == 2 + /* create succ_index_table */ struct rb_iseq_constant_body *const body = iseq->body; int size = body->insns_info.size; int max_pos = body->iseq_size; @@ -657,13 +658,6 @@ finish_iseq_build(rb_iseq_t *iseq) ISEQ_COMPILE_DATA_CLEAR(iseq); compile_data_free(data); -#if VM_INSN_INFO_TABLE_IMPL == 2 /* succinct bitvector */ - /* create succ_index_table */ - if (body->insns_info.succ_index_table == NULL) { - rb_iseq_insns_info_encode_positions(iseq); - } -#endif - #if VM_CHECK_MODE > 0 && VM_INSN_INFO_TABLE_IMPL > 0 validate_get_insn_info(iseq); #endif