diff --git a/ChangeLog b/ChangeLog index 0f6ed4fb9e..ca47a0786e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sat Jan 23 20:10:29 2016 Shugo Maeda + + * range.c (range_eqq): revert r11113 because rb_call_super() is + called in range_include() and thus r11113 doesn't work when the + receiver Range object consists of non linear objects such as Date + objects. + [ruby-core:72908] [Bug #12003] + Sat Jan 23 18:37:37 2016 Martin Duerst * ChangeLog: Fixing wrong time on previous commit, and adding diff --git a/range.c b/range.c index 95b1b92053..ab3f1af9e2 100644 --- a/range.c +++ b/range.c @@ -23,7 +23,6 @@ static ID id_beg, id_end, id_excl, id_integer_p, id_div; #define id_succ idSucc static VALUE r_cover_p(VALUE, VALUE, VALUE, VALUE); -static VALUE range_include(VALUE range, VALUE val); #define RANGE_BEG(r) (RSTRUCT(r)->as.ary[0]) #define RANGE_END(r) (RSTRUCT(r)->as.ary[1]) @@ -1135,12 +1134,7 @@ range_inspect(VALUE range) static VALUE range_eqq(VALUE range, VALUE val) { - ID pred; - CONST_ID(pred, "include?"); - if (rb_method_basic_definition_p(RBASIC_CLASS(range), pred)) { - return range_include(range, val); - } - return rb_funcall(range, pred, 1, val); + return rb_funcall(range, rb_intern("include?"), 1, val); } diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb index 046f69e9de..2fc2a2b1d3 100644 --- a/test/ruby/test_range.rb +++ b/test/ruby/test_range.rb @@ -314,6 +314,30 @@ class TestRange < Test::Unit::TestCase } end + def test_eqq_non_linear + bug12003 = '[ruby-core:72908] [Bug #12003]' + c = Class.new { + attr_reader :value + + def initialize(value) + @value = value + end + + def succ + self.class.new(@value.succ) + end + + def ==(other) + @value == other.value + end + + def <=>(other) + @value <=> other.value + end + } + assert_operator(c.new(0)..c.new(10), :===, c.new(5), bug12003) + end + def test_include assert_include("a".."z", "c") assert_not_include("a".."z", "5")