[rubygems/rubygems] Optimize Gem::Package::TarReader#each
https://github.com/rubygems/rubygems/commit/1de8f39ac4
This commit is contained in:
parent
495ebd6e95
commit
717b72a8af
@ -55,6 +55,8 @@ class Gem::Package::TarReader
|
|||||||
def each
|
def each
|
||||||
return enum_for __method__ unless block_given?
|
return enum_for __method__ unless block_given?
|
||||||
|
|
||||||
|
use_seek = @io.respond_to?(:seek)
|
||||||
|
|
||||||
until @io.eof? do
|
until @io.eof? do
|
||||||
header = Gem::Package::TarHeader.from @io
|
header = Gem::Package::TarHeader.from @io
|
||||||
return if header.empty?
|
return if header.empty?
|
||||||
@ -67,17 +69,21 @@ class Gem::Package::TarReader
|
|||||||
skip = (512 - (size % 512)) % 512
|
skip = (512 - (size % 512)) % 512
|
||||||
pending = size - entry.bytes_read
|
pending = size - entry.bytes_read
|
||||||
|
|
||||||
|
if use_seek
|
||||||
begin
|
begin
|
||||||
# avoid reading...
|
# avoid reading if the @io supports seeking
|
||||||
@io.seek pending, IO::SEEK_CUR
|
@io.seek pending, IO::SEEK_CUR
|
||||||
pending = 0
|
pending = 0
|
||||||
rescue Errno::EINVAL, NameError
|
rescue Errno::EINVAL
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# if seeking isn't supported or failed
|
||||||
while pending > 0 do
|
while pending > 0 do
|
||||||
bytes_read = @io.read([pending, 4096].min).size
|
bytes_read = @io.read([pending, 4096].min).size
|
||||||
raise UnexpectedEOF if @io.eof?
|
raise UnexpectedEOF if @io.eof?
|
||||||
pending -= bytes_read
|
pending -= bytes_read
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
@io.read skip # discard trailing zeros
|
@io.read skip # discard trailing zeros
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user