ruby-trunk-changes r32544 - r32551

今日はメモリのアライメントや GC のマーク漏れに関する不具合修正と、Windows で標準入力からの読み込みを割り込めない不具合の修正がありました。

nobu:r32544 2011-07-15 01:51:29 +0900

PLATFORM_UNALIGNED_WORD_ACCESS と UNALIGNED_WORD_ACCESS というマクロの定義のプラットフォームの条件を変更しています。それぞれ鬼車(正規表現エンジン)と st.c(ハッシュテーブルの実装)でアライメントされていないアドレスにワード単位でアクセスできるかをチェックしています。えーとつまり 0x00001230 というアドレスならワード長の整数倍なので大丈夫ですけど 0x00001231 なんてアドレスだと整数倍になっていない(アライメントされていない)ので、このアドレスをたとえば (int *) としてアクセスするのはアーキテクチャによってはエラーになるので、高速化のためにワード単位の読み書きする時にアラインメントを気にするかどうかというのを切り替えています。
正規表現のほうは PowerPC で(defined(__ppc__) && defined(__APPLE__) で)アラインメントされないアクセスできることになっていた(けどできない)ので削除していて、 st.c のほうは条件がかなり古くて i386 の時しか非アラインメントなアクセスを許していなかったので x86_64 でも許すようにしています。

svn:r32545 2011-07-15 01:51:32 +0900

version.h の日付更新。

nahi:r32546 2011-07-15 12:03:31 +0900

Digest::SHA256, SHA512 の digest でもアライメントの取れてないメモリアクセスのために Sparc/Solaris で BUS エラーになっていたのを memcopy で一旦コピーすることで回避しています。 [ruby-core:34850] [Bug #4320]

usa:r32549 2011-07-15 14:33:45 +0900

Windows 版の関数 rb_w32_has_cancel_io() を rb_w32_io_cancelable_p() と改名して、引数に渡した file descriptor が端末でないこともチェックに追加しています。これにより STDIN.gets で入力を待つ時に例外や Thread.kill で割り込みがかけられるようにしているようです。
中身はちゃんと調べていませんが、名前からして is_socket() と is_console() は同時に真にならないんじゃないかと思えるのでそうすると !is_console() だけでも良さそうな気がします。
[追記]コメントで教えて頂きました。 socket の fd について is_console() を呼んではいけないので、is_socket() の条件も必須ということでした。[/追記]

usa:r32550 2011-07-15 14:37:50 +0900

r32549 の ChangeLog エントリ追加です。

mrkn:r32551 2011-07-15 19:16:41 +0900

Bignum の加算/減算のための関数(bigadd_int, bigsub_int)でコンパイラの最適化による GC のマーク漏れの可能性があったので RB_GC_GUARD() による最適化避けを追加しています。 [ruby-dev:42907] [Bug #4223]