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>
|
||||
|
||||
* 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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue