[rubygems/rubygems] Optimize Gem::Package::TarReader#each

https://github.com/rubygems/rubygems/commit/1de8f39ac4
This commit is contained in:
Jean Boussier 2019-10-01 13:16:32 +02:00 коммит произвёл Nobuyoshi Nakada
Родитель 495ebd6e95
Коммит 717b72a8af
1 изменённых файлов: 15 добавлений и 9 удалений

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

@ -55,6 +55,8 @@ class Gem::Package::TarReader
def each
return enum_for __method__ unless block_given?
use_seek = @io.respond_to?(:seek)
until @io.eof? do
header = Gem::Package::TarHeader.from @io
return if header.empty?
@ -67,18 +69,22 @@ class Gem::Package::TarReader
skip = (512 - (size % 512)) % 512
pending = size - entry.bytes_read
begin
# avoid reading...
@io.seek pending, IO::SEEK_CUR
pending = 0
rescue Errno::EINVAL, NameError
while pending > 0 do
bytes_read = @io.read([pending, 4096].min).size
raise UnexpectedEOF if @io.eof?
pending -= bytes_read
if use_seek
begin
# avoid reading if the @io supports seeking
@io.seek pending, IO::SEEK_CUR
pending = 0
rescue Errno::EINVAL
end
end
# if seeking isn't supported or failed
while pending > 0 do
bytes_read = @io.read([pending, 4096].min).size
raise UnexpectedEOF if @io.eof?
pending -= bytes_read
end
@io.read skip # discard trailing zeros
# make sure nobody can use #read, #getc or #rewind anymore