Skip to content

Commit

Permalink
[Bug #19426] Fix endless Range#step with #succ method
Browse files Browse the repository at this point in the history
  • Loading branch information
nobu committed Feb 9, 2023
1 parent 8edd350 commit da4464b
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
6 changes: 5 additions & 1 deletion range.c
Expand Up @@ -532,7 +532,11 @@ range_step(int argc, VALUE *argv, VALUE range)
rb_raise(rb_eTypeError, "can't iterate from %s",
rb_obj_classname(b));
}
range_each_func(range, step_i, (VALUE)iter);
if (!NIL_P(e))
range_each_func(range, step_i, (VALUE)iter);
else
for (;; b = rb_funcallv(b, id_succ, 0, 0))
step_i(b, (VALUE)iter);
}
}
return range;
Expand Down
40 changes: 40 additions & 0 deletions test/ruby/test_range.rb
Expand Up @@ -392,6 +392,26 @@ def test_step_ruby_core_35753
assert_equal(4, (1.0...5.6).step(1.5).to_a.size)
end

def test_step_with_succ
c = Struct.new(:i) do
def succ; self.class.new(i+1); end
def <=>(other) i <=> other.i;end
end.new(0)

result = []
(c..c.succ).step(2) do |d|
result << d.i
end
assert_equal([0], result)

result = []
(c..).step(2) do |d|
result << d.i
break if d.i >= 4
end
assert_equal([0, 2, 4], result)
end

def test_each
a = []
(0..10).each {|x| a << x }
Expand Down Expand Up @@ -456,6 +476,26 @@ def <=>(other) to_str <=> other end
assert_equal(["a", "b", "c"], a)
end

def test_each_with_succ
c = Struct.new(:i) do
def succ; self.class.new(i+1); end
def <=>(other) i <=> other.i;end
end.new(0)

result = []
(c..c.succ).each do |d|
result << d.i
end
assert_equal([0, 1], result)

result = []
(c..).each do |d|
result << d.i
break if d.i >= 4
end
assert_equal([0, 1, 2, 3, 4], result)
end

def test_begin_end
assert_equal(0, (0..1).begin)
assert_equal(1, (0..1).end)
Expand Down

0 comments on commit da4464b

Please sign in to comment.