ruby-trunk-changes r47860 - r47866

今日は主に古いマクロや利用が推奨されないマクロがエラーになるようにしたり、代替実装に置き換えられたりしました。

ngoto: r47860 2014-10-09 23:36:35 +0900

bignum.c の absint_numwords_generic() でCの配列の初期化に引数を使った書きかたがSolaris上の古いFujitsu C Compiler(fcc)でコンパイルエラーになってしまうということで、宣言後に明示的に代入するように修正しています。 [ruby-dev:48608] [Bug #10350]

nobu: r47861 2014-10-10 11:27:41 +0900

io.h の rb_io_mode_flags() と rb_io_modenum_flags() というマクロはそれぞれ rb_io_modestr_fmode() と rb_io_oflags_fmode() に置き換えられるようになっていたのですが、代替を示しつつエラーになるようにしています。1.8 以前? のかなり前に置き換えられてたものみたいですね。

svn: r47862 2014-10-10 11:27:53 +0900

version.h の日付更新。

nobu: r47863 2014-10-10 11:34:24 +0900

io.h の RB_IO_BUFFER_INIT()、MakeOpenFile()、RB_IO_FPTR_NEW() などのマクロは内部実装をさらけ出しすぎということで io.c に移動して、かわりに関数として rb_io_make_open_file() を追加しています(MakeOpenFile() の代替)。マクロを利用するとコンパイルエラーになるようにしています。
しかしこういうのって defined でチェックできなくて複数バージョン対応で困ったりしないのかなぁ。と思ったけどこのマクロそもそもいらないか普通。

akr: r47864 2014-10-10 18:42:47 +0900

Enumerable#slice_before の rdoc 用コメントで、slice_before が返した Enumerator を複数回 each などで呼び出した時にローカル変数を使っていたら再初期化しないといけないという注意事項に、サンプルコード Enumerator.new を使った手法で書きなおしています。Enumerator.new のブロックの中に slice_before の呼び出しと、すぐに each などの呼び出しを閉じ込めて、そのブロック内の dynamic variable を利用するようにすると毎回初期化されるからいいよ、という。ブロックつきの lambda でもいいかもしれませんね。ちょっとややこしいですが、サンプルコードの変更の肝は、cols の初期化がブロックスコープになっていて、slice_before の結果を利用しようとした時に必ず初期化されるようにしていることです、多分。

nobu: r47865 2014-10-10 20:26:22 +0900

r47863 の変更で io.c の不要なバックスラッシュが残っていたのを削っています。

nobu: r47866 2014-10-10 21:45:21 +0900

gcc 拡張の __builtin_choose_expr() が利用可能なら RUBY_SAFE_LEVEL_CHECK() や only_if_constant() マクロをこれを用いて定義するようにしています。 これってコンパイル時にどちらが採用されるか決まるからランタイムの分岐がないってことなんでしょうか。