@@ -98,7 +98,6 @@ typedef struct {
98
98
VALUE sym_set ;
99
99
100
100
VALUE ids ;
101
- VALUE dsymbol_fstr_hash ;
102
101
} rb_symbols_t ;
103
102
104
103
rb_symbols_t ruby_global_symbols = {tNEXT_ID - 1 };
@@ -154,7 +153,12 @@ sym_set_sym_get_str(VALUE sym)
154
153
static VALUE
155
154
sym_set_hash (VALUE sym )
156
155
{
157
- return (VALUE )rb_str_hash (sym_set_sym_get_str (sym ));
156
+ if (sym_set_sym_static_p (sym )) {
157
+ return (VALUE )rb_str_hash (sym_set_static_sym_untag (sym )-> str );
158
+ }
159
+ else {
160
+ return (VALUE )RSYMBOL (sym )-> hashval ;
161
+ }
158
162
}
159
163
160
164
static bool
@@ -278,10 +282,7 @@ sym_set_create(VALUE sym, void *data)
278
282
if (id < 0 ) id = ID_JUNK ;
279
283
obj -> id = id ;
280
284
281
- /* we want hashval to be in Fixnum range [ruby-core:15713] r15672 */
282
- long hashval = (long )rb_str_hash (str );
283
- obj -> hashval = RSHIFT ((long )hashval , 1 );
284
- rb_hash_aset (ruby_global_symbols .dsymbol_fstr_hash , str , Qtrue );
285
+ obj -> hashval = rb_str_hash (str );
285
286
RUBY_DTRACE_CREATE_HOOK (SYMBOL , RSTRING_PTR (obj -> fstr ));
286
287
287
288
return (VALUE )obj ;
@@ -377,10 +378,6 @@ Init_sym(void)
377
378
{
378
379
rb_symbols_t * symbols = & ruby_global_symbols ;
379
380
380
- VALUE dsym_fstrs = rb_ident_hash_new ();
381
- symbols -> dsymbol_fstr_hash = dsym_fstrs ;
382
- rb_obj_hide (dsym_fstrs );
383
-
384
381
symbols -> sym_set = rb_concurrent_set_new (& sym_set_funcs , 1024 );
385
382
symbols -> ids = rb_ary_hidden_new (0 );
386
383
@@ -395,7 +392,6 @@ rb_sym_global_symbols_mark(void)
395
392
396
393
rb_gc_mark_movable (symbols -> sym_set );
397
394
rb_gc_mark_movable (symbols -> ids );
398
- rb_gc_mark_movable (symbols -> dsymbol_fstr_hash );
399
395
}
400
396
401
397
void
@@ -405,7 +401,6 @@ rb_sym_global_symbols_update_references(void)
405
401
406
402
symbols -> sym_set = rb_gc_location (symbols -> sym_set );
407
403
symbols -> ids = rb_gc_location (symbols -> ids );
408
- symbols -> dsymbol_fstr_hash = rb_gc_location (symbols -> dsymbol_fstr_hash );
409
404
}
410
405
411
406
WARN_UNUSED_RESULT (static ID lookup_str_id (VALUE str ));
@@ -955,7 +950,6 @@ rb_gc_free_dsymbol(VALUE sym)
955
950
if (str ) {
956
951
GLOBAL_SYMBOLS_LOCKING (symbols ) {
957
952
rb_concurrent_set_delete_by_identity (symbols -> sym_set , sym );
958
- rb_hash_delete_entry (symbols -> dsymbol_fstr_hash , str );
959
953
}
960
954
961
955
RSYMBOL (sym )-> fstr = 0 ;
@@ -1013,7 +1007,6 @@ rb_sym2id(VALUE sym)
1013
1007
/* make it permanent object */
1014
1008
1015
1009
set_id_entry (symbols , rb_id_to_serial (num ), fstr , sym );
1016
- rb_hash_delete_entry (symbols -> dsymbol_fstr_hash , fstr );
1017
1010
}
1018
1011
}
1019
1012
}
@@ -1098,25 +1091,17 @@ symbols_i(VALUE *key, void *data)
1098
1091
VALUE ary = (VALUE )data ;
1099
1092
VALUE sym = (VALUE )* key ;
1100
1093
1101
- if (STATIC_SYM_P (sym )) {
1102
- rb_ary_push (ary , sym );
1103
- return ST_CONTINUE ;
1104
- }
1105
- else if (!DYNAMIC_SYM_P (sym )) {
1106
- rb_bug ("invalid symbol: %s" , RSTRING_PTR ((VALUE )key ));
1107
- }
1108
- else if (!SYMBOL_PINNED_P (sym ) && rb_objspace_garbage_object_p (sym )) {
1109
- RSYMBOL (sym )-> fstr = 0 ;
1110
- return ST_DELETE ;
1094
+ if (sym_set_sym_static_p (sym )) {
1095
+ rb_ary_push (ary , sym_set_static_sym_untag (sym )-> sym );
1111
1096
}
1112
1097
else if (rb_objspace_garbage_object_p (sym )) {
1113
1098
return ST_DELETE ;
1114
1099
}
1115
1100
else {
1116
1101
rb_ary_push (ary , sym );
1117
- return ST_CONTINUE ;
1118
1102
}
1119
1103
1104
+ return ST_CONTINUE ;
1120
1105
}
1121
1106
1122
1107
VALUE
0 commit comments