[#37248] [Feature:1.9] Enumerator#inspect — "Yusuke ENDOH" <mame@...>

遠藤です。

12 messages 2008/12/02

[#37337] [Feature #841] Object#self — "rubikitch ." <redmine@...>

Feature #841: Object#self

13 messages 2008/12/09

[#37513] Current status of 1.9.1 RC1's issues — "Yugui (Yuki Sonoda)" <yugui@...>

Hi, folks

14 messages 2008/12/20
[#37516] Re: Current status of 1.9.1 RC1's issues — Masatoshi SEKI <m_seki@...> 2008/12/20

咳といいます。

[#37576] [BUG:trunk] encoding for stdio's — "Yugui (Yuki Sonoda)" <yugui@...>

Yuguiです。

11 messages 2008/12/24

[ruby-dev:37391] Re: [BUG:trunk] r20625 dumps core and many strings associated with wrong encoding

From: "Yugui (Yuki Sonoda)" <yugui@...>
Date: 2008-12-11 14:18:43 UTC
List: ruby-dev #37391
Yugui (Yuki Sonoda) さんは書きました:
> とりあえず、直すのはしてみました。結果として、process_options中に幾つか
> default_externalに依存するオブジェクトを生成していることが分かりました。

パッチを添付し忘れました。

修正方針ってこれで良いものでしょうか?
* LOAD_PATHのエンコーディングはどうするべき?
  -E を考慮したdefault_externalか、それともlocale encodingを強制するか

* prelude内でのIOはどれほど許される?

* なぜこんなに早いタイミングでpreludeが実行されてるんでしょうか?

* rb_prognameをrb_gc_register_mark_objectしていましたが、rb_prognameはあ
とから上書きされているのでこちらもrb_gc_register_mark_objectしないとまずい?

-- 
Yugui <yugui@yugui.jp>
http://yugui.jp
私は私をDumpする

Attachments (1)

default_external.diff (3 KB, text/x-diff)
diff --git a/encoding.c b/encoding.c
index 3253bfd..cd84af4 100644
--- a/encoding.c
+++ b/encoding.c
@@ -1072,7 +1072,7 @@ enc_set_default_encoding(struct default_encoding *def, VALUE encoding,
     return overridden;
 }
 
-static struct default_encoding default_external = {-2};
+static struct default_encoding default_external = {0};
 
 rb_encoding *
 rb_default_external_encoding(void)
diff --git a/gem_prelude.rb b/gem_prelude.rb
index ddc56c8..336dfac 100644
--- a/gem_prelude.rb
+++ b/gem_prelude.rb
@@ -2,6 +2,10 @@
 # vim: filetype=ruby
 # THIS FILE WAS AUTOGENERATED, DO NOT EDIT
 
+# NOTICE: Ruby is during initialization here. 
+#   * Encoding.default_external is always ASCII-8BIT.
+#   * Should not expect Encoding.default_internal.
+#   * Locale encoding is available.
 if defined?(Gem) then
 
   module Kernel
diff --git a/ruby.c b/ruby.c
index 913b454..0897c69 100644
--- a/ruby.c
+++ b/ruby.c
@@ -1097,6 +1097,8 @@ true_value(void)
 #define rb_define_readonly_boolean(name, val) \
     rb_define_virtual_variable((name), (val) ? true_value : false_value, 0)
 
+static void fix_objects_associated_with_default_external(void);
+
 static VALUE
 process_options(VALUE arg)
 {
@@ -1178,7 +1180,7 @@ process_options(VALUE arg)
 	}
     }
 
-    ruby_script(opt->script);
+    rb_progname = rb_obj_freeze(rb_str_new_cstr(opt->script));
 #if defined DOSISH || defined __CYGWIN__
     translate_char(RSTRING_PTR(rb_progname), '\\', '/');
 #endif
@@ -1211,6 +1213,7 @@ process_options(VALUE arg)
 	enc = lenc;
     }
     rb_enc_set_default_external(rb_enc_from_encoding(enc));
+    fix_objects_associated_with_default_external();
     if (opt->intern.enc.index >= 0) {
 	enc = rb_enc_from_index(opt->intern.enc.index);
 	rb_enc_set_default_internal(rb_enc_from_encoding(enc));
@@ -1287,6 +1290,18 @@ process_options(VALUE arg)
 
     return iseq;
 }
+static void 
+fix_objects_associated_with_default_external(void)
+{
+    int i;
+    VALUE load_path = GET_VM()->load_path;
+
+    for (i = 0; i < RARRAY_LEN(load_path); ++i) {
+        VALUE path = rb_ary_entry(load_path, i);
+        rb_enc_associate(path, rb_default_external_encoding());
+        rb_ary_store(load_path, i, path);
+    }
+}
 
 struct load_file_arg {
     VALUE parser;
@@ -1669,10 +1684,10 @@ ruby_process_options(int argc, char **argv)
     struct cmdline_arguments args;
     struct cmdline_options opt;
     NODE *tree;
+    VALUE tmp_progname; /* rb_progname will set with right encoding later */
 
-    ruby_script(argv[0]);	/* for the time being */
-    rb_argv0 = rb_str_new4(rb_progname);
-    rb_gc_register_mark_object(rb_argv0);
+    tmp_progname = rb_obj_freeze(rb_str_new_cstr(argv[0]));
+    rb_obj_freeze(tmp_progname);
     args.argc = argc;
     args.argv = argv;
     args.opt = cmdline_options_init(&opt);
@@ -1680,7 +1695,7 @@ ruby_process_options(int argc, char **argv)
     opt.intern.enc.index = -1;
     tree = (NODE *)rb_vm_call_cfunc(rb_vm_top_self(),
 				    process_options, (VALUE)&args,
-				    0, rb_progname);
+				    0, tmp_progname);
     return tree;
 }
 

In This Thread