diff --git a/ChangeLog b/ChangeLog index a43dcc3d55..e7186b1958 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Nov 25 14:34:09 2005 Yukihiro Matsumoto + + * range.c (range_max): treat end exclusion without iteration if + the end value is an integer. [ruby-talk:167433] + Fri Nov 25 12:52:57 2005 Kouhei Sutou * lib/rss/rss.rb: added backward compatibility codes. diff --git a/range.c b/range.c index f3f1f3191c..12ea69daaa 100644 --- a/range.c +++ b/range.c @@ -457,8 +457,7 @@ range_min(VALUE range) else { VALUE b = rb_ivar_get(range, id_beg); VALUE e = rb_ivar_get(range, id_end); - VALUE r = rb_funcall(b, id_cmp, 1, e); - int c = rb_cmpint(r, b, e); + int c = rb_cmpint(rb_funcall(b, id_cmp, 1, e), b, e); if (c > 0) return Qnil; return b; @@ -480,16 +479,23 @@ range_min(VALUE range) static VALUE range_max(VALUE range) { - if (rb_block_given_p() || EXCL(range)) { + VALUE e = rb_ivar_get(range, id_end); + int ip = FIXNUM_P(e) || rb_obj_is_kind_of(e, rb_cInteger); + + if (rb_block_given_p() || (EXCL(range) && !ip)) { return rb_call_super(0, 0); } else { VALUE b = rb_ivar_get(range, id_beg); - VALUE e = rb_ivar_get(range, id_end); - VALUE r = rb_funcall(b, id_cmp, 1, e); - int c = rb_cmpint(r, b, e); + int c = rb_cmpint(rb_funcall(b, id_cmp, 1, e), b, e); if (c > 0) return Qnil; + if (EXCL(range)) { + if (FIXNUM_P(e)) { + return INT2NUM(FIX2INT(e)-1); + } + return rb_funcall(e, '-', 1, INT2FIX(1)); + } return e; } } diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index f0e0da2fd6..31f7e29de4 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -31,4 +31,24 @@ class TestRange < Test::Unit::TestCase def test_duckrange assert_equal("bc", "abcd"[DuckRange.new(1,2)]) end + + def test_min + assert_equal(1, (1..2).min) + assert_equal(nil, (2..1).min) + assert_equal(1, (1...2).min) + + assert_equal(1.0, (1.0..2.0).min) + assert_equal(nil, (2.0..1.0).min) + assert_equal(1, (1.0...2.0).min) + end + + def test_max + assert_equal(2, (1..2).max) + assert_equal(nil, (2..1).max) + assert_equal(1, (1...2).max) + + assert_equal(2.0, (1.0..2.0).max) + assert_equal(nil, (2.0..1.0).max) + assert_raise(TypeError) { (1.0...2.0).max } + end end