summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--range.c13
-rw-r--r--test/ruby/test_enum.rb13
-rw-r--r--test/ruby/test_range.rb2
3 files changed, 26 insertions, 2 deletions
diff --git a/range.c b/range.c
index ba96e3de3f..dbb3dcb5ad 100644
--- a/range.c
+++ b/range.c
@@ -987,11 +987,22 @@ rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp)
excl = EXCL(range);
}
else {
+ VALUE x;
+#if 0
+ /* TODO: fix spec/mspec/lib/mspec/mocks/mock.rb:Mock.verify_call */
+ b = rb_check_funcall(range, id_beg, 0, 0);
+ if (b == Qundef) return (int)Qfalse;
+ e = rb_check_funcall(range, id_end, 0, 0);
+ if (e == Qundef) return (int)Qfalse;
+#else
if (!rb_respond_to(range, id_beg)) return (int)Qfalse;
if (!rb_respond_to(range, id_end)) return (int)Qfalse;
b = rb_funcall(range, id_beg, 0);
e = rb_funcall(range, id_end, 0);
- excl = RTEST(rb_funcall(range, rb_intern("exclude_end?"), 0));
+#endif
+ x = rb_check_funcall(range, rb_intern("exclude_end?"), 0, 0);
+ if (x == Qundef) return (int)Qfalse;
+ excl = RTEST(x);
}
*begp = b;
*endp = e;
diff --git a/test/ruby/test_enum.rb b/test/ruby/test_enum.rb
index fcf601c183..ae119c73bf 100644
--- a/test/ruby/test_enum.rb
+++ b/test/ruby/test_enum.rb
@@ -966,6 +966,19 @@ class TestEnumerable < Test::Unit::TestCase
assert_int_equal(5, (2..0).sum(5))
assert_int_equal(2, (2..2).sum)
assert_int_equal(42, (2...2).sum(42))
+
+ not_a_range = Class.new do
+ include Enumerable # Defines the `#sum` method
+ def each
+ yield 2
+ yield 4
+ yield 6
+ end
+
+ def begin; end
+ def end; end
+ end
+ assert_equal(12, not_a_range.new.sum)
end
def test_uniq
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index 66c4682d8d..5823810f33 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -387,7 +387,7 @@ class TestRange < Test::Unit::TestCase
assert_raise(TypeError) { [][o] }
class << o; attr_accessor :end end
o.end = 0
- assert_raise(NoMethodError) { [][o] }
+ assert_raise(TypeError) { [][o] }
def o.exclude_end=(v) @exclude_end = v end
def o.exclude_end?() @exclude_end end
o.exclude_end = false