nobu:r34348 2012-01-21 11:43:48 +0900
Dir.chdir で呼ばれる dir_chdir() という関数内部でエンコーディングの変換をするため新しい String オブジェクトが生成される可能性があり、その後その中身を利用する前にコンパイラの最適化によっては GC されてしまう可能性がある問題に対して、呼び元の dir_s_chdir() でエンコーディングの調整をしておいてそれを渡すようにしています。結局 dir_s_chdir() の最後に RB_GC_GURAD(path) はあったほうが良いような。
また check_dirname() を呼んでいるところでは逆に rb_str_encode_ospath() の呼び出し(新しい String オブジェクトを生成する可能性がある)を check_dirname() の中で呼ぶようにしています。check_dirname() は VALUE へのポインタを受け取ってそこに書き戻すので、新しいオブジェクトが生成された時その VALUE が確実にメモリ上に書き込まれるのを狙ったものかと思います。static 関数なので inline 化されたりするとコンパイラの最適化能力によってはどうなるかわからないような気もしますけど。 check_dirname() の引数には volatile 指示子が付いてるのでメモリに書き込まれるのは保障されるようでした。
svn:r34349 2012-01-21 11:43:51 +0900
version.h の日付更新。