From: Yusuke Endoh Date: 2011-12-08T20:40:04+09:00 Subject: [ruby-dev:44953] Re: [ruby-trunk - Bug #5725][Assigned] Coverage doesn't honor file path encodings 遠藤です。 2011/12/8, Shyouhei Urabe : > 以下のように、カバレッジの出力がファイルパスのエンコーディングを無視しています。 > これのせいでsimplecovがこけて気づきました。 ありがとうございます。 この問題は、ありそうな予感はしていたのですが気がつかなかったことに していました。 とりあえず rb_filesystem_encoding() の String インスタンスを作る ようにするパッチ (__FILE__ でも取られている手) を書いてみましたが、 M17N はよくわからないので、成瀬さんのご意見を聞きたいです。 diff --git a/parse.y b/parse.y index 3061ed8..b2081a0 100644 --- a/parse.y +++ b/parse.y @@ -5167,7 +5167,7 @@ coverage(const char *f, int n) { VALUE coverages = rb_get_coverages(); if (RTEST(coverages) && RBASIC(coverages)->klass == 0) { - VALUE fname = rb_str_new2(f); + VALUE fname = rb_external_str_new_with_enc(f, strlen(f), rb_filesystem_encoding()); VALUE lines = rb_ary_new2(n); int i; RBASIC(lines)->klass = 0; そもそもの原因は、parse.y や load.c や eval 回りを中心にコア内部の 色んなところでソースファイル名が char * として扱われている事なので、 根本的な対策としては、ファイル名を片っ端から String インスタンスに 置き換えていくことだと思いますが、公開 API まで巻き込んだ大規模な 修正になるような気がします。 -- Yusuke Endoh