diff --git a/ChangeLog b/ChangeLog index 46a3ca20b6..df14cb2377 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Mar 3 16:14:24 2008 Nobuyoshi Nakada + + * hash.c (rb_any_hash): shrinks all results in Fixnum range. + [ruby-core:15713] + Sat Mar 1 02:35:08 2008 Nobuyoshi Nakada * bignum.c (big2str_find_n1): check integer overflow. diff --git a/hash.c b/hash.c index 0878875ed3..290a253669 100644 --- a/hash.c +++ b/hash.c @@ -89,15 +89,16 @@ rb_any_hash(a) VALUE a; { VALUE hval; + int hnum; switch (TYPE(a)) { case T_FIXNUM: case T_SYMBOL: - return (int)a; + hnum = (int)a; break; case T_STRING: - return rb_str_hash(a); + hnum = rb_str_hash(a); break; default: @@ -105,8 +106,10 @@ rb_any_hash(a) if (!FIXNUM_P(hval)) { hval = rb_funcall(hval, '%', 1, INT2FIX(536870923)); } - return (int)FIX2LONG(hval); + hnum = (int)FIX2LONG(hval); } + hnum <<= 1; + return RSHIFT(hnum, 1); } static struct st_hash_type objhash = { diff --git a/version.h b/version.h index 8e20e16819..a7cabf92f3 100644 --- a/version.h +++ b/version.h @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.8.6" -#define RUBY_RELEASE_DATE "2008-03-01" +#define RUBY_RELEASE_DATE "2008-03-03" #define RUBY_VERSION_CODE 186 -#define RUBY_RELEASE_CODE 20080301 +#define RUBY_RELEASE_CODE 20080303 #define RUBY_PATCHLEVEL 5000 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 6 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 3 -#define RUBY_RELEASE_DAY 1 +#define RUBY_RELEASE_DAY 3 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[];