aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/compile.c b/compile.c
index 90c021a501..8dc2abdfcf 100644
--- a/compile.c
+++ b/compile.c
@@ -1542,6 +1542,19 @@ cdhash_set_label_i(VALUE key, VALUE val, void *ptr)
return ST_CONTINUE;
}
+
+static inline VALUE
+get_ivar_ic_value(rb_iseq_t *iseq,ID id)
+{
+ VALUE val;
+ st_table *tbl = ISEQ_COMPILE_DATA(iseq)->ivar_cache_table;
+ if(!st_lookup(tbl,(st_data_t)id,&val)){
+ val = INT2FIX(iseq->body->is_size++);
+ st_insert(tbl,id,val);
+ }
+ return val;
+}
+
/**
ruby insn object list -> raw instruction sequence
*/
@@ -4604,7 +4617,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN(ret, line, dup);
}
ADD_INSN2(ret, line, setinstancevariable,
- ID2SYM(node->nd_vid), INT2FIX(iseq->body->is_size++));
+ ID2SYM(node->nd_vid),
+ get_ivar_ic_value(iseq,node->nd_vid));
break;
}
case NODE_CDECL:{
@@ -5415,7 +5429,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
debugi("nd_vid", node->nd_vid);
if (!poped) {
ADD_INSN2(ret, line, getinstancevariable,
- ID2SYM(node->nd_vid), INT2FIX(iseq->body->is_size++));
+ ID2SYM(node->nd_vid),
+ get_ivar_ic_value(iseq,node->nd_vid));
}
break;
}
@@ -8474,4 +8489,3 @@ iseq_ibf_load_extra_data(VALUE str)
RB_GC_GUARD(loader_obj);
return extra_str;
}
-