遠藤です。

2011/12/8, Shyouhei Urabe <shyouhei / ruby-lang.org>:
> 以下のように、カバレッジの出力がファイルパスのエンコーディングを無視しています。
> これのせいで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 <mame / tsg.ne.jp>