aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--compile.c16
-rw-r--r--iseq.c8
-rw-r--r--iseq.h2
4 files changed, 32 insertions, 8 deletions
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 <naruse@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* 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