ruby-trunk-changes r42295 - r42309

今日は主に bignum.c の Bignum 文字列化まわりのリファクタリングと最適化がありました。

akr:r42295 2013-08-01 01:20:26 +0900

bignum.c の rb_big2str1() から利用している power_cache_get_power() のリファクタリング再帰呼び出し用の関数とそのエントリポイントの関数をマージしてまとめています。昨日あたりから変更が行なわれているこの関数は基数の累乗はよく使うのでテーブルにキャッシュしておいて繰り返し計算しなくて良くするようにしているものみたいです。

nobu:r42296 2013-08-01 01:21:11 +0900

r42295 の行末の空白除去。

knu:r42297 2013-08-01 01:34:56 +0900

r42263 の ChangeLog エントリの typo 修正。

akr:r42298 2013-08-01 01:48:08 +0900

bignum.c の big2str_orig() に引数 x (Bignum) の BGIDIT 配列長についての assert() 文を追加、また big2str_karatsuba() で累乗を得るのにキャッシュつきの関数を使わない条件として power_level == 0 の時としていたのを負の数の時と変更しています。

nobu:r42299 2013-08-01 04:05:17 +0900

RDoc::Markup::PreProcess#include_file のテストを追加しているのですが、どうも setup の変更が他のテストに影響がないのか、このテストがなぜ成功するのかなんともよくわからないです。存在しないファイルを include_file しようとしているように見えますが。

nobu:r42300 2013-08-01 04:06:21 +0900

Rdoc#finish で root path を include_file のサーチパスに追加するようにしています。 以前移動した sample/curses/*.rb が rdoc 生成時に include できなくなったのを修正しているようです。 [ruby-core:56282] [Bug #8712]

akr:r42301 2013-08-01 06:33:14 +0900

bignum.c の big2str_orig() で x のサイズが 2以下に決まったことにより、前処理のネストしたループをシンプルな条件分岐とループにリファクタリングしています。

akr:r42302 2013-08-01 07:38:53 +0900

bignum.c の big2str_orig() でマシンスタック上に一時的バッファを取って、trim モードの場合に最終的に必要な部分だけコピーするようにしています。 メリットがよくわかりませんが、渡されるバッファのサイズに依存しなくなるということでしょうか。

akr:r42303 2013-08-01 12:43:14 +0900

Bignum の文字列化処理用の構造体 struct big2str_struct にさらにメンバーを追加して、trim を真で呼ばれた時に結果の文字列のメモリを呼び出された関数内で確保できるようにしています。あらかじめ充分なサイズのバッファを保持しておく必要がなくなって効率的になるのかと思います。

nobu:r42304 2013-08-01 12:46:12 +0900

r42303 の ChangeLog のエントリの行末の空白除去。

akr:r42305 2013-08-01 19:19:23 +0900

rb_big2str1() から trim 引数を削除し、常に trim が真の時のモードで動くように変更されています。そして rb_big2str1() のただのラッパーになっていた、既に deprecated にマークされている rb_big2str0() に trim なしモードの時の後処理を追加しています。内部的に利用しているところでは trim なしモードでの利用はなかったようです。

akr:r42306 2013-08-01 20:48:42 +0900

power_cache_get_power() でキャッシュされる基数の累乗の Bignum オブジェクトを struct RBasic::klass を 0 にして ObjectSpace から隠すようにしています。

akr:r42307 2013-08-01 21:05:04 +0900

bignum.c の rb_big2str1() で、大きすぎて変換できない x が渡された時に RangeError を発生させるようにしています。

glass:r42308 2013-08-01 22:32:06 +0900

r42269 で String#rindex を最適化した時に不要なコメントアウトされた文が残っていたのを削っています。

akr:r42309 2013-08-01 23:34:59 +0900

bignum.c の rb_cstr_to_inum() で Bignum の文字列化と同様に基数の累乗が再利用できるので、文字列からの Bignum 化でも power_cache_get_power() を呼ぶようにする最適化を行なっています。