ruby-trunk-changes r41338 - r41361

今日は Symbol#to_proc や Method#to_proc で作った Proc オブジェクトにブロックを渡して呼び出した時の不具合修正や引き続き bignum.c のリファクタリング、tk の不具合修正などがありました。

akr:r41338 2013-06-16 23:16:33 +0900

bignum.c に最近導入された BDIGIT の配列で直接演算する bary_add(), bary_sub(), bary_mul(), bary_divmod(), bary_zero_p() などの関数のラッパのマクロ BARY_ADD(), BARY_SUB(), BARY_MUL, BARY_DIVMOD(), BARY_ZERO_P() などのマクロ定義を追加し、これを利用するようにしています。

akr:r41339 2013-06-17 07:39:46 +0900

bignum.c から absint_numwords_bytes() という関数を削除して rb_absint_numwords() でこの関数を呼んでいたところは absint_numwords_generic() を使う(条件分岐を削除する)ようにしています。

svn:r41340 2013-06-17 07:39:50 +0900

version.h の日付更新。

akr:r41341 2013-06-17 07:57:22 +0900

bignum.c の関数名の改名。 bdigs_small_lshift() を bary_small_lshift() へ、bdigs_small_rshift() を bary_small_rshift() へ改名しています。 BDIGIT の配列を扱う関数として bary_??? を導入したので接頭語をそれに揃えるようにしているようです。

nobu:r41342 2013-06-17 10:01:07 +0900

Method#to_proc で作った Proc オブジェクトにブロックを渡して call すると、次にブロックを渡さずに call してもまだ block_given? が真になったままになる不具合についてのテストを追加しています。これは修正に先んじてテストを追加していたみたいです。 [ruby-core:54626] [Bug #8341]

nobu:r41343 2013-06-17 10:01:09 +0900

r41342 のとほぼ同様なのですが Symbol#to_proc で作った Proc オブジェクトについても一度ブロックつきで呼び出すとそれが残ったままになって次にブロックなしで呼び出しても block_given? が真になってしまうという不具合についてのテストを追加しています。 [ruby-dev:47438] [Bug #8531]

nobu:r41344 2013-06-17 10:01:12 +0900

r41342, r41343 で追加したテストを修正が完了するまでは skip するようにしています。

ko1:r41345 2013-06-17 11:54:25 +0900

gc.c に gc_mark_maybe() という is_pointer_to_heap() でオブジェクト用のヒープスロットに含まれているポインタかどうかと、T_ZOMBIE 型のオブジェクトではないことをチェックした上で mark する関数を新設して使うようにしています。使っている箇所ではもともと is_pointer_to_heap() によるチェックはしていましたが、T_ZOMBIE のチェックは追加されたチェックのようです。 T_ZOMBIE は sweep 時に T_FILE や T_DATA の free 関数に固有の関数が指定されていた時に実際の解放を次の finalizer 実行後まで遅延する特別扱いをするので、その間のオブジェクトの型として使われるものです。確か finalizer でこれら型のオブジェクトが持つポインタにアクセスする処理を書いてしまっても SEGV しないようにする救済措置として導入されたものだったかと思います。

knu:r41346 2013-06-17 13:33:52 +0900

tool/ifchange の条件文の書きかたを変更しています。多分より汎用的に使えるシェルスクリプトの書きかたにしたのだと思います。
[追記]数値としての比較なのでそれに相応わしい演算子を使うようにしたということっだそうです。コメント欄も参照[/追記]

nagai:r41347 2013-06-17 14:21:16 +0900

