ruby-trunk-changes r41689 - r41693

今日も主に bignum.c のリファクタリング/修正がありました。

charliesome:r41689 2013-06-29 01:09:08 +0900

numeric.c の fix_mul() で整数どうしの乗算で FIT_SQRT_LONG() マクロで両者をチェックして、C の整数のまま乗算して LONG2FIX() で Fixnum に変換するようにしていましたが、64bit 環境で -2147483648*-2147483648 が誤った結果を返してしまう(アンダーフローしてしまう)とのことでこの分岐を削除しています。

svn:r41690 2013-06-29 01:09:13 +0900

version.h の日付更新。

akr:r41691 2013-06-29 08:21:57 +0900

bignum.c の bigand_int() で x が 0 の時に y に hibitsx をビットAND を取っていたのをやめています。また bigor_int() では r41683 と同様に引数に x のバッファサイズ xn と上位ワードのビットの hibitsx を引数に追加して twocomp2abs_bang() を利用するようにリファクタリングしています。rb_big_or() でも abs2comp() から twocomp2abs_bang() を利用するように書きかえて、また最適化による GC マーク漏れを避けるために volatile 宣言した変数を使っていたのを RB_GC_GUARD() を利用するように書きかえています。

akr:r41692 2013-06-29 09:08:47 +0900

bignum.c の bigor_int() にて RB_GC_GUARD() を追加しています。
また bigxor_int() でも x のバッファサイズ xn と最上位ワードの値 hibitsx を引数に追加して twocomp2abs_bang() を利用して負値の時の計算をシンプルにしています。また呼び元の rb_big_xor() では volatile 変数の代わりに RB_GC_GUARD() を使った最適化避けを使うように変更したり、負値の時の計算をシンプルにしています。

akr:r41693 2013-06-29 09:35:57 +0900

bignum.c の bigor_int() で y が -1 の時に return を書き忘れていて処理を返せていなかった不具合を修正しています。