@@ -187,10 +187,15 @@ def read_until(pattern, offset = 0, limit: nil, chomp: true)
187187 if index = index_of ( pattern , offset , limit )
188188 return nil if limit and index >= limit
189189
190- @read_buffer . freeze
190+ # @read_buffer.freeze
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
@@ -202,7 +207,7 @@ def read_until(pattern, offset = 0, limit: nil, chomp: true)
202207 # @returns [String | Nil] The contents of the stream up until the pattern, or nil if the pattern was not found.
203208 def discard_until ( pattern , offset = 0 , limit : nil )
204209 if index = index_of ( pattern , offset , limit , true )
205- @read_buffer . freeze
210+ # @read_buffer.freeze
206211
207212 if limit and index >= limit
208213 @read_buffer = @read_buffer . byteslice ( limit , @read_buffer . bytesize )
@@ -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
@@ -275,11 +285,16 @@ def gets(separator = $/, limit = nil, chomp: false)
275285 end
276286
277287 # Freeze the read buffer, as this enables us to use byteslice without generating a hidden copy:
278- @read_buffer . freeze
288+ # @read_buffer.freeze
279289
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}
@@ -392,7 +412,7 @@ def consume_read_buffer(size = nil, buffer = nil)
392412 else
393413 # We know that we are not going to reuse the original buffer.
394414 # But byteslice will generate a hidden copy. So let's freeze it first:
395- @read_buffer . freeze
415+ # @read_buffer.freeze
396416
397417 if buffer
398418 # Use replace instead of clear + << for better performance
@@ -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