summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-25 05:42:28 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-11-25 05:42:28 +0000
commit9c5a4caf72e0674f19e346487f6acb0dafab22c1 (patch)
treea0586302c5b27b99a5dfad0851a19877f0c92952
parent689cc98238867859689928d07f9355dd181274ff (diff)
* range.c (range_max): treat end exclusion without iteration if
the end value is an integer. [ruby-talk:167433] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--range.c18
-rw-r--r--test/ruby/test_range.rb20
3 files changed, 37 insertions, 6 deletions
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 <matz@ruby-lang.org>
+
+ * 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 <kou@cozmixng.org>
* 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