ruby-trunk-changes r35076 - r35084

今日は profile.rb の不具合修正、Class/Module を GC した時の不具合修正、Mac OS XLeopardコンパイルできなかった問題の対処などがあります。
GC の不具合は手元では再現できないのですが、修正の該当箇所のみ見た感じだと多分条件がそろえばほぼ確実に致命的な結果になり(SEGV など)、1.9.2, 1.9.3 にも存在しそうな気がします。しかしメタプログラミングをバリバリ使ってたらいくらでも踏みそうなのにこれまで見過されてたのと、再現できていないのでなにか条件が他にもあるのかもしれません。[追記]valgrind 経由で実行してみると free 済み領域の free などの不正な操作が検出されて、修正後は収まるのが確認できたので、たまたま SEGV などはしなかっただけのようでした。[/追記]

ktsj:r35076 2012-03-18 10:03:35 +0900

profiler.rb を利用した状態で BasicObject の特異メソッドの呼び出しがエラーになっていた不具合を修正しています。メソッド名を管理するために Hash を利用しているところで BasicObject には hash メソッドが存在しないため Hash のキーにできないので、そういう場合のために特別に情報を格納するための Array を導入しています。

svn:r35077 2012-03-18 10:03:39 +0900

version.h の日付更新。

akr:r35079 2012-03-18 15:28:41 +0900

特異クラスの内部のバックトレース上での表記の typo 修正(singleton と class の間に空白を挿入)。 [ruby-core:28368] [Bug #2824]

nobu:r35080 2012-03-18 17:17:39 +0900

メソッドエントリのリストの個々のエントリを解放する関数 free_method_entry_i() でマーク済みのエントリまで解放してしまっていたため、特異クラスなど Class/Module が GC で解放されると SEGV してしまっていた不具合を修正しています。 [ruby-core:43383] [Bug #6171]

nobu:r35081 2012-03-18 17:17:50 +0900

2 ** 7830457 のように大きな数での Integer#** が Float::INFINITY を返していたのを Bignum を返すようにしています。 結果があまりにも大きな数になった時には警告メッセージを出して Float::INFINITY を返すようになっていて、その挙動は変わりないのですがその閾値の計算方法を変更して限界を引き上げているようです。 [ruby-core:30735] [Feature #3429]

nobu:r35082 2012-03-18 19:45:05 +0900

win32/Makefile.sub が スタブファイル(rubystub.ext) を先頭に付加して Windows で実行できる exe ファイル(Ruby スクリプトを exe として実行可能にしたもの)を生成するルールでスタブ部分とスクリプト部分の間に空行を追加しています。

yugui:r35083 2012-03-18 20:15:50 +0900

gc.c で posix_memalign() や memalign() が利用できないプラットフォームでも malloc(3) を使って余分なサイズを確保しつつ、malloc() が返した元のポインタを align されたポインタの位置のひとつ前に格納するようにする実装で代替するようにしています。 Mac OS XLeopardposix_memalign() が存在していなくてコンパイルできなかったそうです。
しかしどうもこれが入ってからビルド時に miniruby の実行が SEGV するようになっているようです(Snow Leopard)。

nobu:r35084 2012-03-18 23:21:31 +0900

r35053 の解放処理の条件コンパイルの条件が間違っていたため他の環境でも malloc(3) を使った代替実装用の free をしようとして SEGV していたので修正しています。