io.c: truncate before appending

* io.c (read_all): truncate the buffer before appending read data,
  instead of truncating before reading.
  [ruby-core:55951] [Bug #8625]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46372 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-06-07 03:51:57 +00:00
Родитель 635178762d
Коммит 0e7cd6417a
3 изменённых файлов: 23 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Sat Jun 7 12:51:51 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* io.c (read_all): truncate the buffer before appending read data,
instead of truncating before reading.
[ruby-core:55951] [Bug #8625]
Sat Jun 7 12:28:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/digest/digest.c (rb_digest_instance_equal): no need to call

4
io.c
Просмотреть файл

@ -2398,23 +2398,27 @@ read_all(rb_io_t *fptr, long siz, VALUE str)
int cr;
if (NEED_READCONV(fptr)) {
int first = !NIL_P(str);
SET_BINARY_MODE(fptr);
io_setstrbuf(&str,0);
make_readconv(fptr, 0);
while (1) {
VALUE v;
if (fptr->cbuf.len) {
if (first) rb_str_set_len(str, first = 0);
io_shift_cbuf(fptr, fptr->cbuf.len, &str);
}
v = fill_cbuf(fptr, 0);
if (v != MORE_CHAR_SUSPENDED && v != MORE_CHAR_FINISHED) {
if (fptr->cbuf.len) {
if (first) rb_str_set_len(str, first = 0);
io_shift_cbuf(fptr, fptr->cbuf.len, &str);
}
rb_exc_raise(v);
}
if (v == MORE_CHAR_FINISHED) {
clear_readconv(fptr);
if (first) rb_str_set_len(str, first = 0);
return io_enc_str(str, fptr);
}
}

Просмотреть файл

@ -13,4 +13,17 @@ class TestPipe < Test::Unit::TestCase
r.close
end
end
class WithConversion < self
def open_file(content)
r, w = IO.pipe
w << content
w.close
r.set_encoding("us-ascii:utf-8")
begin
yield r
ensure
r.close
end
end
end
end