Project

General

Profile

Bug #20919

Updated by javanthropus (Jeremy Bopp) 5 days ago

When transcoding characters, `IO#seek` only clears the internal character buffer if `IO#getc` is called first: 

 ```ruby 
 require 'tempfile' 

 Tempfile.open(encoding: 'utf-8:utf-16le') do |f| 
   f.write('0123456789') 
   f.rewind 

   f.ungetc('a'.encode('utf-16le')) 

   # Character buffer WILL NOT be cleared 
   f.seek(2, :SET) 

   f.getc         # => 'a'.encode('utf-16le'); should be '2'.encode('utf-16le') 
 end 


 Tempfile.open(encoding: 'utf-8:utf-16le') do |f| 
   f.write('0123456789') 
   f.rewind 

   f.ungetc('a'.encode('utf-16le')) 

   # Character buffer WILL NOT be cleared 
   f.pos = 2 

   f.getc         # => 'a'.encode('utf-16le'); should be '2'.encode('utf-16le') 
 end 

 Tempfile.open(encoding: 'utf-8:utf-16le') do |f| 
   f.write('0123456789') 
   f.rewind 

   # Added a call to #getc here 
   f.getc 

   f.ungetc('a'.encode('utf-16le')) 

   
   # Character buffer WILL be cleared now 
   f.seek(2, :SET) 
   # Same behavior for #pos= 
   #f.pos = 2 

   f.getc         # => '2'.encode('utf-16le') 
 end 
 ```

Back