diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-07-09 20:01:54 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-07-09 20:01:54 +0000 |
commit | d8583b132c4ce3c203c9f5a117fd581c8c7eb6fe (patch) | |
tree | efe5b062e8a1e8cada6e0dcaeb6f403abc938ce5 | |
parent | 162cbfe631fe02f8937414d3b7f9b414463fff8c (diff) | |
download | ruby-d8583b132c4ce3c203c9f5a117fd581c8c7eb6fe.tar.gz |
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
-rw-r--r-- | compile.c | 25 |
1 files changed, 4 insertions, 21 deletions
@@ -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 */ |