symbol.c: fix dynamic symbol hash value
* hash.c (any_hash), symbol.c (dsymbol_alloc): fix dynamic symbol hash value by restricting in Fixnum range, that is `long`. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51432 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
184cf1f710
commit
ede1c141c6
@ -1,3 +1,8 @@
|
|||||||
|
Wed Jul 29 21:38:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* hash.c (any_hash), symbol.c (dsymbol_alloc): fix dynamic symbol
|
||||||
|
hash value by restricting in Fixnum range, that is `long`.
|
||||||
|
|
||||||
Wed Jul 29 17:25:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Wed Jul 29 17:25:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* hash.c (rb_obj_hash): move in order to share with rb_any_hash.
|
* hash.c (rb_obj_hash): move in order to share with rb_any_hash.
|
||||||
|
2
hash.c
2
hash.c
@ -150,7 +150,7 @@ any_hash(VALUE a, st_index_t (*other_func)(VALUE))
|
|||||||
hnum = rb_str_hash(a);
|
hnum = rb_str_hash(a);
|
||||||
}
|
}
|
||||||
else if (BUILTIN_TYPE(a) == T_SYMBOL) {
|
else if (BUILTIN_TYPE(a) == T_SYMBOL) {
|
||||||
return RSYMBOL(a)->hashval;
|
hnum = RSYMBOL(a)->hashval;
|
||||||
}
|
}
|
||||||
else if (BUILTIN_TYPE(a) == T_FLOAT) {
|
else if (BUILTIN_TYPE(a) == T_FLOAT) {
|
||||||
flt:
|
flt:
|
||||||
|
7
symbol.c
7
symbol.c
@ -505,7 +505,7 @@ static VALUE
|
|||||||
dsymbol_alloc(const VALUE klass, const VALUE str, rb_encoding * const enc, const ID type)
|
dsymbol_alloc(const VALUE klass, const VALUE str, rb_encoding * const enc, const ID type)
|
||||||
{
|
{
|
||||||
const VALUE dsym = rb_newobj_of(klass, T_SYMBOL | FL_WB_PROTECTED);
|
const VALUE dsym = rb_newobj_of(klass, T_SYMBOL | FL_WB_PROTECTED);
|
||||||
st_index_t hashval;
|
long hashval;
|
||||||
|
|
||||||
rb_enc_associate(dsym, enc);
|
rb_enc_associate(dsym, enc);
|
||||||
OBJ_FREEZE(dsym);
|
OBJ_FREEZE(dsym);
|
||||||
@ -513,9 +513,8 @@ dsymbol_alloc(const VALUE klass, const VALUE str, rb_encoding * const enc, const
|
|||||||
RSYMBOL(dsym)->id = type;
|
RSYMBOL(dsym)->id = type;
|
||||||
|
|
||||||
/* we want hashval to be in Fixnum range [ruby-core:15713] r15672 */
|
/* we want hashval to be in Fixnum range [ruby-core:15713] r15672 */
|
||||||
hashval = rb_str_hash(str);
|
hashval = (long)rb_str_hash(str);
|
||||||
hashval <<= 1;
|
RSYMBOL(dsym)->hashval = RSHIFT((long)hashval, 1);
|
||||||
RSYMBOL(dsym)->hashval = (st_index_t)RSHIFT(hashval, 1);
|
|
||||||
|
|
||||||
register_sym(str, dsym);
|
register_sym(str, dsym);
|
||||||
rb_hash_aset(global_symbols.dsymbol_fstr_hash, str, Qtrue);
|
rb_hash_aset(global_symbols.dsymbol_fstr_hash, str, Qtrue);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user