ruby-trunk-changes r42837 - r42847

今日は Bignum での GMP 利用の拡大や "foo"f の frozen string literal の同じ文字列はオブジェクトを使いまわすようにする変更などがありました。

akr:r42837 2013-09-05 02:21:43 +0900

bignum.c のrb_big_divrem_normal() の引数 x、y に RB_GC_GUARD() を追加しています。引数って関数から戻るまではスタックに乗るんじゃないんでしょうか、と思ったけど引数が全てスタック渡しになるとも限らないですね……。

naruse:r42838 2013-09-05 03:46:16 +0900

OpenSSL::Buffering#read_nonblock の except キーワード引数の追加で読み込めない時に例外発生させないようにする修正から OpenSSL のテストが失敗していた件について、片側を close してもそれが伝わって反対側のソケットからの読み込みで EOFError が発生するまでタイムラグがあるため少し sleep を入れています。 [ruby-dev:47660] [Bug #8831]

akr:r42839 2013-09-05 06:23:21 +0900

bignum.c の bary_divmod_normal() の中間バッファを必要に応じて(qds と rds が渡されているかどうかによる)2本確保されていたのを、両方あわせて1つの領域として確保するようにして、中間バッファの確保用のオブジェクトを1つですませるようにしています。

akr:r42840 2013-09-05 08:22:27 +0900

Bignum の除算処理も GMP が利用可能な時に大きな数は GMP を利用した実装を使うようにしています。 mpz_fdiv_q()、mpz_fdiv_r()、mpz_fdiv_qr() などの関数を利用するようにしています。

charliesome:r42841 2013-09-05 10:44:36 +0900

r42822 のメソッドキャッシュの階層化で導入したクラスに持たせる連番を使って、インスタンス変数のインラインキャッシュでクラスとVM全体のバージョンでチェックしていたキャッシュの有効性をクラスの連番のチェックを使うように変更しています。

mrkn:r42842 2013-09-05 12:50:07 +0900

r42817 で SOLIBS に libgmp を追加しようとしたところで GMP が利用可能でない時も libgmp を追加してしまっていてビルドに失敗していたのを修正しています。

charliesome:r42843 2013-09-05 13:49:16 +0900

r42773 で導入された "foo"f という構文での freeze した文字列オブジェクトを返すリテラルで、同じ内容の文字列だとオブジェクトの実体もインタプリタで1つだけ持っておいて同じものを参照するようにしています。 freeze したオブジェクトってそういえば解凍できないんでしたっけ?
ただこの実装だと比較に rb_str_cmp() を使っているため ASCII 互換なエンコーディング同士で同一の文字列と判定されてしまうため、スクリプトエンコーディングが異なるスクリプト内で同じ文字列の "foo"f のようなリテラルが書かれていると、後から呼ばれたほうが本来と異なるエンコーディングを持つ文字列オブジェクトを返してしまっています。 [ruby-core:57037] [Bug #8866]

drbrain:r42844 2013-09-05 14:02:17 +0900

標準添付ライブラリ optparse.rb で OptionParser#on の最後の引数でオプションの引数として受け付ける値として整数を指定する時のチェックの正規表現が文字終端を指定しないものだったため不正な文字も受け付けていたことや、整数化に to_i を使っていたため常に 10進数として解釈されていたので prefix に応じて 2進数、8進数、16進数などの表記も正しく整数化できるように Integer() を使うように修正しています。[ruby-core:57024] [Bug #8865]
これは元々からですが Float を変化するのに eval() を使ってるんですが Float() じゃだめなんでしょうか。

nobu:r42845 2013-09-05 14:04:00 +0900

r42844 で新規追加されたテストのファイルの svn property を設定しています。

nobu:r42846 2013-09-05 17:25:56 +0900

r42843 の "foo"f リテラルの文字列オブジェクトの共有化で元々リテラルの AST が持っている文字列オブジェクトを freeze しておくことで不要な複製を抑制しています。また関数にローカル変数へのポインタを渡す時にキャストして渡すのを避けてローカル変数の型を合わせるように修正しています。

charliesome:r42847 2013-09-05 18:07:48 +0900

r42843 の "foo"f のようなリテラルの共有化でエンコーディングが完全に区別されていなくて、スクリプトエンコーディングと異なるエンコーディングを持つ文字列を返してしまうことがあった不具合を修正しています。 fstring_cmp() というエンコーディングも完全に一致していることを確認する比較関数を定義してこれを使うようにしています。 [ruby-core:57037] [Bug #8866]