Actions
Bug #20919
openIO#seek and IO#pos= do not clear the character buffer in some cases while transcoding
    Bug #20919:
    IO#seek and IO#pos= do not clear the character buffer in some cases while transcoding
  
Status:
Open
Assignee:
-
Target version:
-
ruby -v:
ruby 3.4.0dev (2024-11-28T12:38:16Z master 3af1a04741) +PRISM [x86_64-linux]
Description
When transcoding characters, IO#seek and IO#pos= only clear the internal character buffer if IO#getc is called first:
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
  
Actions