ruby-trunk-changes r42413 - r42426

今日も bignum.c のリファクタリングと Process.setproctitle と Process.argv0 というプロセス名に関する新規メソッドの追加がありました。

akr:r42413 2013-08-07 07:43:01 +0900

bignum.c の 整数の最下位ビットの位置を返す関数群 nlz16(), nlz32(), nlz64(), nlz128() を nlz_int(), nlz_long(), nlz_long_long() など型のサイズに依存した関数に変更しています。nlz_int128() という関数だけは明示的にビット幅が現われていますね。

svn:r42414 2013-08-07 07:43:06 +0900

version.h の日付更新。

zzak:r42415 2013-08-07 07:46:46 +0900

標準添付ライブラリ rssRSS::Utils の rdoc 用コメントを追加しています。 [Bug #8745]

zzak:r42416 2013-08-07 08:32:42 +0900

拡張ライブラリ openssl の OpenSSL::HMAC の rdoc 用コメントにサンプルを追記しています。 https://github.com/documenting-ruby/ruby/pull/14

zzak:r42417 2013-08-07 09:02:17 +0900

String#== の rdoc 用コメントの説明が古くなっていて to_str で変換できるかチェックすることなどが説明されていなかったので追記修正しています。 https://github.com/ruby/ruby/pull/375
と、言いつつ良く読むと実は結構複雑なことをしていますね。自然言語で書くと str == obj は obj が String でない時(正確には T_STRING 型でない時なので String を継承したクラスの時は String として比較)には、to_str メソッドが呼び出せるかをチェック(respond_to? 相当、実際には呼び出さない)。obj.to_str が呼び出せるなら obj === str を呼ぶ、ということをしている。Ruby で書くとするとこんな感じ。

class String
  def ==(obj)
    unless obj.is_a?(String)
      if obj.respond_to?(:to_str)
        return obj === self
      else
        return false
      end
    end
    str_sql(self, obj)
  end
end

推測するに、to_str を定義しているということはそのオブジェクトは String 相当として振る舞うように実装されているので、== メソッドも String との比較方法を知っているはずだからそっちにまかせよう、ということでしょうか。

ko1:r42418 2013-08-07 12:59:30 +0900

thread.c の thread_start_func_2() で引数を表す配列オブジェクトの読み込み専用のアクセスに RARRAY_PTR() を使っていたのを RARRAY_RAWPTR() を利用して無用な shady 化を抑制しています。

ko1:r42419 2013-08-07 13:20:56 +0900

random.c の random_load() でも配列オブジェクトのアクセスに RARRAY_RAWPTR() を使うようにして無用な shady 化を抑制しています。

ko1:r42420 2013-08-07 16:19:57 +0900

cont.c と proc.c でも引数を表す配列オブジェクトのアクセスに RARRAY_RAWPTR() を使うようにして無用な shady 化を防いでいます。

usa:r42421 2013-08-07 16:39:23 +0900

WEBrick のテストで Windows 環境向けに条件分岐していたところで mswin32 と書かれていたため mswin64 が考慮されておらず英語版 Windows でテストが失敗していたのを修正しています。 [Bug #8746]

usa:r42422 2013-08-07 16:40:28 +0900

r42421 の ChangeLog にチケット番号の参照がなかったので追記しています。

akr:r42423 2013-08-07 19:31:35 +0900

bignum.c の dbl2big() の while ループの条件をシンプルにしています。 POSFIXABLE() は FIXNUM_MAX 以下であることでその否定だから FIXNUM_MAX+1 以上、または long にキャストした時 0 でないってことは 1.0 以上で、u は正の数になるように前処理されているのでいいのか、なるほど。

akr:r42424 2013-08-07 20:08:03 +0900

Bignum#odd?, even? の実装で BDIGIT 配列のサイズ自体が 0 の時に配列の要素を参照してしまっていた不具合を修正しています。 Bignum の 0 なのであまり通常は登場しないとは思いますけど。

knu:r42425 2013-08-07 23:12:04 +0900

$0 への代入によるプロセスの名称(ps で表示されたりするやつ)を設定する機能を Process.setproctitle というメソッド経由でも利用できるようにしています。 [ruby-dev:47548] [Feature #8696]
また Process.argv0 というメソッドの実装も一部追加されていますが、これは次のコミットで入るはずだったっぽいです。

knu:r42426 2013-08-07 23:12:08 +0900

Process.setproctitle や $0 への代入で変更する前の元々のプロセスの名称を返す Process.argv0 というメソッドを追加しています。 [ruby-dev:47548] [Feature #8696]