diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-07-10 08:01:49 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2000-07-10 08:01:49 +0000 |
commit | 3d31020aeb6e59bd3b6bd12de00c854f570d4381 (patch) | |
tree | 64bd410107d8fd3b0ef6b644f11cf9888f837f7c /numeric.c | |
parent | 91c7b7c465cd91d79a8809785490f77bbe97e631 (diff) |
matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_4@823 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'numeric.c')
-rw-r--r-- | numeric.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -1148,11 +1148,10 @@ static VALUE fix_lshift(x, y) VALUE x, y; { - long val; - int width; + long val, width; val = NUM2LONG(x); - width = NUM2INT(y); + width = NUM2LONG(y); if (width > (sizeof(VALUE)*CHAR_BIT-1) || ((unsigned long)val)>>(sizeof(VALUE)*CHAR_BIT-1-width) > 0) { return rb_big_lshift(rb_int2big(val), y); @@ -1170,6 +1169,11 @@ fix_rshift(x, y) i = NUM2LONG(y); if (i < 0) return fix_lshift(x, INT2FIX(-i)); + if (i == 0) return x; + if (i >= sizeof(long)*CHAR_BIT-1) { + if (i < 0) return INT2FIX(-1); + return INT2FIX(0); + } val = RSHIFT(FIX2LONG(x), i); return INT2FIX(val); } @@ -1179,7 +1183,7 @@ fix_aref(fix, idx) VALUE fix, idx; { unsigned long val = FIX2LONG(fix); - int i = FIX2LONG(idx); + int i = NUM2INT(idx); if (i < 0 || sizeof(VALUE)*CHAR_BIT-1 < i) return INT2FIX(0); |