@@ -191,6 +191,11 @@ def read_until(pattern, offset = 0, limit: nil, chomp: true)
191191 matched = @read_buffer . byteslice ( 0 , index +( chomp ? 0 : pattern . bytesize ) )
192192 @read_buffer = @read_buffer . byteslice ( index +pattern . bytesize , @read_buffer . bytesize )
193193
194+ if @read_buffer . frozen?
195+ Console . warn ( self , "Read buffer is frozen, duplicating it!" , name : "read_until" )
196+ @read_buffer = @read_buffer . dup
197+ end
198+
194199 return matched
195200 end
196201 end
@@ -213,6 +218,11 @@ def discard_until(pattern, offset = 0, limit: nil)
213218 matched = @read_buffer . byteslice ( 0 , index +pattern . bytesize )
214219 @read_buffer = @read_buffer . byteslice ( index +pattern . bytesize , @read_buffer . bytesize )
215220
221+ if @read_buffer . frozen?
222+ Console . warn ( self , "Read buffer is frozen, duplicating it!" , name : "discard_until" )
223+ @read_buffer = @read_buffer . dup
224+ end
225+
216226 return matched
217227 end
218228 end
@@ -280,6 +290,11 @@ def gets(separator = $/, limit = nil, chomp: false)
280290 line = @read_buffer . byteslice ( 0 , index +( chomp ? 0 : separator . bytesize ) )
281291 @read_buffer = @read_buffer . byteslice ( index +separator . bytesize , @read_buffer . bytesize )
282292
293+ if @read_buffer . frozen?
294+ Console . warn ( self , "Read buffer is frozen, duplicating it!" , name : "gets" )
295+ @read_buffer = @read_buffer . dup
296+ end
297+
283298 return line
284299 end
285300
@@ -343,6 +358,11 @@ def fill_read_buffer(size = @minimum_read_size)
343358 # This effectively ties the input and output stream together.
344359 flush
345360
361+ if @read_buffer . frozen?
362+ Console . warn ( self , "Read buffer is frozen, duplicating it!" , name : "fill_read_buffer" )
363+ @read_buffer = @read_buffer . dup
364+ end
365+
346366 if @read_buffer . empty?
347367 if sysread ( size , @read_buffer )
348368 # Console.info(self, name: "read") {@read_buffer.inspect}
@@ -401,7 +421,13 @@ def consume_read_buffer(size = nil, buffer = nil)
401421 else
402422 result = @read_buffer . byteslice ( 0 , size )
403423 end
424+
404425 @read_buffer = @read_buffer . byteslice ( size , @read_buffer . bytesize )
426+
427+ if @read_buffer . frozen?
428+ Console . warn ( self , "Read buffer is frozen, duplicating it!" , name : "consume_read_buffer" )
429+ @read_buffer = @read_buffer . dup
430+ end
405431 end
406432
407433 return result
0 commit comments