Skip to content

Commit 365dfa6

Browse files
committed
Add IO#set_encoding_by_bom method
Method was introduced in MRI in 2.7.0 in e717d6faa
1 parent 81e816f commit 365dfa6

File tree

3 files changed

+25
-8
lines changed

3 files changed

+25
-8
lines changed

spec/ruby/core/io/set_encoding_by_bom_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,11 @@
6767

6868
-> { @io.set_encoding_by_bom }.should raise_error(ArgumentError, 'encoding is set to UTF-8 already')
6969
end
70+
71+
it 'returns exception if encoding conversion is already set' do
72+
@io.set_encoding(Encoding::UTF_8, Encoding::UTF_16BE)
73+
74+
-> { @io.set_encoding_by_bom }.should raise_error(ArgumentError, 'encoding conversion is set')
75+
end
7076
end
7177
end

spec/tags/core/io/set_encoding_by_bom_tags.txt

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/ruby/truffleruby/core/io.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2158,6 +2158,25 @@ def set_encoding(external, internal=nil, options=undefined)
21582158
self
21592159
end
21602160

2161+
def set_encoding_by_bom
2162+
unless binmode?
2163+
raise ArgumentError, 'ASCII incompatible encoding needs binmode'
2164+
end
2165+
2166+
if internal_encoding
2167+
raise ArgumentError, 'encoding conversion is set'
2168+
end
2169+
2170+
if external_encoding && external_encoding != Encoding::ASCII_8BIT
2171+
raise ArgumentError, "encoding is set to #{external_encoding} already"
2172+
end
2173+
2174+
external = strip_bom
2175+
if external
2176+
@external = Encoding.find(external)
2177+
end
2178+
end
2179+
21612180
private def strip_bom
21622181
mode = Truffle::POSIX.truffleposix_fstat_mode(Primitive.io_fd(self))
21632182
return unless Truffle::StatOperations.file?(mode)

0 commit comments

Comments
 (0)