1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* insns.def: Change the operand type of setinlinecache

(OFFSET to IC).  This IC must be same as corresponding
  getinlinecache instruction's IC operand.
  This change is for a little performance improvement
  (getting IC directly) and is for the AOT compilation development.
* compile.c, iseq.c, insns.def: Change the approach to handling inline
  cahce (IC) type operand to enable the above change.
  This change also affects ISeq#to_a method.  The inline cache operand
  will be dumped by fixnum, the index of inline cache, in other words,
  inline cache identity.
* template/insns_info.inc.tmpl, tool/instruction.rb: No need to count
  inline cache size (insn_iclen()).



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
ko1 2010-02-24 17:06:15 +00:00
parent ee43611393
commit d3f73f45d8
6 changed files with 94 additions and 90 deletions

View file

@ -1,3 +1,20 @@
Thu Feb 25 00:43:57 2010 Koichi Sasada <ko1@atdot.net>
* insns.def: Change the operand type of setinlinecache
(OFFSET to IC). This IC must be same as corresponding
getinlinecache instruction's IC operand.
This change is for a little performance improvement
(getting IC directly) and is for the AOT compilation development.
* compile.c, iseq.c, insns.def: Change the approach to handling inline
cahce (IC) type operand to enable the above change.
This change also affects ISeq#to_a method. The inline cache operand
will be dumped by fixnum, the index of inline cache, in other words,
inline cache identity.
* template/insns_info.inc.tmpl, tool/instruction.rb: No need to count
inline cache size (insn_iclen()).
Thu Feb 25 00:57:59 2010 Tanaka Akira <akr@fsij.org> Thu Feb 25 00:57:59 2010 Tanaka Akira <akr@fsij.org>
* pack.c (swap64): don't redefine. * pack.c (swap64): don't redefine.

136
compile.c
View file

@ -12,7 +12,6 @@
#include "ruby/ruby.h" #include "ruby/ruby.h"
#define USE_INSN_STACK_INCREASE 1 #define USE_INSN_STACK_INCREASE 1
#define USE_INSN_ICLEN 1
#include "vm_core.h" #include "vm_core.h"
#include "iseq.h" #include "iseq.h"
#include "insns.inc" #include "insns.inc"
@ -865,6 +864,7 @@ new_insn_core(rb_iseq_t *iseq, int line_no,
int insn_id, int argc, VALUE *argv) int insn_id, int argc, VALUE *argv)
{ {
INSN *iobj = compile_data_alloc_insn(iseq); INSN *iobj = compile_data_alloc_insn(iseq);
/* printf("insn_id: %d, line: %d\n", insn_id, line_no); */
iobj->link.type = ISEQ_ELEMENT_INSN; iobj->link.type = ISEQ_ELEMENT_INSN;
iobj->link.next = 0; iobj->link.next = 0;
@ -900,12 +900,13 @@ new_insn_send(rb_iseq_t *iseq, int line_no,
{ {
INSN *iobj = 0; INSN *iobj = 0;
VALUE *operands = VALUE *operands =
(VALUE *)compile_data_alloc(iseq, sizeof(VALUE) * 4); (VALUE *)compile_data_alloc(iseq, sizeof(VALUE) * 5);
operands[0] = id; operands[0] = id;
operands[1] = argc; operands[1] = argc;
operands[2] = block; operands[2] = block;
operands[3] = flag; operands[3] = flag;
iobj = new_insn_core(iseq, line_no, BIN(send), 4, operands); operands[4] = INT2FIX(iseq->ic_size++);
iobj = new_insn_core(iseq, line_no, BIN(send), 5, operands);
return iobj; return iobj;
} }
@ -1261,8 +1262,6 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
struct iseq_insn_info_entry *insn_info_table; struct iseq_insn_info_entry *insn_info_table;
LINK_ELEMENT *list; LINK_ELEMENT *list;
VALUE *generated_iseq; VALUE *generated_iseq;
int ic_size = 0;
int ic_index = 0;
int k, pos, sp, stack_max = 0, line = 0; int k, pos, sp, stack_max = 0, line = 0;
@ -1276,7 +1275,6 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
iobj = (INSN *)list; iobj = (INSN *)list;
line = iobj->line_no; line = iobj->line_no;
pos += insn_data_length(iobj); pos += insn_data_length(iobj);
ic_size += insn_iclen(iobj->insn_id);
k++; k++;
break; break;
} }
@ -1314,9 +1312,8 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
/* make instruction sequence */ /* make instruction sequence */
generated_iseq = ALLOC_N(VALUE, pos); generated_iseq = ALLOC_N(VALUE, pos);
insn_info_table = ALLOC_N(struct iseq_insn_info_entry, k); insn_info_table = ALLOC_N(struct iseq_insn_info_entry, k);
iseq->ic_entries = ALLOC_N(struct iseq_inline_cache_entry, ic_size); iseq->ic_entries = ALLOC_N(struct iseq_inline_cache_entry, iseq->ic_size);
MEMZERO(iseq->ic_entries, struct iseq_inline_cache_entry, ic_size); MEMZERO(iseq->ic_entries, struct iseq_inline_cache_entry, iseq->ic_size);
iseq->ic_size = ic_size;
list = FIRST_ELEMENT(anchor); list = FIRST_ELEMENT(anchor);
k = pos = sp = 0; k = pos = sp = 0;
@ -1325,7 +1322,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
switch (list->type) { switch (list->type) {
case ISEQ_ELEMENT_INSN: case ISEQ_ELEMENT_INSN:
{ {
int j, len, insn, iclen = 0; int j, len, insn;
const char *types; const char *types;
VALUE *operands; VALUE *operands;
@ -1338,21 +1335,19 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
} }
/* fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp); */ /* fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp); */
operands = iobj->operands; operands = iobj->operands;
insn = iobj->insn_id; insn = iobj->insn_id;
generated_iseq[pos] = insn; generated_iseq[pos] = insn;
types = insn_op_types(insn); types = insn_op_types(insn);
len = insn_len(insn); len = insn_len(insn);
iclen = insn_iclen(insn);
/* operand check */ /* operand check */
if (iobj->operand_size + iclen != len - 1) { if (iobj->operand_size != len - 1) {
printf("%d, %d, %d\n", iobj->operand_size, iclen, len); /* printf("operand size miss! (%d, %d)\n", iobj->operand_size, len); */
dump_disasm_list(list); dump_disasm_list(list);
rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no, rb_compile_error(RSTRING_PTR(iseq->filename), iobj->line_no,
"operand size miss! (%d for %d)", "operand size miss! (%d for %d)",
iobj->operand_size + iclen, len - 1); iobj->operand_size, len - 1);
xfree(generated_iseq); xfree(generated_iseq);
xfree(insn_info_table); xfree(insn_info_table);
return 0; return 0;
@ -1434,10 +1429,11 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
} }
case TS_IC: /* inline cache */ case TS_IC: /* inline cache */
{ {
IC ic = &iseq->ic_entries[ic_index++]; int ic_index = FIX2INT(operands[j]);
if (UNLIKELY(ic_index > ic_size)) { IC ic = &iseq->ic_entries[ic_index];
if (UNLIKELY(ic_index > iseq->ic_size)) {
rb_bug("iseq_set_sequence: ic_index overflow: index: %d, size: %d", rb_bug("iseq_set_sequence: ic_index overflow: index: %d, size: %d",
ic_index, ic_size); ic_index, iseq->ic_size);
} }
generated_iseq[pos + 1 + j] = (VALUE)ic; generated_iseq[pos + 1 + j] = (VALUE)ic;
break; break;
@ -1782,10 +1778,22 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
} }
static int static int
insn_set_specialized_instruction(INSN *iobj, int insn_id) insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id)
{ {
int i, old_opsize = iobj->operand_size;
iobj->insn_id = insn_id; iobj->insn_id = insn_id;
iobj->operand_size = 0; iobj->operand_size = insn_len(insn_id) - 1;
/* printf("iobj->operand_size: %d\n", iobj->operand_size); */
if (iobj->operand_size > old_opsize) {
iobj->operands = (VALUE *)compile_data_alloc(iseq, iobj->operand_size);
}
for (i=0; i<iobj->operand_size; i++) {
iobj->operands[i] = INT2FIX(iseq->ic_size++);
}
return COMPILE_OK; return COMPILE_OK;
} }
@ -1802,59 +1810,59 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
if (block == 0 && flag == INT2FIX(0)) { if (block == 0 && flag == INT2FIX(0)) {
if (argc == 0) { if (argc == 0) {
if (mid == idLength) { if (mid == idLength) {
insn_set_specialized_instruction(iobj, BIN(opt_length)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_length));
} }
else if (mid == idSize) { else if (mid == idSize) {
insn_set_specialized_instruction(iobj, BIN(opt_size)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_size));
} }
else if (mid == idSucc) { else if (mid == idSucc) {
insn_set_specialized_instruction(iobj, BIN(opt_succ)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_succ));
} }
else if (mid == idNot) { else if (mid == idNot) {
insn_set_specialized_instruction(iobj, BIN(opt_not)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_not));
} }
} }
else if (argc == 1) { else if (argc == 1) {
if (0) { if (0) {
} }
else if (mid == idPLUS) { else if (mid == idPLUS) {
insn_set_specialized_instruction(iobj, BIN(opt_plus)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_plus));
} }
else if (mid == idMINUS) { else if (mid == idMINUS) {
insn_set_specialized_instruction(iobj, BIN(opt_minus)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_minus));
} }
else if (mid == idMULT) { else if (mid == idMULT) {
insn_set_specialized_instruction(iobj, BIN(opt_mult)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_mult));
} }
else if (mid == idDIV) { else if (mid == idDIV) {
insn_set_specialized_instruction(iobj, BIN(opt_div)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_div));
} }
else if (mid == idMOD) { else if (mid == idMOD) {
insn_set_specialized_instruction(iobj, BIN(opt_mod)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_mod));
} }
else if (mid == idEq) { else if (mid == idEq) {
insn_set_specialized_instruction(iobj, BIN(opt_eq)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_eq));
} }
else if (mid == idNeq) { else if (mid == idNeq) {
insn_set_specialized_instruction(iobj, BIN(opt_neq)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_neq));
} }
else if (mid == idLT) { else if (mid == idLT) {
insn_set_specialized_instruction(iobj, BIN(opt_lt)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_lt));
} }
else if (mid == idLE) { else if (mid == idLE) {
insn_set_specialized_instruction(iobj, BIN(opt_le)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_le));
} }
else if (mid == idGT) { else if (mid == idGT) {
insn_set_specialized_instruction(iobj, BIN(opt_gt)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_gt));
} }
else if (mid == idGE) { else if (mid == idGE) {
insn_set_specialized_instruction(iobj, BIN(opt_ge)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_ge));
} }
else if (mid == idLTLT) { else if (mid == idLTLT) {
insn_set_specialized_instruction(iobj, BIN(opt_ltlt)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_ltlt));
} }
else if (mid == idAREF) { else if (mid == idAREF) {
insn_set_specialized_instruction(iobj, BIN(opt_aref)); insn_set_specialized_instruction(iseq, iobj, BIN(opt_aref));
} }
} }
} }
@ -3700,8 +3708,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
if (!poped) { if (!poped) {
ADD_INSN(ret, nd_line(node), dup); ADD_INSN(ret, nd_line(node), dup);
} }
ADD_INSN1(ret, nd_line(node), setinstancevariable, ADD_INSN2(ret, nd_line(node), setinstancevariable,
ID2SYM(node->nd_vid)); ID2SYM(node->nd_vid), INT2FIX(iseq->ic_size++));
break; break;
} }
case NODE_CDECL:{ case NODE_CDECL:{
@ -4310,8 +4318,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_IVAR:{ case NODE_IVAR:{
debugi("nd_vid", node->nd_vid); debugi("nd_vid", node->nd_vid);
if (!poped) { if (!poped) {
ADD_INSN1(ret, nd_line(node), getinstancevariable, ADD_INSN2(ret, nd_line(node), getinstancevariable,
ID2SYM(node->nd_vid)); ID2SYM(node->nd_vid), INT2FIX(iseq->ic_size++));
} }
break; break;
} }
@ -4319,13 +4327,12 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
debugi("nd_vid", node->nd_vid); debugi("nd_vid", node->nd_vid);
if (iseq->compile_data->option->inline_const_cache) { if (iseq->compile_data->option->inline_const_cache) {
LABEL *lstart = NEW_LABEL(nd_line(node));
LABEL *lend = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node));
int ic_index = iseq->ic_size++;
ADD_LABEL(ret, lstart); ADD_INSN2(ret, nd_line(node), getinlinecache, lend, INT2FIX(ic_index));
ADD_INSN1(ret, nd_line(node), getinlinecache, lend);
ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_vid)); ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_vid));
ADD_INSN1(ret, nd_line(node), setinlinecache, lstart); ADD_INSN1(ret, nd_line(node), setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend); ADD_LABEL(ret, lend);
} }
else { else {
@ -4474,16 +4481,15 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
} }
case NODE_DREGX_ONCE:{ case NODE_DREGX_ONCE:{
/* TODO: once? */ /* TODO: once? */
LABEL *lstart = NEW_LABEL(nd_line(node));
LABEL *lend = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node));
int ic_index = iseq->ic_size++;
ADD_LABEL(ret, lstart); ADD_INSN2(ret, nd_line(node), onceinlinecache, lend, INT2FIX(ic_index));
ADD_INSN1(ret, nd_line(node), onceinlinecache, lend);
ADD_INSN(ret, nd_line(node), pop); ADD_INSN(ret, nd_line(node), pop);
compile_dregx(iseq, ret, node); compile_dregx(iseq, ret, node);
ADD_INSN1(ret, nd_line(node), setinlinecache, lstart); ADD_INSN1(ret, nd_line(node), setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend); ADD_LABEL(ret, lend);
if (poped) { if (poped) {
@ -4636,8 +4642,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_COLON2:{ case NODE_COLON2:{
if (rb_is_const_id(node->nd_mid)) { if (rb_is_const_id(node->nd_mid)) {
/* constant */ /* constant */
LABEL *lstart = NEW_LABEL(nd_line(node));
LABEL *lend = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node));
int ic_index = iseq->ic_size++;
DECL_ANCHOR(pref); DECL_ANCHOR(pref);
DECL_ANCHOR(body); DECL_ANCHOR(body);
@ -4646,8 +4653,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
compile_colon2(iseq, node, pref, body); compile_colon2(iseq, node, pref, body);
if (LIST_SIZE_ZERO(pref)) { if (LIST_SIZE_ZERO(pref)) {
if (iseq->compile_data->option->inline_const_cache) { if (iseq->compile_data->option->inline_const_cache) {
ADD_LABEL(ret, lstart); ADD_INSN2(ret, nd_line(node), getinlinecache, lend, INT2FIX(ic_index));
ADD_INSN1(ret, nd_line(node), getinlinecache, lend);
} }
else { else {
ADD_INSN(ret, nd_line(node), putnil); ADD_INSN(ret, nd_line(node), putnil);
@ -4656,7 +4662,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_SEQ(ret, body); ADD_SEQ(ret, body);
if (iseq->compile_data->option->inline_const_cache) { if (iseq->compile_data->option->inline_const_cache) {
ADD_INSN1(ret, nd_line(node), setinlinecache, lstart); ADD_INSN1(ret, nd_line(node), setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend); ADD_LABEL(ret, lend);
} }
} }
@ -4678,14 +4684,14 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
break; break;
} }
case NODE_COLON3:{ case NODE_COLON3:{
LABEL *lstart = NEW_LABEL(nd_line(node));
LABEL *lend = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node));
debugi("colon3#nd_mid", node->nd_mid); int ic_index = iseq->ic_size++;
debugi("colon3#nd_mid", node->nd_mid);
/* add cache insn */ /* add cache insn */
if (iseq->compile_data->option->inline_const_cache) { if (iseq->compile_data->option->inline_const_cache) {
ADD_LABEL(ret, lstart); ADD_INSN2(ret, nd_line(node), getinlinecache, lend, INT2FIX(ic_index));
ADD_INSN1(ret, nd_line(node), getinlinecache, lend);
ADD_INSN(ret, nd_line(node), pop); ADD_INSN(ret, nd_line(node), pop);
} }
@ -4693,7 +4699,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_mid)); ADD_INSN1(ret, nd_line(node), getconstant, ID2SYM(node->nd_mid));
if (iseq->compile_data->option->inline_const_cache) { if (iseq->compile_data->option->inline_const_cache) {
ADD_INSN1(ret, nd_line(node), setinlinecache, lstart); ADD_INSN1(ret, nd_line(node), setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend); ADD_LABEL(ret, lend);
} }
@ -4821,19 +4827,18 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
break; break;
} }
case NODE_POSTEXE:{ case NODE_POSTEXE:{
LABEL *lstart = NEW_LABEL(nd_line(node));
LABEL *lend = NEW_LABEL(nd_line(node)); LABEL *lend = NEW_LABEL(nd_line(node));
VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, nd_line(node)); VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, nd_line(node));
int ic_index = iseq->ic_size++;
ADD_LABEL(ret, lstart); ADD_INSN2(ret, nd_line(node), onceinlinecache, lend, INT2FIX(ic_index));
ADD_INSN1(ret, nd_line(node), onceinlinecache, lend);
ADD_INSN(ret, nd_line(node), pop); ADD_INSN(ret, nd_line(node), pop);
ADD_INSN1(ret, nd_line(node), putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE)); ADD_INSN1(ret, nd_line(node), putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, nd_line(node), putiseq, block); ADD_INSN1(ret, nd_line(node), putiseq, block);
ADD_SEND (ret, nd_line(node), ID2SYM(id_core_set_postexe), INT2FIX(1)); ADD_SEND (ret, nd_line(node), ID2SYM(id_core_set_postexe), INT2FIX(1));
ADD_INSN1(ret, nd_line(node), setinlinecache, lstart); ADD_INSN1(ret, nd_line(node), setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend); ADD_LABEL(ret, lend);
if (poped) { if (poped) {
@ -4960,15 +4965,15 @@ insn_data_line_no(INSN *iobj)
static VALUE static VALUE
insn_data_to_s_detail(INSN *iobj) insn_data_to_s_detail(INSN *iobj)
{ {
VALUE str = rb_str_new(0, 0); VALUE str = rb_sprintf("%-16s", insn_name(iobj->insn_id));
str = rb_sprintf("%-16s", insn_name(iobj->insn_id));
if (iobj->operands) { if (iobj->operands) {
const char *types = insn_op_types(iobj->insn_id); const char *types = insn_op_types(iobj->insn_id);
int j; int j;
for (j = 0; types[j]; j++) { for (j = 0; types[j]; j++) {
char type = types[j]; char type = types[j];
printf("str: %p, type: %c\n", str, type);
switch (type) { switch (type) {
case TS_OFFSET: /* label(destination position) */ case TS_OFFSET: /* label(destination position) */
@ -5004,7 +5009,7 @@ insn_data_to_s_detail(INSN *iobj)
rb_str_cat2(str, rb_id2name(entry->id)); rb_str_cat2(str, rb_id2name(entry->id));
} }
case TS_IC: /* method cache */ case TS_IC: /* method cache */
rb_str_cat2(str, "<ic>"); rb_str_catf(str, "<ic:%d>", FIX2INT(OPERAND_AT(iobj, j)));
break; break;
case TS_CDHASH: /* case/when condition cache */ case TS_CDHASH: /* case/when condition cache */
rb_str_cat2(str, "<ch>"); rb_str_cat2(str, "<ch>");
@ -5264,6 +5269,7 @@ iseq_build_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
argv[j] = (VALUE)rb_global_entry(SYM2ID(op)); argv[j] = (VALUE)rb_global_entry(SYM2ID(op));
break; break;
case TS_IC: case TS_IC:
argv[j] = op;
break; break;
case TS_ID: case TS_ID:
argv[j] = rb_convert_type(op, T_SYMBOL, argv[j] = rb_convert_type(op, T_SYMBOL,

View file

@ -1217,12 +1217,10 @@ onceinlinecache
*/ */
DEFINE_INSN DEFINE_INSN
setinlinecache setinlinecache
(OFFSET dst) (IC ic)
(VALUE val) (VALUE val)
(VALUE val) (VALUE val)
{ {
IC ic = GET_CONST_INLINE_CACHE(dst);
if (ic->ic_value.value == Qundef) { if (ic->ic_value.value == Qundef) {
rb_ary_push(GET_ISEQ()->mark_ary, val); rb_ary_push(GET_ISEQ()->mark_ary, val);
} }

8
iseq.c
View file

@ -797,7 +797,7 @@ insn_operand_intern(rb_iseq_t *iseq,
break; break;
case TS_IC: case TS_IC:
ret = rb_str_new2("<ic>"); ret = rb_sprintf("<ic:%d>", (struct iseq_inline_cache_entry *)op - iseq->ic_entries);
break; break;
case TS_CDHASH: case TS_CDHASH:
@ -1228,8 +1228,10 @@ iseq_data_to_ary(rb_iseq_t *iseq)
rb_ary_push(ary, ID2SYM(entry->id)); rb_ary_push(ary, ID2SYM(entry->id));
} }
break; break;
case TS_IC: case TS_IC: {
rb_ary_push(ary, Qnil); struct iseq_inline_cache_entry *ic = (struct iseq_inline_cache_entry *)*seq;
rb_ary_push(ary, INT2FIX(ic - iseq->ic_entries));
}
break; break;
case TS_ID: case TS_ID:
rb_ary_push(ary, ID2SYM(*seq)); rb_ary_push(ary, ID2SYM(*seq));

View file

@ -23,10 +23,6 @@ static const int insn_len_info[] = {
<%= operands_num_info %> <%= operands_num_info %>
}; };
static const int insn_iclen_info[] = {
<%= icoperands_num_info %>
};
#ifdef USE_INSN_RET_NUM #ifdef USE_INSN_RET_NUM
static const int insn_stack_push_num_info[] = { static const int insn_stack_push_num_info[] = {
<%= stack_num_info %> <%= stack_num_info %>
@ -85,11 +81,3 @@ insn_ret_num(VALUE insn)
return insn_stack_push_num_info[(int)insn]; return insn_stack_push_num_info[(int)insn];
} }
#endif #endif
#ifdef USE_INSN_ICLEN
static int
insn_iclen(int insn)
{
return insn_iclen_info[insn];
}
#endif

View file

@ -984,7 +984,6 @@ class RubyVM
# operands info # operands info
operands_info = '' operands_info = ''
operands_num_info = '' operands_num_info = ''
icoperands_num_info = ''
@insns.each{|insn| @insns.each{|insn|
opes = insn.opes opes = insn.opes
@ -996,12 +995,6 @@ class RubyVM
num = opes.size + 1 num = opes.size + 1
operands_num_info << " #{num},\n" operands_num_info << " #{num},\n"
icnum = 0
opes.each{|e|
icnum += 1 if e[0] == 'IC'
}
icoperands_num_info << " #{icnum},\n"
} }
# stack num # stack num