著作一覧 |
RubyizeでRubyのオブジェクトをラップしているところで2個所。
1つは、String#eachが無くなった件。NewENUM呼ばれたら最初にrespond_to(:each)して、次にrespond_to(:each_line)するように変更。
2つめは、methodsがSymbolを返すようになった点。methodsの戻り値がSymbolだったらrb_sym_to_sを呼ぶように修正。
rb_load_protectでロードしたファイルの中でrequireを呼ぶと、さらにそこから呼び出したファイルのエンコーディングがおかしくなった。
具体的には、ロードしたファイルの中でrequire 'unit/test'している中から呼ばれた'mini/test'の中でFile.expand_path __FILE__
している箇所で、cp932からus-asciiのエンコーディング違いで例外となる。
file_exapnd_pathの最後に実行しているrb_enc_checkに引っかかる。
とりあえずruby.cの真似をして
VALUE enc = rb_enc_from_encoding(rb_locale_encoding()); rb_enc_set_default_external(enc); rb_enc_set_default_internal(enc);をruby_initの直後に呼ぶようにして回避した。
ジェズイットを見習え |
いまいち状況が分からないのと、「p932からus-asciiのエンコーディング違いで例外」ってほんとですかね。<br>あと、回避策もdefault_externalやdefault_internalをいじるのはまずいと思うんですが
組み込みだからruby.cがdefaultをいじる処理は通っていないので、代わりにいじってるわけで、まずいとは思えないけど。<br>例外はまさにそれなんだけど、なぜcp932ということになっているのか、実はそこが一番の謎。<br>いずれにしろ再現させるには、組み込みRubyプログラムを作らなければできないです。
ちょっと簡単なCの組み込みで再現できるか試しますね(今日の夜以降)。
win32oleに対するrb_require呼び出しと、default_*ternalを呼ばないことの合わせ技が原因でした。(win32oleを呼ばなければ問題は起きない)