summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-09-02 23:41:51 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-09-02 23:41:51 +0900
commit3a462fe4687fa2a52d2c9c20d10ae46901292b99 (patch)
treefae814c7d21b4350afd8c1b12e109e3964372920
parent74696ffd9625e4dca43aa010d71020f10030de24 (diff)
downloadmruby-3a462fe4687fa2a52d2c9c20d10ae46901292b99.tar.gz
mruby-3a462fe4687fa2a52d2c9c20d10ae46901292b99.zip
Integer << and >> to use Float instead of raising RangeError
-rw-r--r--src/numeric.c12
-rw-r--r--test/t/integer.rb10
2 files changed, 7 insertions, 15 deletions
diff --git a/src/numeric.c b/src/numeric.c
index 14c0b76a6..1a3c903f0 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -820,11 +820,13 @@ fix_xor(mrb_state *mrb, mrb_value x)
static mrb_value
lshift(mrb_state *mrb, mrb_int val, mrb_int width)
{
- mrb_assert(width >= 0);
+ mrb_assert(width > 0);
if (width > NUMERIC_SHIFT_WIDTH_MAX) {
- mrb_raisef(mrb, E_RANGE_ERROR, "width(%S) > (%S:MRB_INT_BIT-1)",
- mrb_fixnum_value(width),
- mrb_fixnum_value(NUMERIC_SHIFT_WIDTH_MAX));
+ mrb_float f = (mrb_float)val;
+ while (width--) {
+ f *= 2;
+ }
+ return mrb_float_value(mrb, f);
}
return mrb_fixnum_value(val << width);
}
@@ -832,7 +834,7 @@ lshift(mrb_state *mrb, mrb_int val, mrb_int width)
static mrb_value
rshift(mrb_int val, mrb_int width)
{
- mrb_assert(width >= 0);
+ mrb_assert(width > 0);
if (width >= NUMERIC_SHIFT_WIDTH_MAX) {
if (val < 0) {
return mrb_fixnum_value(-1);
diff --git a/test/t/integer.rb b/test/t/integer.rb
index 6b8cc308d..be3c13db2 100644
--- a/test/t/integer.rb
+++ b/test/t/integer.rb
@@ -147,11 +147,6 @@ assert('Integer#<<', '15.2.8.3.12') do
# Left Shift by a negative is Right Shift
assert_equal 23, 46 << -1
-
- # Raise when shift is too large
- assert_raise(RangeError) do
- 2 << 128
- end
end
assert('Integer#>>', '15.2.8.3.13') do
@@ -165,11 +160,6 @@ assert('Integer#>>', '15.2.8.3.13') do
# Don't raise on large Right Shift
assert_equal 0, 23 >> 128
-
- # Raise when shift is too large
- assert_raise(RangeError) do
- 2 >> -128
- end
end
assert('Integer#ceil', '15.2.8.3.14') do