ruby-trunk-changes r44562 - r44574

今日は RubyVM::InstructionSequence.load に小さなメモリリークがあったのを修正したり、拡張ライブラリ tk のビルドの修正がありました。

nobu: r44562 2014-01-12 09:21:37 +0900

include/ruby/util.h にビット数を渡して10進数表記した時の桁数を返すマクロ DECIMAL_SIZE_OF_BITS() を追加して昨日 r44558 で修正した BigMath.log のバッファサイズ決定や、その他にも iseq.c でも利用するようにしています。 ceil(n * log10(2)) の近似値ってことで一次式 (((n) * 3010 + 9998) / 9999) が利用されています(n <= 65536)。

svn: r44563 2014-01-12 09:21:42 +0900

version.h の日付更新。

nobu: r44568 2014-01-12 16:41:10 +0900

RubyVM::InstructionSequence.load で ISeq のタイプを判定するテーブルがキャッシュされずに毎回使い捨てられていたので ATOMIC_PTR_CAS() を使って static 変数に残しておくようにしています。 [ruby-core:59699] [Bug #9399]

nobu: r44569 2014-01-12 16:49:26 +0900

RubyVM::InstructionSequence.load で ISeq の type をシンボルから内部の定数に変換するのを st_table を使っていたのを、数が小さいので iseq_type_from_id() という関数を導入して単純に if 文を並べて線形探索するようにしています。

nobu: r44570 2014-01-12 17:11:32 +0900

拡張ライブラリ tk で create_ip_exc() という関数に渡すメッセージのフォーマット文字列に動的な文字列をそのまま渡していたのでフォーマット "%s" を渡してそこに埋め込むように修正しています。

nobu: r44571 2014-01-12 17:11:34 +0900

拡張ライブラリ tk で動的にリンクする libtcl と libtk の名称を snprintf() で生成していたのを文字列リテラルの連結を利用してコンパイル時に生成するようにしています。

nobu: r44572 2014-01-12 17:11:36 +0900

拡張ライブラリ全体的に、snprintf(3) などのライブラリ関数で文字列を生成しているところは rb_sprintf() や rb_vsprintf() を利用して、特に文字列埋め込みの代わりに PRIsVALUE を使って VALUE をそのまま埋め込むようにしています。 gem 配布されてるやつは PRIsVALUE がないバージョンにもっていけなくなるかなと思いましたが、fiddle くらいかな。

nobu: r44573 2014-01-12 17:20:39 +0900

r44558 で修正した BigMath.log のテスト(r44561 で追加)を再修正して FloatDomainError が発生したプラットフォームでは無視するようにしています。また BigMath.log の結果が Float::INFINITY になった場合も無視するようにしています。

nagai: r44574 2014-01-12 18:04:06 +0900

拡張ライブラリ tk の extconf.rb で --with-tcllib と --with-tklib というオプションの指定がうまく反映されていなかった不具合を修正しているようです。 [ruby-core:59483] [Bug #9348]