diff options
| -rw-r--r-- | src/hash.c | 2 | ||||
| -rw-r--r-- | src/numeric.c | 14 | ||||
| -rw-r--r-- | src/range.c | 2 | ||||
| -rw-r--r-- | test/t/array.rb | 1 | ||||
| -rw-r--r-- | test/t/float.rb | 66 | ||||
| -rw-r--r-- | test/t/hash.rb | 4 |
6 files changed, 69 insertions, 20 deletions
diff --git a/src/hash.c b/src/hash.c index c30a8dec4..3b5d17761 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1506,7 +1506,7 @@ mrb_hash_shift(mrb_state *mrb, mrb_value hash) hash_modify(mrb, hash); if (h_size(h) == 0) { - return hash_default(mrb, hash, mrb_nil_value()); + return mrb_nil_value(); } else { mrb_value del_key, del_val; diff --git a/src/numeric.c b/src/numeric.c index e80d5c136..c536f0614 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -237,17 +237,15 @@ flo_idiv(mrb_state *mrb, mrb_value xv) mrb_float mrb_num_div_flo(mrb_state *mrb, mrb_float x, mrb_float y) { - mrb_float f; - - if (y == 0) { - if (x > 0) f = INFINITY; - else if (x < 0) f = -INFINITY; - else /* if (x == 0) */ f = NAN; + if (y != 0.0) { + return x / y; + } + else if (x == 0.0) { + return NAN; } else { - f = x / y; + return x * (signbit(y) ? -1.0 : 1.0) * INFINITY; } - return f; } static mrb_value diff --git a/src/range.c b/src/range.c index a109257c0..cb60bb63c 100644 --- a/src/range.c +++ b/src/range.c @@ -409,7 +409,7 @@ mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, if (!mrb_range_p(range)) return MRB_RANGE_TYPE_MISMATCH; r = mrb_range_ptr(mrb, range); - beg = mrb_int(mrb, RANGE_BEG(r)); + beg = mrb_nil_p(RANGE_BEG(r)) ? 0 : mrb_int(mrb, RANGE_BEG(r)); end = mrb_nil_p(RANGE_END(r)) ? -1 : mrb_int(mrb, RANGE_END(r)); excl = mrb_nil_p(RANGE_END(r)) ? 0 : RANGE_EXCL(r); diff --git a/test/t/array.rb b/test/t/array.rb index 1e224a034..7410233d3 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -58,6 +58,7 @@ assert('Array#[]', '15.2.12.5.4') do assert_equal(["b", "c"], a[1,2]) assert_equal(["b", "c", "d"], a[1..-2]) assert_equal(["b", "c", "d", "e"], a[1..]) + assert_equal(["a", "b", "c"], a[..2]) skip unless Object.const_defined?(:Float) assert_equal("b", a[1.1]) end diff --git a/test/t/float.rb b/test/t/float.rb index 3a0cf27bc..f6f6d01dd 100644 --- a/test/t/float.rb +++ b/test/t/float.rb @@ -35,16 +35,66 @@ assert('Float#*', '15.2.9.3.3') do end assert('Float#/', '15.2.9.3.4') do - a = 3.123456789 / 3.123456789 - b = 3.123456789 / 1 - - assert_float(1.0 , a) - assert_float(3.123456789, b) + assert_float(1.0, 3.123456789 / 3.123456789) + assert_float(3.123456789, 3.123456789 / 1) + assert_float(2.875, -5.75 / -2.0) + assert_float(-2.875, 5.75 / -2) + assert_float(-2.875, -5.75 / 2.0) + assert_float(Float::NAN, 0.0 / 0.0) + assert_float(Float::NAN, -0.0 / -0.0) + assert_float(Float::NAN, -0.0 / 0.0) + assert_float(Float::NAN, Float::NAN / Float::NAN) + assert_float(Float::NAN, Float::NAN / 0.0) + assert_float(Float::NAN, Float::NAN / -0.0) + assert_float(Float::NAN, Float::NAN / 2.0) + assert_float(Float::NAN, Float::NAN / -2.0) + assert_float(Float::NAN, 0.0 / Float::NAN) + assert_float(Float::NAN, -0.0 / Float::NAN) + assert_float(Float::NAN, 2.0 / Float::NAN) + assert_float(Float::NAN, -2.0 / Float::NAN) + assert_float(Float::NAN, Float::INFINITY / Float::INFINITY) + assert_float(Float::NAN, -Float::INFINITY / Float::INFINITY) + assert_float(Float::NAN, Float::INFINITY / -Float::INFINITY) + assert_float(Float::NAN, -Float::INFINITY / -Float::INFINITY) + assert_float(Float::INFINITY, 1.0 / 0.0) + assert_float(Float::INFINITY, -1.0 / -0.0) + assert_float(-Float::INFINITY, 1.0 / -0.0) + assert_float(-Float::INFINITY, -1.0 / 0.0) + assert_float(0.0, 1.0 / Float::INFINITY) + assert_float(0.0, -1.0 / -Float::INFINITY) + assert_float(-0.0, -1.0 / Float::INFINITY) + assert_float(-0.0, 1.0 / -Float::INFINITY) end assert('Float#quo') do - a = 3.123456789.quo(3.123456789) - - assert_float(1.0 , a) + assert_float(1.0, 3.123456789.quo(3.123456789)) + assert_float(3.123456789, 3.123456789.quo(1)) + assert_float(2.875, -5.75.quo(-2.0)) + assert_float(-2.875, 5.75.quo(-2)) + assert_float(-2.875, -5.75.quo(2.0)) + assert_float(Float::NAN, 0.0.quo(0.0)) + assert_float(Float::NAN, -0.0.quo(-0.0)) + assert_float(Float::NAN, -0.0.quo(0.0)) + assert_float(Float::NAN, Float::NAN.quo(Float::NAN)) + assert_float(Float::NAN, Float::NAN.quo(0.0)) + assert_float(Float::NAN, Float::NAN.quo(-0.0)) + assert_float(Float::NAN, Float::NAN.quo(2.0)) + assert_float(Float::NAN, Float::NAN.quo(-2.0)) + assert_float(Float::NAN, 0.0.quo(Float::NAN)) + assert_float(Float::NAN, -0.0.quo(Float::NAN)) + assert_float(Float::NAN, 2.0.quo(Float::NAN)) + assert_float(Float::NAN, -2.0.quo(Float::NAN)) + assert_float(Float::NAN, Float::INFINITY.quo(Float::INFINITY)) + assert_float(Float::NAN, -Float::INFINITY.quo(Float::INFINITY)) + assert_float(Float::NAN, Float::INFINITY.quo(-Float::INFINITY)) + assert_float(Float::NAN, -Float::INFINITY.quo(-Float::INFINITY)) + assert_float(Float::INFINITY, 1.0.quo(0.0)) + assert_float(Float::INFINITY, -1.0.quo(-0.0)) + assert_float(-Float::INFINITY, 1.0.quo(-0.0)) + assert_float(-Float::INFINITY, -1.0.quo(0.0)) + assert_float(0.0, 1.0.quo(Float::INFINITY)) + assert_float(0.0, -1.0.quo(-Float::INFINITY)) + assert_float(-0.0, -1.0.quo(Float::INFINITY)) + assert_float(-0.0, 1.0.quo(-Float::INFINITY)) end assert('Float#%', '15.2.9.3.5') do diff --git a/test/t/hash.rb b/test/t/hash.rb index a5e51d83b..9bc2668ae 100644 --- a/test/t/hash.rb +++ b/test/t/hash.rb @@ -775,7 +775,7 @@ assert('Hash#shift', '15.2.13.4.24') do assert_equal(0, h.size) h.default = -456 - assert_equal(-456, h.shift) + assert_equal(nil, h.shift) assert_equal(0, h.size) h.freeze @@ -783,8 +783,8 @@ assert('Hash#shift', '15.2.13.4.24') do end h = Hash.new{|h, k| [h, k]} - assert_operator(h.shift, :eql?, [h, nil]) assert_equal(0, h.size) + assert_equal(nil, h.shift) end # Not ISO specified |
