ruby-trunk-changes r38557 - r38577

今日は Bignum のビット演算で coerce するようになる変更や、IO などの lines, bytes, chars, codepoints などのメソッドの deprecated 化、RubyGems 2.0.0.preview3 へのアップデート、Thread.async_interrupt_timing の Thread.handle_interrupt への改名などがありました。

nobu:r38557 2012-12-22 23:59:21 +0900

rb_compile_error(), rb_compile_warn(), rb_compile_warning(), rb_warn(), rb_warning() などのメッセージ出力する関数のフォーマット文字列にも %PRIsVALUE で文字列として String オブジェクトを渡す指示子が利用できるようにしています。こうすることで文字列オブジェクトから RSTRING_PTR() で C の文字列を使うために RB_GC_GUARD() を使うことを避けることができます。

nobu:r38558 2012-12-23 00:04:57 +0900

NameError で変数名、定数名やメソッド名に "\000" など unprintable な文字列が含まれていた時に C の文字列として埋め込んでいたため表示されなかったりしたのを QUOTE() および QUOTE_ID() というマクロを定義して、表示できない文字を含む文字列は inspect した結果を埋め込むように修正しています。 [ruby-dev:46749] [Bug #7574]

svn:r38559 2012-12-23 00:05:01 +0900

version.h の日付更新。

mrkn:r38560 2012-12-23 00:06:22 +0900

整数のビット演算で coerce を呼んで引数を適切に変換して処理するようにしてるようです。 rb_num_coerce_bit() という API が追加されています。 [ruby-core:39491] [Bug #1792]
ちなみに修正前の bit_coerce() という関数(実際には coerce してなくて引数のチェックしているだけ)は while 文の中で rb_raise() で例外発生だけしているという実質 if 文として使われていて不思議でした。

zzak:r38561 2012-12-23 01:36:30 +0900

OptionParser の rdoc のサンプルコードでブロックパラメータとその外のローカル変数が被っているものを修正しています。 [ruby-core:47460] [Bug #6997]

nobu:r38562 2012-12-23 01:53:12 +0900

拡張ライブラリ dl の ext/dl/callback/callback.c を common.mk の SRCS_EXT 変数に含めています。どうやらこれは自動生成するソースを指定するもののようです。

knu:r38563 2012-12-23 02:22:04 +0900

IO, ARGF, StringIO の #lines, #bytes, #chars, #codepoints と Zlib::GZipReader, ARGF の #lines, #bytes を deprecated にして警告を出力するようにしています。 [ruby-core:45963] [Feature #6670]

drbrain:r38564 2012-12-23 09:35:09 +0900

RubyGems を 2.0.0.preview2.2 から 2.0.0.preview3 へアップデートしています。 rubygems の --doctor オプションと --dry-run オプションの追加や不具合修正などがあるようです。差分大きいので内容はパス。

nobu:r38565 2012-12-23 14:35:15 +0900

関数マクロ BLOCKING_REGION() の fail_if_interrupted が偽の時(つまり rb_thread_call_without_gvl() 経由で呼ばれる時) blocking_region_begin() が常に真を返すためその結果を無視するようにしています。よくわかりませんがコンパイラの警告を除去するのが目的のようです。

nobu:r38566 2012-12-23 14:43:04 +0900

marshal.c で TYPE() でオブジェクトの型を判定しているところを RB_TYPE_P() を使うように書きかえています。

zzak:r38567 2012-12-23 14:52:50 +0900

Regexp#=== の rdoc に =~ と同じと書かれていたのを修正しています。戻り値が違うんですね。 [ruby-dev:46746] [Bug #7571]

nobu:r38568 2012-12-23 15:05:50 +0900

rb_obj_respond_to() によるメソッド有無のチェックとメソッド呼び出しをセットにした rb_check_funcall() にさらにメソッド呼び出し前に実行するフック関数を指定できるようにした rb_check_funcall_with_hook() を新設して、marshal.c で利用しています。

nobu:r38569 2012-12-23 15:21:49 +0900

ext/zlib/zlib.c の rb_gzreader_lines() で関数名を間違っていて存在しない関数を呼ぼうとしていたのを修正。

zzak:r38570 2012-12-23 15:25:22 +0900

irb に %i と %I によるシンボルの配列のリテラルの対応を追加しています。 [ruby-core:49550] [Bug #7392]

nobu:r38571 2012-12-23 15:34:56 +0900

r34090 で goruby (code golf 用にカスタマイズされた ruby)に標準入力が端末の時に irb を立ち上げるようにしましたが、これを END ブロックを利用するようにしています。 goruby の初期化の後で irb が立ち上がるようにしているとのこと。

zzak:r38572 2012-12-23 16:07:18 +0900

lib/erb.rb の rdoc 用コメントに ERB.new の trim_mode("-")について追記しています。 [ruby-core:51084] [Bug #7608]

zzak:r38573 2012-12-23 16:13:07 +0900

lib/erb.rb の rdoc 用コメントでメソッド名の表記の間違いを修正しています。
クラスメソッドを ERB::new としているんですけど ERB.new のほうが最近は一般的な気がします。

nobu:r38574 2012-12-23 17:57:22 +0900

標準添付ライブラリ lib/profiler.rb で set_trace_func のかわりに TracePoint を利用するようにしています。

nobu:r38575 2012-12-23 17:57:27 +0900

標準添付ライブラリ lib/profiler.rb で BasicObject のインスタンスの特異メソッドが呼ばれた時に TracePoint だとその特異クラスが渡されるので、それに起因した問題の対処をしているのだと思いますが、なにが起きてたのかよくわからないので勘違いかもしれません。 Profiler__::Wrapper という Struct のインスタンスを継承したクラスを作って、メソッドの定義クラスとIDをこの Wrapper に包んで利用するように変更しています。

nobu:r38576 2012-12-23 17:57:32 +0900

標準添付ライブラリ lib/profiler.rb で複数の Thread で利用したとこのことを考慮してプロファイルデータを Thread 毎に分離して持つようにしています。 [ruby-core:22046] [Bug #1152]

ko1:r38577 2012-12-23 19:18:58 +0900

Thread.async_interrupt_timing を Thread.handle_interrupt に改名し、Thread.async_interrupted は Thread.pending_interrupt? に改名しています。また Thread.handle_interrupt で受け付けるモードの引数の :defer は :never に(再び)改名しています。 [ruby-core:51074] [Feature #6762]
これにより内部的な関数名や構造体メンバの名称も変更になりました。 async_errinfo_queue も pending_interrupt_queue になったので、こういう場合変更前に書いた ChangeLog の説明も追随したほうがいいのかなぁ…。