拡張ライブラリ tk の修正がいくつか入っています。
まず extconf.rb での 64bit 環境の検出として RUBY_PLATFORM の s390x という環境に対応しています。 [ruby-core:40243] [Bug #5465]
また extconf.rb のパス検出で Mac OS X Lion でのビルドエラーの不具合修正。 [ruby-core:38172] [Bug #5048]
それから Tk::Canvas.create が例外を発生するという不具合の修正のほか、サンブルのコードで例外の捕捉が不足していたのを追加しています。 [ruby-core:54544] [Bug #8319]

zzak:r41348 2013-06-17 14:31:28 +0900

Backtrace#label の rdoc 用コメントにサンプルを追記しています。

kazu:r41349 2013-06-17 14:41:02 +0900

r41345 の ChangeLog エントリの typo を修正。

naruse:r41350 2013-06-17 16:08:00 +0900

test/json/test_json_generate.rb の TestJSONGenerate#test_broken_bignum という大きすぎる整数を JSON 化しようとした時のテストを fork を使って書かれていたのを assert_separately を使って書き変えています。 また TestJSONGenerate#test_gc というテストは assert_in_out_err を使って子プロセスで raise することでテストが書かれていたので assert_separately を使うように書き変えています。

nobu:r41351 2013-06-17 16:59:55 +0900

拡張ライブラリ tk でコンパイラの最適化により必要なオブジェクトのマークが漏れるのを防ぐため文字列化のフォーマット文字列の指示子に %i を使って C 言語の char * の文字列を取り出して使わずに String オブジェクトのまま取り扱うようにしています。 [ruby-core:39000] [Bug #5199]

nobu:r41352 2013-06-17 17:08:25 +0900

common.mk の依存関係の変更。 loadpath.o の依存関係から revision.h を削除しています。 また dmyloadpath.o というロードパスの変数のみ保持するオブジェクトファイルの依存関係はソースファイルのみにしています。

eregon:r41353 2013-06-17 17:39:39 +0900

gc.c の ObjectSpace.define_finalizer の rdoc 用コメントのサンプルコードがトップレベルに include ObjectSpace するように書かれていたので特異メソッドを使う書きかたに変更しています。

eregon:r41354 2013-06-17 17:44:56 +0900

gc.c の ObjectSpace 用の rdoc コメントで Document-class ではなく Document-module を使うようにしています。また ext/objspace/objspace.c での ObjectSpace の rdoc 用コメントでも Document-module を使って対象のモジュールの明示するようにしています。 これはどうやら ext/objspace/objspace.c の RDoc でのパースが失敗することの対策みたいです。 [ruby-core:55525] [Bug #8537]

eregon:r41355 2013-06-17 18:16:32 +0900

拡張ライブラリ objspace の rdoc コメントで require "objspace" が必要な旨を追記しています。また RDoc が ObjectSpace を認識できるようにコメントアウトした状態で rb_define_module() を呼ぶコードを追加しています。どっちかというとこっちのほうが RDoc のパースエラー対策の本命でしょうか。 [ruby-core:55525] [Bug #8537]

naruse:r41356 2013-06-17 19:24:48 +0900

test/ruby/envutil.rb の invoke_ruby で stdin のパイプに書き込むのは書きこむデータが空でない時だけにしています。空でも書き込めるかどうかのチェックはしてしまいそうな気がするのでブロックを防ぐためとかでしょうか。と思ったら、どうやらこの変更は r41350 の TestJSONGenerate のテストで assert_separately を使うようにした時にタイムアウトしていたのを修正しているようです。

akr:r41357 2013-06-17 20:56:21 +0900

r41352 で loadpath.o から revision.h の依存関係を削除したので loadpath.c で RUBY_REVISION を定義するようにしています。 RUBY_REVISION が未定義だと version.h から revision.h が #include されてしまうため。

akr:r41358 2013-06-17 20:56:53 +0900

r41357 のインデント修正のみ。

ktsj:r41359 2013-06-17 21:38:52 +0900

r41342 で先行してテストが追加されていた Method#to_proc で Proc オブジェクト化したメソッドにブロックを渡して call するとブロックが残ってしまう不具合を修正しています。 [ruby-core:54626] [Bug #8341]

ktsj:r41360 2013-06-17 21:47:26 +0900

r41343 で先行してテストが追加されていた Symbol#to_proc で Proc オブジェクト化したものにブロックつきで call を呼び出すとブロックが残ってしまう不具合を修正しています。 すごく似た現象でしたけど両者にそれぞれ別の対応が必要だったんですね。 [ruby-dev:47438] [Bug #8531]

ktsj:r41361 2013-06-17 22:18:54 +0900

r41359 のためのテストの skip を削除しています。