Bug #20919
Updated by javanthropus (Jeremy Bopp) 11 months 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
```