From 1ce81d6f8b00186dcae04005f502248f986fbe75 Mon Sep 17 00:00:00 2001 From: nobu Date: Sat, 29 Nov 2014 15:02:58 +0000 Subject: ruby.c: transcode program names * ruby.c (process_options, ruby_script): transcode script name and program name to locale encoding as well as argv. [ruby-dev:48752] [Bug #10555] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 +++++- ruby.c | 20 ++++++++++++++++---- test/ruby/test_rubyoptions.rb | 11 +++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index fbae5f22b7..ed8b4a8567 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,8 @@ -Sun Nov 30 00:02:22 2014 Nobuyoshi Nakada +Sun Nov 30 00:02:52 2014 Nobuyoshi Nakada + + * ruby.c (process_options, ruby_script): transcode script name and + program name to locale encoding as well as argv. + [ruby-dev:48752] [Bug #10555] * ruby.c (translit_char_bin): should not use code page dependent CharNext on UTF-8 string. [ruby-dev:48752] [Bug #10555] diff --git a/ruby.c b/ruby.c index 92dac98f53..967c8a949f 100644 --- a/ruby.c +++ b/ruby.c @@ -346,6 +346,16 @@ translit_char_bin(char *p, int from, int to) # define UTF8_PATH 0 #endif +#if UTF8_PATH +static VALUE +str_conv_enc(VALUE str, rb_encoding *from, rb_encoding *to) +{ + return rb_str_conv_enc_opts(str, from, to, + ECONV_UNDEF_REPLACE|ECONV_INVALID_REPLACE, + Qnil); +} +#endif + void ruby_init_loadpath_safe(int safe_level); void @@ -1404,6 +1414,10 @@ process_options(int argc, char **argv, struct cmdline_options *opt) rb_define_module("Gem"); } ruby_init_prelude(); +#if UTF8_PATH + opt->script_name = str_conv_enc(opt->script_name, rb_utf8_encoding(), lenc); + opt->script = RSTRING_PTR(opt->script_name); +#endif ruby_set_argv(argc, argv); process_sflag(&opt->sflag); @@ -1819,9 +1833,7 @@ external_str_new_cstr(const char *p) { #if UTF8_PATH VALUE str = rb_utf8_str_new_cstr(p); - return rb_str_conv_enc_opts(str, NULL, rb_default_external_encoding(), - ECONV_UNDEF_REPLACE|ECONV_INVALID_REPLACE, - Qnil); + return str_conv_enc(str, NULL, rb_default_external_encoding()); #else return rb_external_str_new_cstr(p); #endif @@ -1836,7 +1848,7 @@ void ruby_script(const char *name) { if (name) { - rb_orig_progname = rb_progname = rb_external_str_new(name, strlen(name)); + rb_orig_progname = rb_progname = external_str_new_cstr(name); rb_vm_set_progname(rb_progname); } } diff --git a/test/ruby/test_rubyoptions.rb b/test/ruby/test_rubyoptions.rb index 3ab2f9b548..9b310e16b3 100644 --- a/test/ruby/test_rubyoptions.rb +++ b/test/ruby/test_rubyoptions.rb @@ -705,6 +705,17 @@ class TestRubyOptions < Test::Unit::TestCase bug10555, encoding: "locale") end end + + def test_command_line_progname_nonascii + bug10555 = '[ruby-dev:48752] [Bug #10555]' + name = "\u{3042}.rb" + expected = name.encode("locale") rescue "?.rb" + with_tmpchdir do |dir| + open(name, "w") {|f| f.puts "puts File.basename($0)"} + assert_in_out_err([name], "", [expected], [], + bug10555, encoding: "locale") + end + end end def test_script_is_directory -- cgit v1.2.3