mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
bb7830c7d4
commit
e567f351c2
4 changed files with 26 additions and 4 deletions
|
@ -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>
|
Fri Jan 23 17:12:33 2015 Eric Wong <e@80x24.org>
|
||||||
|
|
||||||
* benchmark/bm_marshal_dump_flo.rb: new benchmark for [Bug #10761]
|
* benchmark/bm_marshal_dump_flo.rb: new benchmark for [Bug #10761]
|
||||||
|
|
12
hash.c
12
hash.c
|
@ -2549,6 +2549,18 @@ rb_ident_hash_new(void)
|
||||||
return hash;
|
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
|
static int
|
||||||
any_p_i(VALUE key, VALUE value, VALUE arg)
|
any_p_i(VALUE key, VALUE value, VALUE arg)
|
||||||
{
|
{
|
||||||
|
|
|
@ -702,6 +702,8 @@ VALUE rb_hash_has_key(VALUE hash, VALUE key);
|
||||||
VALUE rb_hash_set_default_proc(VALUE hash, VALUE proc);
|
VALUE rb_hash_set_default_proc(VALUE hash, VALUE proc);
|
||||||
long rb_objid_hash(st_index_t index);
|
long rb_objid_hash(st_index_t index);
|
||||||
VALUE rb_ident_hash_new(void);
|
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)
|
#define RHASH_TBL_RAW(h) rb_hash_tbl_raw(h)
|
||||||
VALUE rb_hash_keys(VALUE hash);
|
VALUE rb_hash_keys(VALUE hash);
|
||||||
|
|
|
@ -748,7 +748,7 @@ w_object(VALUE obj, struct dump_arg *arg, int limit)
|
||||||
VALUE real_obj = obj;
|
VALUE real_obj = obj;
|
||||||
obj = compat->dumper(real_obj);
|
obj = compat->dumper(real_obj);
|
||||||
if (!arg->compat_tbl) {
|
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);
|
st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
|
||||||
if (obj != real_obj && !ivtbl) hasiv = 0;
|
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);
|
wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg);
|
||||||
arg->dest = 0;
|
arg->dest = 0;
|
||||||
arg->symbols = st_init_numtable();
|
arg->symbols = st_init_numtable();
|
||||||
arg->data = st_init_numtable();
|
arg->data = rb_init_identtable();
|
||||||
arg->infection = 0;
|
arg->infection = 0;
|
||||||
arg->compat_tbl = 0;
|
arg->compat_tbl = 0;
|
||||||
arg->encodings = 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 (oldclass) *oldclass = compat->oldclass;
|
||||||
|
|
||||||
if (!arg->compat_tbl) {
|
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);
|
st_insert(arg->compat_tbl, (st_data_t)obj, (st_data_t)real_obj);
|
||||||
return obj;
|
return obj;
|
||||||
|
@ -2016,7 +2016,7 @@ marshal_load(int argc, VALUE *argv)
|
||||||
arg->src = port;
|
arg->src = port;
|
||||||
arg->offset = 0;
|
arg->offset = 0;
|
||||||
arg->symbols = st_init_numtable();
|
arg->symbols = st_init_numtable();
|
||||||
arg->data = st_init_numtable();
|
arg->data = rb_init_identtable();
|
||||||
arg->compat_tbl = 0;
|
arg->compat_tbl = 0;
|
||||||
arg->proc = 0;
|
arg->proc = 0;
|
||||||
arg->readable = 0;
|
arg->readable = 0;
|
||||||
|
|
Loading…
Reference in a new issue