Revert "Speed up Deflater sysread speed when number_of_bytes is small and @output_buffer is large"
This reverts commit a800987a52.
			
			
This commit is contained in:
		
							parent
							
								
									8959d447a2
								
							
						
					
					
						commit
						a989e8c145
					
				|  | @ -4,42 +4,26 @@ module Zip | ||||||
|       super |       super | ||||||
|       @zlib_inflater           = ::Zlib::Inflate.new(-Zlib::MAX_WBITS) |       @zlib_inflater           = ::Zlib::Inflate.new(-Zlib::MAX_WBITS) | ||||||
|       @output_buffer           = '' |       @output_buffer           = '' | ||||||
|       @output_buffer_pos       = 0 |  | ||||||
|       @has_returned_empty_string = false |       @has_returned_empty_string = false | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def sysread(number_of_bytes = nil, buf = '') |     def sysread(number_of_bytes = nil, buf = '') | ||||||
|       buf ||= '' |  | ||||||
|       buf.clear |  | ||||||
|       readEverything = number_of_bytes.nil? |       readEverything = number_of_bytes.nil? | ||||||
|       if readEverything |       while readEverything || @output_buffer.bytesize < number_of_bytes | ||||||
|         buf << @output_buffer[@output_buffer_pos...@output_buffer.bytesize] |  | ||||||
| 
 |  | ||||||
|         move_output_buffer_pos(buf.bytesize) |  | ||||||
|       else |  | ||||||
|         buf << @output_buffer[@output_buffer_pos, number_of_bytes] |  | ||||||
| 
 |  | ||||||
|         move_output_buffer_pos(buf.bytesize) |  | ||||||
| 
 |  | ||||||
|         if buf.bytesize == number_of_bytes |  | ||||||
|           return buf |  | ||||||
|         end |  | ||||||
|       end |  | ||||||
|       while readEverything || buf.bytesize + @output_buffer.bytesize < number_of_bytes |  | ||||||
|         break if internal_input_finished? |         break if internal_input_finished? | ||||||
|         @output_buffer << internal_produce_input |         @output_buffer << internal_produce_input(buf) | ||||||
|       end |       end | ||||||
|       return value_when_finished(number_of_bytes, buf) if @output_buffer.bytesize == 0 && input_finished? |       return value_when_finished if @output_buffer.bytesize == 0 && input_finished? | ||||||
|       end_index = (number_of_bytes.nil? ? @output_buffer.bytesize : number_of_bytes) - buf.bytesize |       end_index = number_of_bytes.nil? ? @output_buffer.bytesize : number_of_bytes | ||||||
|       data = @output_buffer[0...end_index] |       @output_buffer.slice!(0...end_index) | ||||||
| 
 |  | ||||||
|       move_output_buffer_pos(data.bytesize) |  | ||||||
| 
 |  | ||||||
|       buf << data |  | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def produce_input |     def produce_input | ||||||
|       sysread() |       if (@output_buffer.empty?) | ||||||
|  |         internal_produce_input | ||||||
|  |       else | ||||||
|  |         @output_buffer.slice!(0...(@output_buffer.length)) | ||||||
|  |       end | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     # to be used with produce_input, not read (as read may still have more data cached) |     # to be used with produce_input, not read (as read may still have more data cached) | ||||||
|  | @ -53,16 +37,7 @@ module Zip | ||||||
| 
 | 
 | ||||||
|     private |     private | ||||||
| 
 | 
 | ||||||
|     def move_output_buffer_pos(inc) |     def internal_produce_input(buf = '') | ||||||
|       @output_buffer_pos += inc |  | ||||||
|       if @output_buffer_pos == @output_buffer.bytesize |  | ||||||
|         @output_buffer.clear |  | ||||||
|         @output_buffer_pos = 0 |  | ||||||
|       end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     def internal_produce_input |  | ||||||
|       buf = '' |  | ||||||
|       retried = 0 |       retried = 0 | ||||||
|       begin |       begin | ||||||
|         @zlib_inflater.inflate(@input_stream.read(Decompressor::CHUNK_SIZE, buf)) |         @zlib_inflater.inflate(@input_stream.read(Decompressor::CHUNK_SIZE, buf)) | ||||||
|  | @ -77,14 +52,10 @@ module Zip | ||||||
|       @zlib_inflater.finished? |       @zlib_inflater.finished? | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     def value_when_finished(number_of_bytes, buf) # mimic behaviour of ruby File object. |     def value_when_finished # mimic behaviour of ruby File object. | ||||||
|       if number_of_bytes.nil? |       return if @has_returned_empty_string | ||||||
|         buf |       @has_returned_empty_string = true | ||||||
|       elsif buf.bytesize == 0 |       '' | ||||||
|         nil |  | ||||||
|       else |  | ||||||
|         buf |  | ||||||
|       end |  | ||||||
|     end |     end | ||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue