summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-10 08:01:49 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-07-10 08:01:49 +0000
commit3d31020aeb6e59bd3b6bd12de00c854f570d4381 (patch)
tree64bd410107d8fd3b0ef6b644f11cf9888f837f7c /numeric.c
parent91c7b7c465cd91d79a8809785490f77bbe97e631 (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.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/numeric.c b/numeric.c
index 868fb99c29..07ac50551e 100644
--- a/numeric.c
+++ b/numeric.c
@@ -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);