aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-23 11:01:02 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-01-23 11:01:02 +0000
commite567f351c287dcfdf1c25518cca140d661c01985 (patch)
tree4e464e9dbc9e001c5f4fab5b9a65dafca26ae9e1
parentbb7830c7d4026d3f9022bc3046c8591b5f9221ae (diff)
downloadruby-e567f351c287dcfdf1c25518cca140d661c01985.tar.gz
marshal.c: indetity tables
* marshal.c (w_object, marshal_dump): use indetity tables for arbitrary VALUE keys, because of performance of FLONUM. [Bug #10761] * marshal.c (obj_alloc_by_klass, marshal_load): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49389 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--hash.c12
-rw-r--r--internal.h2
-rw-r--r--marshal.c8
4 files changed, 26 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ad590db3b..50772fd0ca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Jan 23 20:00:59 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_object, marshal_dump): use indetity tables for
+ arbitrary VALUE keys, because of performance of FLONUM.
+ [Bug #10761]
+
+ * marshal.c (obj_alloc_by_klass, marshal_load): ditto.
+
Fri Jan 23 17:12:33 2015 Eric Wong <e@80x24.org>
* benchmark/bm_marshal_dump_flo.rb: new benchmark for [Bug #10761]
diff --git a/hash.c b/hash.c
index bae417c642..454ded20fd 100644
--- a/hash.c
+++ b/hash.c
@@ -2549,6 +2549,18 @@ rb_ident_hash_new(void)
return hash;
}
+st_table *
+rb_init_identtable(void)
+{
+ return st_init_table(&identhash);
+}
+
+st_table *
+rb_init_identtable_with_size(st_index_t size)
+{
+ return st_init_table_with_size(&identhash, size);
+}
+
static int
any_p_i(VALUE key, VALUE value, VALUE arg)
{
diff --git a/internal.h b/internal.h
index f52a3b1c32..4c32fe26d4 100644
--- a/internal.h
+++ b/internal.h
@@ -702,6 +702,8 @@ VALUE rb_hash_has_key(VALUE hash, VALUE key);
VALUE rb_hash_set_default_proc(VALUE hash, VALUE proc);
long rb_objid_hash(st_index_t index);
VALUE rb_ident_hash_new(void);
+st_table *rb_init_identtable(void);
+st_table *rb_init_identtable_with_size(st_index_t size);
#define RHASH_TBL_RAW(h) rb_hash_tbl_raw(h)
VALUE rb_hash_keys(VALUE hash);
diff --git a/marshal.c b/marshal.c
index 43886c4daa..931c349089 100644
--- a/marshal.c
+++ b/marshal.c
@@ -748,7 +748,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
VALUE real_obj = obj;
obj = compat->dumper(real_obj);
if (!arg->compat_tbl) {
- arg->compat_tbl = st_init_numtable();
+ arg->compat_tbl = rb_init_identtable();
}
st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
if (obj != real_obj && !ivtbl) hasiv = 0;
@@ -997,7 +997,7 @@ marshal_dump(int argc, VALUE *argv)
wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
arg->dest = 0;
arg->symbols = st_init_numtable();
- arg->data = st_init_numtable();
+ arg->data = rb_init_identtable();
arg->infection = 0;
arg->compat_tbl = 0;
arg->encodings = 0;
@@ -1507,7 +1507,7 @@ obj_alloc_by_klass(VALUE klass, struct load_arg *arg, VALUE *oldclass)
if (oldclass) *oldclass = compat->oldclass;
if (!arg->compat_tbl) {
- arg->compat_tbl = st_init_numtable();
+ arg->compat_tbl = rb_init_identtable();
}
st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
return obj;
@@ -2016,7 +2016,7 @@ marshal_load(int argc, VALUE *argv)
arg->src = port;
arg->offset = 0;
arg->symbols = st_init_numtable();
- arg->data = st_init_numtable();
+ arg->data = rb_init_identtable();
arg->compat_tbl = 0;
arg->proc = 0;
arg->readable = 0;