зеркало из https://github.com/github/ruby.git
zlib: GzipReader#rewind preserves ZSTREAM_FLAG_GZFILE
* ext/zlib/zlib.c (gzfile_reset): preserve ZSTREAM_FLAG_GZFILE [Bug #10101] * test/zlib/test_zlib.rb (test_rewind): test each_byte We must preserve the ZSTREAM_FLAG_GZFILE flag to prevent zstream_detach_buffer from: a) returning Qnil and breaking out of the `each_byte' loop b) yielding a large string to each_byte Note: the test case in bug report takes a long time. I found this bug because I noticed the massive time descrepancy between `each_byte' and `readbyte' loop before this patch. With this patch, `each_byte' and `readbyte' both take very long. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47327 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
b6c425aadd
Коммит
3cee6a22c0
|
@ -1,3 +1,10 @@
|
|||
Sun Aug 31 08:46:44 2014 Eric Wong <e@80x24.org>
|
||||
|
||||
* ext/zlib/zlib.c (gzfile_reset): preserve ZSTREAM_FLAG_GZFILE
|
||||
[Bug #10101]
|
||||
|
||||
* test/zlib/test_zlib.rb (test_rewind): test each_byte
|
||||
|
||||
Sat Aug 30 19:22:47 2014 Eric Wong <e@80x24.org>
|
||||
|
||||
* symbol.c (rb_sym2id): do not return garbage object
|
||||
|
|
|
@ -2293,6 +2293,7 @@ static void
|
|||
gzfile_reset(struct gzfile *gz)
|
||||
{
|
||||
zstream_reset(&gz->z);
|
||||
gz->z.flags |= ZSTREAM_FLAG_GZFILE;
|
||||
gz->crc = crc32(0, Z_NULL, 0);
|
||||
gz->lineno = 0;
|
||||
gz->ungetc = 0;
|
||||
|
|
|
@ -695,6 +695,11 @@ if defined? Zlib
|
|||
assert_equal("foo", f.read)
|
||||
f.rewind
|
||||
assert_equal("foo", f.read)
|
||||
|
||||
f.rewind
|
||||
bytes = []
|
||||
f.each_byte { |b| bytes << b }
|
||||
assert_equal "foo".bytes.to_a, bytes, '[Bug #10101]'
|
||||
end
|
||||
open(t.path, "rb") do |f|
|
||||
gz = Zlib::GzipReader.new(f)
|
||||
|
|
Загрузка…
Ссылка в новой задаче