summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/hash.c2
-rw-r--r--src/numeric.c14
-rw-r--r--src/range.c2
-rw-r--r--test/t/array.rb1
-rw-r--r--test/t/float.rb66
-rw-r--r--test/t/hash.rb4
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