From e3ab525f699b5191db70ef095b3d110890441940 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 27 Jun 2022 14:31:15 -0700 Subject: Fix ISeq dump / load in array cases We need to dump relative offsets for inline storage entries so that loading iseqs as an array works as well. This commit also has some minor refactoring to make computing relative ISE information easier. This should fix the iseq dump / load as array tests we're seeing fail in CI. Co-Authored-By: John Hawthorn --- iseq.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'iseq.c') diff --git a/iseq.c b/iseq.c index 7f02e1b9e5..0ac67f62bc 100644 --- a/iseq.c +++ b/iseq.c @@ -2943,6 +2943,26 @@ iseq_type_id(enum iseq_type type) rb_bug("unsupported iseq type: %d", (int)type); } +union iseq_inline_storage_entry * +ISEQ_IS_ENTRY_START(const struct rb_iseq_constant_body *body, char op_type) +{ + unsigned int relative_ic_offset = 0; + + switch(op_type) { + case TS_IC: + relative_ic_offset += body->ise_size; + case TS_ISE: + relative_ic_offset += body->ivc_size; + case TS_IVC: + case TS_ICVARC: + break; + default: + rb_bug("Wrong op type"); + } + + return &body->is_entries[relative_ic_offset]; +} + static VALUE iseq_data_to_ary(const rb_iseq_t *iseq) { @@ -3048,7 +3068,9 @@ iseq_data_to_ary(const rb_iseq_t *iseq) rb_ary_push(ary, ID2SYM(insn_syms[insn%numberof(insn_syms)])); for (j=0; jis_entries)); + rb_ary_push(ary, INT2FIX(is - ISEQ_IS_ENTRY_START(ISEQ_BODY(iseq), op_type))); } break; case TS_CALLDATA: -- cgit v1.2.3