diff options
-rw-r--r-- | io.c | 6 | ||||
-rw-r--r-- | test/ruby/test_argf.rb | 28 |
2 files changed, 32 insertions, 2 deletions
@@ -136,6 +136,8 @@ off_t __syscall(quad_t number, ...); #ifdef _WIN32 #undef open #define open rb_w32_uopen +#undef rename +#define rename(f, t) rb_w32_urename((f), (t)) #endif VALUE rb_cIO; @@ -8249,8 +8251,8 @@ argf_next_argv(VALUE argf) retry: if (RARRAY_LEN(ARGF.argv) > 0) { VALUE filename = rb_ary_shift(ARGF.argv); - StringValueCStr(filename); - ARGF.filename = rb_str_encode_ospath(filename); + FilePathValue(filename); + ARGF.filename = filename; fn = StringValueCStr(filename); if (RSTRING_LEN(filename) == 1 && fn[0] == '-') { ARGF.current_file = rb_stdin; diff --git a/test/ruby/test_argf.rb b/test/ruby/test_argf.rb index a112cf3e84..26fe16061e 100644 --- a/test/ruby/test_argf.rb +++ b/test/ruby/test_argf.rb @@ -316,6 +316,34 @@ class TestArgf < Test::Unit::TestCase } end + def test_inplace_to_path + base = "argf-test" + name = "#{@tmpdir}/#{base}" + File.write(name, "foo") + stdout = $stdout + argf = ARGF.class.new(Struct.new(:to_path).new(name)) + begin + result = argf.gets + ensure + $stdout = stdout + argf.close + end + assert_equal("foo", result) + end + + def test_inplace_ascii_incompatible_path + base = "argf-\u{30c6 30b9 30c8}" + name = "#{@tmpdir}/#{base}" + File.write(name, "foo") + stdout = $stdout + argf = ARGF.class.new(name.encode(Encoding::UTF_16LE)) + assert_raise(Encoding::CompatibilityError) do + argf.gets + end + ensure + $stdout = stdout + end + def test_encoding ruby('-e', "#{<<~"{#"}\n#{<<~'};'}", @t1.path, @t2.path, @t3.path) do |f| {# |