ruby-trunk-changes r44989 - r45004

今日は先日の struct RBignum の非公開化の際に消したマクロの一部復活や internal.h の RBIGNUM_XXX -> BIGNUM_XXX のマクロ名変更などがありました。

akr: r44989 2014-02-16 06:17:34 +0900

internal.h の RBIGNUM_XXX() のマクロを一律 BIGNUM_XXX() に改名しています。 internal.h なので外部の拡張ライブラリには関係ないですね。

svn: r44990 2014-02-16 06:17:38 +0900

version.h の日付更新。

akr: r44991 2014-02-16 07:48:43 +0900

BIGNUM_ZERO_P() は未使用のため削除しています。

zzak: r44992 2014-02-16 08:13:40 +0900

README.EXT.ja の typo を修正しています。 https://github.com/ruby/ruby/pull/534

normal: r44994 2014-02-16 12:45:15 +0900

marshal.c の marshal_dump() でコンパイラ最適化による GC マーク漏れの保護のために内部的に利用しているオブジェクトの wrapper オブジェクトを RB_GC_GUARD() で保護していたのですが、利用後は不要になるので rb_gc_force_recycle() で強制的に開放する処理を書いておくことで参照が最適化で消されないようにしています。おおなるほど、解放のために利用されるなら(妙な表現ですが)参照が残るはずなので一時的オブジェクトの場合はこういう方法もありますね。

normal: r44995 2014-02-16 13:19:29 +0900

rb_f_backquote() でも同様に一時的オブジェクトを volatile 修飾子つきの変数に入れて保護していたのを明示的に rb_gc_force_recycle() で回収させることで最適化から保護する方法を使うようにしています。

akr: r44996 2014-02-16 14:34:48 +0900

struct RBignum の非公開化の際に削除した関数マクロ RBIGNUM_SIGN(), RBIGNUM_POSITIVE_P(), RBIGNUM_NEGATIVE_P() を互換性のために再度追加しています。中身は rb_big_cmp() を利用した実装にしています。

normal: r44997 2014-02-16 14:53:14 +0900

dir_s_glob() でコンパイラによる最適化で参照が消されて GC されてしまうのを防ぐために volatile 修飾子つき変数を使っていたところを RB_GC_GUARD() を利用するように置き換えています。

hsbt: r44998 2014-02-16 15:05:52 +0900

テストスクリプトで未使用のローカル変数を削除して警告除去しています。

hsbt: r44999 2014-02-16 15:05:55 +0900

Pathname のテストで File.exists? を利用していたところを File.exist? を利用するように変更しています。 これも r43377 で警告を出すようにしたので警告除去ですね。

hsbt: r45000 2014-02-16 15:55:06 +0900

SecureRandom のテストでも File.exists? を File.exist? に変更する警告除去を行っています。

nobu: r45001 2014-02-16 16:20:23 +0900

r44996 で復活させた RBIGNUM_SIGN(), RBIGNUM_POSITIVE_P(), RBIGNUM_NEGATIVE_P() で FIX2INT() を利用していたのを FIX2LONG() に変更しています。 FIX2LONG() はシフトしてタグビットを消すだけなので高速で、rb_big_cmp() の結果は -1, 0, 1 のどれかなので FIX2INT() のオーバフローチェックなどは不要なため。

nobu: r45002 2014-02-16 16:53:18 +0900

拡張ライブラリ bigdecimal のマクロ PUSH() と SAVE() の定義がセミコロンを含む単文になっていた(従って PUSH(); と呼び出すと展開後セミコロンが2つ連続することになる)ので式になるように修正。また GUARD_OBJ() も { } のブロックで囲んだ複文になっていたので、カンマ区切りの式にしています。また関数マクロの引数の利用にかっこをつけるようにしてます。

nobu: r45003 2014-02-16 16:53:20 +0900

拡張ライブラリ psych に同梱されている libyaml のソースで未使用の変数の警告除去。未使用の値の警告除去のために利用しない変数に代入しておくということをしていたようですが、新しめのコンパイラでは(?)今度はその変数が警告されてしまうので (void) をつけて明示的に戻り値を無視させるようにしています。

akr: r45004 2014-02-16 17:34:33 +0900

rb_integer_pack() のテストにフラグ MSBYTE_FIRST と LSBYTE_FIRST を指定した時のテストケースを追加しています。 はて BIGENDIAN と LITTLEENDIAN とどう違うんだっけ、と bignum.c のコメントを読むとこうありました。

- [INTEGER_PACK_MSWORD_FIRST] Store the most significant word as the first word.
- [INTEGER_PACK_LSWORD_FIRST] Store the least significant word as the first word.
- [INTEGER_PACK_MSBYTE_FIRST] Store the most significant byte in a word as the first byte in the word.
- [INTEGER_PACK_LSBYTE_FIRST] Store the least significant byte in a word as the first byte in the word.

- [INTEGER_PACK_LITTLE_ENDIAN] Same as INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_LSBYTE_FIRST
- [INTEGER_PACK_BIG_ENDIAN] Same as INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_MSBYTE_FIRST

rb_integer_pack() には wordsize も引数で指定するので、ワードの順番とそのワードの中のバイトオーダーも別々に指定できるのでした。