ruby-trunk-changes r41221 - r41230

今日は RSTRING_PTR() や RARRAY_PTR() を使うのを避けるようにする修正や array.c での assert() の間違いの修正のほか bignum.c に新しく rb_integer_pack_2comp() という API も追加しています。

kazu:r41221 2013-06-10 23:54:21 +0900

r41208 で追加した assert() 文で使っていたローカル変数名の typo 修正。やっぱり間違いだったみたいです。 assert() は NDEBUG が定義されていないと消されるので通常は間違っていてもコンパイルできてしまって、array.c では ARRAY_DEBUG が定義されていると NDEBUG を定義するようになっているので、その時にはビルド失敗していました。

eregon:r41222 2013-06-11 05:06:53 +0900

racc の拡張ライブラリ cparse で RSTRING_PTR() を使って String オブジェクトのバッファに直接アクセスしていた部分を rb_ary_entry() や rb_ary_subseq() などの API を使って書きかえています。オブジェクトの内部表現に依存しないようにすることで処理系の高速化などの改造に強くしています。チケットには直接の動機としては Rubinius では RSTRING_PTR() は遅いという理由も書かれています。 [ruby-core:54939] [Bug #8399]

svn:r41223 2013-06-11 05:06:58 +0900

version.h の日付更新。

tarui:r41224 2013-06-11 07:14:27 +0900

eval_error.c で捕捉されなかった例外などのエラーを出力する error_print() の中で errat という Array オブジェクトのバッファのポインタを RARRAY_PTR() で取り出してからそれを後で参照していたのをやめて RARRAY_AREF() を使うようにして RGenGC の shady なオブジェクトになるのを防ぐと共にコンパイラ最適化による GC マーク漏れがおきるのも防いでいます。

zzak:r41225 2013-06-11 12:50:33 +0900

doc/re.rdoc を doc/regexp.rdoc とファイル名を改名しています。

nobu:r41226 2013-06-11 15:57:04 +0900

r41224 で error_print() の errat の参照を RARRAY_AREF() を使うようにしたのですが、複数回 RARRAY_AREF() で配列から要素のアクセスをしていたので、1回参照してそれをローカル変数に格納して使いまわすようにしています。

nobu:r41227 2013-06-11 16:15:24 +0900

ARRAY_DEBUG を定義すると array.c の ary_resize_capa() で assert() 文が ary_make_shared() から呼ばれた時に失敗していたので、ary_make_shared() から ary_resize_capa() を呼び出さずに専用の ary_shrink_capa() という関数を定義してこちらを使うようにしています。 [ruby-dev:47416] [Bug #8510]

knu:r41228 2013-06-11 17:01:38 +0900

README.ja に書いてあった Matz のメールアドレスが間違っていたのを修正しています。

knu:r41229 2013-06-11 17:25:40 +0900

README.EXT.ja の mkmf.rb の pkg_config の説明を最新版に追随するように、より詳しい記述を追加しています。
また lib/mkmf.rb の pkg_config の rdoc 用コメントにも追記しています。

akr:r41230 2013-06-11 21:06:40 +0900

rb_integer_pack() にさらにオーバフロー時の戻り値の返しかたを変更する指定ができる引数 overflow_2comp を追加した rb_integer_pack_internal() として定義するようにして、またオーバフローチェックするパスを追加しています。 また rb_integer_pack_2comp() という overflow_2comp を on にしたバージョンの API も追加しています。数値が -2**(numwords*(wordsize*CHAR_BIT-nails)) の時のオーバフロー判定が異なるようです。
そして sprintf.c の rb_str_format() を2つに分離した API を使い分けて再実装しています。