# File lib/rubygems/package/tar_reader.rb, line 36
  def each
    loop do
      return if @io.eof?

      header = Gem::Package::TarHeader.from @io
      return if header.empty?

      entry = Gem::Package::TarReader::Entry.new header, @io
      size = entry.header.size

      yield entry

      skip = (512 - (size % 512)) % 512

      if @io.respond_to? :seek then
        # avoid reading...
        @io.seek(size - entry.bytes_read, IO::SEEK_CUR)
      else
        pending = size - entry.bytes_read

        while pending > 0 do
          bread = @io.read([pending, 4096].min).size
          raise UnexpectedEOF if @io.eof?
          pending -= bread
        end
      end

      @io.read skip # discard trailing zeros

      # make sure nobody can use #read, #getc or #rewind anymore
      entry.close
    end
  end