From d8583b132c4ce3c203c9f5a117fd581c8c7eb6fe Mon Sep 17 00:00:00 2001 From: tenderlove Date: Mon, 9 Jul 2018 20:01:54 +0000 Subject: Remove redundant code in the compiler. During instruction translation (linked list -> iseq generation), we can treat `TS_VALUE` and `TS_ISEQ` the same as they are just embedded in the generated sequences. The only difference between `TS_ISE` and `TS_IC` is that an inline storage entry may contain a markable `VALUE` pointer at some point, so we need to flag the iseq as containing markable objects. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63923 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- compile.c | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/compile.c b/compile.c index 8f69a00e80..5a458200ec 100644 --- a/compile.c +++ b/compile.c @@ -2120,17 +2120,8 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) case TS_NUM: /* ulong */ generated_iseq[code_index + 1 + j] = FIX2INT(operands[j]); break; - case TS_ISEQ: /* iseq */ - { - VALUE v = operands[j]; - generated_iseq[code_index + 1 + j] = v; - if (!SPECIAL_CONST_P(v)) { - RB_OBJ_WRITTEN(iseq, Qundef, v); - FL_SET(iseq, ISEQ_MARKABLE_ISEQ); - } - break; - } case TS_VALUE: /* VALUE */ + case TS_ISEQ: /* iseq */ { VALUE v = operands[j]; generated_iseq[code_index + 1 + j] = v; @@ -2141,17 +2132,10 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) } break; } - case TS_IC: /* inline cache */ - { - unsigned int ic_index = FIX2UINT(operands[j]); - IC ic = (IC)&body->is_entries[ic_index]; - if (UNLIKELY(ic_index >= body->is_size)) { - rb_bug("iseq_set_sequence: ic_index overflow: index: %d, size: %d", ic_index, body->is_size); - } - generated_iseq[code_index + 1 + j] = (VALUE)ic; - break; - } case TS_ISE: /* inline storage entry */ + /* Treated as an IC, but may contain a markable VALUE */ + FL_SET(iseq, ISEQ_MARKABLE_ISEQ); + case TS_IC: /* inline cache */ { unsigned int ic_index = FIX2UINT(operands[j]); IC ic = (IC)&body->is_entries[ic_index]; @@ -2159,7 +2143,6 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor) rb_bug("iseq_set_sequence: ic_index overflow: index: %d, size: %d", ic_index, body->is_size); } generated_iseq[code_index + 1 + j] = (VALUE)ic; - FL_SET(iseq, ISEQ_MARKABLE_ISEQ); break; } case TS_CALLINFO: /* call info */ -- cgit v1.2.3