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…
	
	Add table
		Add a link
		
	
		Reference in a new issue