1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Do not chomp trailing line separator IO#each with nil separator and chomp

nil separator means no sepator, so chomp should not remove a line
separator.

Partially Fixes [Bug #18770]
This commit is contained in:
Jeremy Evans 2022-05-26 12:22:42 -07:00
parent 672925bf14
commit 04f86ad0b5
Notes: git 2022-07-22 00:14:02 +09:00
2 changed files with 15 additions and 2 deletions

1
io.c
View file

@ -3875,7 +3875,6 @@ rb_io_getline_0(VALUE rs, long limit, int chomp, rb_io_t *fptr)
if (NIL_P(rs) && limit < 0) {
str = read_all(fptr, 0, Qnil);
if (RSTRING_LEN(str) == 0) return Qnil;
if (chomp) rb_str_chomp_string(str, rb_default_rs);
}
else if (limit == 0) {
return rb_enc_str_new(0, 0, io_read_encoding(fptr));

View file

@ -312,7 +312,7 @@ class TestIO < Test::Unit::TestCase
w.print "a\n\nb\n\n"
w.close
end, proc do |r|
assert_equal "a\n\nb\n", r.gets(nil, chomp: true)
assert_equal("a\n\nb\n\n", r.gets(nil, chomp: true), "[Bug #18770]")
assert_nil r.gets("")
r.close
end)
@ -1894,6 +1894,20 @@ class TestIO < Test::Unit::TestCase
assert_equal("baz\n", e.next)
assert_raise(StopIteration) { e.next }
end)
pipe(proc do |w|
w.write "foo\n"
w.close
end, proc do |r|
assert_equal(["foo\n"], r.each_line(nil, chomp: true).to_a, "[Bug #18770]")
end)
pipe(proc do |w|
w.write "foo\n"
w.close
end, proc do |r|
assert_equal(["fo", "o\n"], r.each_line(nil, 2, chomp: true).to_a, "[Bug #18770]")
end)
end
def test_each_byte2