summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--ruby.c20
-rw-r--r--test/ruby/test_rubyoptions.rb11
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 <nobu@ruby-lang.org>
+Sun Nov 30 00:02:52 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * 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