aboutsummaryrefslogtreecommitdiffstats
path: root/compile.c
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-14 18:43:11 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-14 18:43:11 +0000
commit3b4e68cfab987575662d3b6fcc593306255773bf (patch)
treec5890b1f3e6ed65691e455f01c6958793ade4b18 /compile.c
parent005ee0e45533e6b11722103418ebee9d3bba4a5d (diff)
downloadruby-3b4e68cfab987575662d3b6fcc593306255773bf.tar.gz
* iseq.h (struct iseq_compile_data): use struct rb_id_table
instead of st_table. * iseq.c (prepare_iseq_build): don't allocate ivar_cache_table until it has at least one element. * iseq.c (compile_data_free): free ivar_cache_table only if it is allocated. * compile.c (get_ivar_ic_value): allocate if the table is not allocated yet. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55002 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/compile.c b/compile.c
index 8dc2abdfcf..cc496cbab8 100644
--- a/compile.c
+++ b/compile.c
@@ -19,6 +19,7 @@
#include "iseq.h"
#include "insns.inc"
#include "insns_info.inc"
+#include "id_table.h"
#include "gc.h"
#ifdef HAVE_DLADDR
@@ -1547,11 +1548,18 @@ 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);
+ struct rb_id_table *tbl = ISEQ_COMPILE_DATA(iseq)->ivar_cache_table;
+ if (tbl) {
+ if (rb_id_table_lookup(tbl,id,&val)) {
+ return val;
+ }
+ }
+ else {
+ tbl = rb_id_table_create(1);
+ ISEQ_COMPILE_DATA(iseq)->ivar_cache_table = tbl;
}
+ val = INT2FIX(iseq->body->is_size++);
+ rb_id_table_insert(tbl,id,val);
return val;
}