ruby-trunk-changes r45976 - r46004

今日は拡張ライブラリ etc の新機能の追加がいくつもあったり、struct RRational が拡張ライブラリから内部が直接見えないように変更されたり、Float#next_float, prev_float や Enumerable#slice_after などの新しいメソッドが追加されたりとたくさんの変更がありました。

akr: r45976 2014-05-18 01:37:41 +0900

Rational のオブジェクト型の構造体 struct RRational を外部から遮蔽して直接構造体内部にアクセスできないようにしています。 rb_rational_num() と rb_rational_den() という関数が追加されているので、これを使って値を取り出すようにしましょう。 [ruby-core:60665] [Feature #9513]
さてこれで影響をうける拡張ライブラリはどのくらいあるでしょうね。

svn: r45977 2014-05-18 01:37:48 +0900

version.h の日付更新。

akr: r45978 2014-05-18 01:38:17 +0900

lib/test という空ディレクトリが残っていたので削除しています。 git-svn を使ってると空ディレクトリがなくなるので気がつかなかったのでしょう。

nobu: r45979 2014-05-18 08:22:28 +0900

IO で渡されたバッファ用の文字列オブジェクトに対して rb_str_modify() を呼ぶのが長さを変更する時だけだったのを常に呼び出すように修正しています。このバグの追跡は大変だったでしょうねぇ。報告者に感謝と賞賛を。 [ruby-core:62643] [Bug #9847]

nobu: r45980 2014-05-18 08:23:37 +0900

標準添付ライブラリ mkmf.rb で生成する Makefile に NULLCMD マクロを定義するようにして、RbConfig::CONFIG["NULLCMD"] を埋め込んでいたところをそのマクロの参照に変更しています。

akr: r45981 2014-05-18 09:06:05 +0900

Enumerable#slice_after と Enumerator::Lazy#slice_after という新たなメソッドを追加しています。 元は [ruby-dev:38392] で提案されていた gather_each という区切りを検出する lambda を引数に渡すことで区切り単位にまとめた配列を yield するメソッドでしたが名前は slice_after と変更して採用されています。 slice_before というメソッド(真になる要素の前で区切る)が既に存在するので、それと対称的なメソッドということでこの命名になったようです。これはなかなか便利そうですね。 [ruby-core:58123] [Feature #9071]

akr: r45982 2014-05-18 09:37:10 +0900

nextafter(3) という math ライブラリの関数が利用して Float#next_float, Float#prev_float という、前後の最も近い表現可能な Float を返すメソッドを追加しています。 nextafter(3) が利用できない環境では missing/nextafter.c に代替の実装を追加していて、これを利用するようにしています。 [ruby-core:62562] [Feature #9834]
ふーむ、これどんな時に使うんだろう、と思ったらチケットには "These methods can be useful to examine the behavior of floating-point numbers." とあるので、まあ説明用ですね。確かにそういう時に欲しいこともありますね。

akr: r45983 2014-05-18 09:58:34 +0900

拡張ライブラリ etc に uname(3) で得られるようなシステムの情報を取得するためのメソッド Etc.uname を追加しています。 引数はなしで、Symbol をキーとした Hash オブジェクトが返されて :sysname/:nodename/:release/:version/:machine などのキーが含まれます。 [ruby-core:62139] [Feature #9770]

akr: r45984 2014-05-18 10:48:47 +0900

拡張ライブラリ etc に Etc.sysconf、Etc.confstr と IO#pathconf というメソッドを追加しています。 それぞれ sysconf(3)、confstr(3)、pathconf(3) のラッパです。 confstr(3) っていうのは知らなかったな…。これもシステムの設定やファイルパスに使える文字数などの設定値を取得するものです。このために Etc に引数に使う定数がたくさん追加されています。使い方はそれぞれのライブラリ関数のマニュアルと追加されたテストコードを参照してください。 [ruby-core:62600] [Feature #9842]

akr: r45985 2014-05-18 11:06:15 +0900

r45984 で追加した IO#pathconf の rdoc 用コメントのサンプルコードを通常のファイルを使った Etc::PC_NAME_MAX (ファイル/ディレクトリ名の最大長)から pipe を使った Etc::PC_PIPE_BUF (パイプのバッファ長)の取得に変更しています。ついでにテストコードも対象を読み込み用 pipe から書き込み用 pipe に変更しています。

akr: r45986 2014-05-18 11:10:01 +0900

win32/Makefile.sub の MISSING という変数に nextafter.obj を追加しています。 r45982 で追加した missing/nextafter.c の Windows 向けビルド対応です。

akr: r45987 2014-05-18 12:03:26 +0900

r45982 で追加された missing/nextafter.c に #include "ruby/missing.h" を追加しています。代替実装を利用する時の対応でしょうか。 [ruby-core:62562] [Feature #9834]

akr: r45988 2014-05-18 12:04:07 +0900

r45984 での IO#pathconf の追加で拡張ライブラリ etc が ruby/io.h ヘッダに依存するようになったので depend ファイルにそれを反映させています。

naruse: r45989 2014-05-18 12:04:52 +0900

CentOS5/x64_86 でのテストで test_main_thread_status_at_exit が失敗することがあるので、状況を確認するためデバッグ用の出力を追加しています。

nobu: r45990 2014-05-18 12:15:34 +0900

r45981 の slice_after の実装で定義している UPDATE_MEMO() という関数マクロで、コンパイラの警告を除去するための明示的キャストの追加をしています。

nobu: r45991 2014-05-18 12:15:57 +0900

ARGF.lines というメソッドは既に deprecated になっていて ARGF.each_line が推奨されているのに rdoc 用コメントのサンプルに利用されているところがあったので変更しています。 https://github.com/ruby/ruby/pull/615

nobu: r45992 2014-05-18 14:46:36 +0900

r45987 の win32/Makefile.sub での nextafter の MISSING への追加を RT_VER が 120 以下の時だけ追加するように再修正しています。 また、ついでに finite.obj と isnan.obj も追加しています。新しい環境だと nextafter(3) が存在するみたいですね。 [ruby-core:62562] [Feature #9834]

nobu: r45993 2014-05-18 15:08:54 +0900

r35662 で NativeClient 対応のために ext/extmk.rb に --with-static-linked-ext オプションの挙動を有効にするために加えられた変更で Makefile に DUMMY_SIGNATURE というのを埋め込んでいたら再作成しないようにする処理で、空の Makefile が存在していた時には gets が nil を返すためエラーになってしまうので無視するように修正しています。

naruse: r45994 2014-05-18 15:35:04 +0900

test_LSHIFT_neary_long_max というテストが Linux の CI で時々タイムアウトしていたので、子プロセスを待つタイムアウトを 10 sec から 15 sec にのばしています。

nobu: r45995 2014-05-18 16:38:54 +0900

マシンスタックオーバフロー検出で ucontext_t を利用する実装を x86Linux のみ導入していましたが、Mac OS X でも実験的に利用するようにしています。

akr: r45996 2014-05-18 16:43:45 +0900

test/ruby/test_m17n_comb.rb の String#crypt のテストで crypt(3) の挙動によってテストを変更していたのを glibc のバージョンで検出するため libc.so を実行しようとしていたのを、r45984 で導入した Etc.confstr を使って glibc のバージョンを取得するようにしています。 一部の環境で libc.so が実行できなかったためテストが走らなかったのが、おそらくこれで実行されるようになったと思われます。

nobu: r45997 2014-05-18 17:15:16 +0900

r45995 のマシンスタックオーバフロー検出で利用する型名を struct mcontext から mcontext_t に変更しています。こちらのほうが移植性があるとのこと。確かに getcontext(3) のマニュアルをみると mcontext_t と書かれていますね。

nobu: r45998 2014-05-18 17:31:34 +0900

configure での atan2f(3) と atan2l(3) の検出に失敗した時に rb_cv_atan2_inf_c99 に明示的に no を代入するようにしています。またこの変数を利用するところで変数が空だった時に対応するように test "x$var" = xyes で判定するイディオムを利用するようにしています。

akr: r45999 2014-05-18 17:33:39 +0900

r45996 の String#crypt のテストに Etc.confstr を利用するようにしたところで Etc の定数参照のパスが間違っていたのを修正しています。

akr: r46000 2014-05-18 17:45:07 +0900

r45984 で追加した Etc.sysconf, Etc.confstr, IO#pathconf の rdoc 用コメントの typo を修正しています。

akr: r46001 2014-05-18 17:45:37 +0900

テストで uname(1) を呼んで出力をパースしていた部分を r45983 で導入した Etc.uname を利用するように変更しています。

nobu: r46002 2014-05-18 17:47:41 +0900

インタプリタが終了する時に例外などで終了した場合にエラーメッセージやバックトレースを出力する error_handle() で、例外クラスが Signal だった時にはバックトレースを抑制していたのを、SIGSEGV で終了した時には backtrace を出力するようにしています。 CI での SEGV の調査のためとのこと。

naruse: r46003 2014-05-18 20:02:43 +0900

GCデバッグ出力用の関数 rb_gcdebug_print_obj_condition で RVALUE の file/line が const char */int 型なのに RSTRING_PTR() や FIX2INT() で VALUE 型として扱われていたところがあったのを修正しています。

nobu: r46004 2014-05-18 22:20:39 +0900

r45982 で導入した Float#next_float などのための代替実装 missing/nextafter.c の Windows でのビルドのための修正 r45986, r45992 の続きで、r45992 の MISSING への代入もやめて、win32/win32.c で #if RUBY_MSVCRT_VERSION < 120 の時は直接 missing/nextafter.c を #include で取り込むようにしています。無限再帰を避けるためということなのでなにか依存関係の循環があったのでしょう。