diff --git a/ChangeLog b/ChangeLog index b36e6958a2..cb15973eb7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Sun May 15 03:13:01 2016 NARUSE, Yui + + * 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. + Sat May 14 09:04:34 2016 Nobuyoshi Nakada * lib/mkmf.rb (pkg_config): use xsystem consistently to set up 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; } diff --git a/iseq.c b/iseq.c index 2a4d58e611..28d35eb328 100644 --- a/iseq.c +++ b/iseq.c @@ -21,6 +21,7 @@ #include "gc.h" #include "vm_core.h" #include "iseq.h" +#include "id_table.h" #include "insns.inc" #include "insns_info.inc" @@ -58,8 +59,9 @@ compile_data_free(struct iseq_compile_data *compile_data) ruby_xfree(cur); cur = next; } - st_free_table(compile_data->ivar_cache_table); - + if (compile_data->ivar_cache_table) { + rb_id_table_free(compile_data->ivar_cache_table); + } ruby_xfree(compile_data); } } @@ -300,7 +302,7 @@ prepare_iseq_build(rb_iseq_t *iseq, ISEQ_COMPILE_DATA(iseq)->option = option; ISEQ_COMPILE_DATA(iseq)->last_coverable_line = -1; - ISEQ_COMPILE_DATA(iseq)->ivar_cache_table = st_init_numtable(); + ISEQ_COMPILE_DATA(iseq)->ivar_cache_table = NULL; if (option->coverage_enabled) { VALUE coverages = rb_get_coverages(); diff --git a/iseq.h b/iseq.h index d6b0e54820..6a5cb8bdad 100644 --- a/iseq.h +++ b/iseq.h @@ -213,7 +213,7 @@ struct iseq_compile_data { unsigned int ci_index; unsigned int ci_kw_index; const rb_compile_option_t *option; - st_table *ivar_cache_table; + struct rb_id_table *ivar_cache_table; #if SUPPORT_JOKE st_table *labels_table; #endif