1
0
Fork 0
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:
nobu 2015-01-23 11:01:02 +00:00
parent bb7830c7d4
commit e567f351c2
4 changed files with 26 additions and 4 deletions

View file

@ -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
View file

@ -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)
{ {

View file

@ -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);

View file

@ -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;