ruby-trunk-changes r30054 - r30070

今日もたくさんのコミットがありました。mkmf.rb の新メソッド convertible_int とか StringIO のマルチバイト文字の扱いの不具合修正などが主なところです。
今週末はたくさんの Rubyist が札幌に集結していまごろ前夜祭でキャッキャウフフしていることでしょうが、ruby-trunk-changes は平常運転です。ルサンチマン

usa:r30054 2010-12-02 23:06:54 +0900

r30012 で余計なメッセージ抑制のために -nologo オプションをつけたのですが rx.exe の新しいバージョンじゃないと -nologo に対応していないためバージョンチェックするようにしています。

shyouhei:r30055 2010-12-02 23:58:41 +0900

NEWS に新API ruby_vm_at_exit() について追記しています。
また ruby_vm_at_exit() によって登録されたフック関数の実行位置を変更して、呼び出しの順番を登録の逆順にしています。

naruse:r30056 2010-12-03 02:40:10 +0900

encoding.c で free() を利用していたところを xfree() を使うように修正。

svn:r30057 2010-12-03 02:40:11 +0900

version.h の日付更新。

naruse:r30058 2010-12-03 02:40:13 +0900

正規表現コンパイル時にエンコーディングが決まっていない時に US-ASCII のエンコーディングをセットしていたのをやめています。正規表現内に ASCII 文字しかない時でもエンコーディングが script encoding と一致するように……しかしこの変更はすぐに revert されています。

naruse:r30059 2010-12-03 04:19:44 +0900

直前の r30058 を revert しています。

naruse:r30060 2010-12-03 04:19:47 +0900

エンコーディングエイリアス名の登録を行なう enc_alias_internal の返り値を char * に変更して st_table の追加を st_insert() から st_insert2() を利用するように変更しています。
st_insert() と st_insert2() の差は何かなーと見てみますと、st_insert2() は渡した key を実際に追加する直前に引数に渡した関数ポインタを使って複製させるようになっているので、これで不要な strdup の呼び出しを削れたということですね。

nobu:r30061 2010-12-03 06:45:49 +0900

変数の型をちょっと修正。ruby_vm_at_exit() で登録したフック関数呼び出しのループカウンタを int から long へ。

akr:r30062 2010-12-03 06:53:08 +0900

本日のかっこでくくってない関数マクロの引数の修正。compile.c でした。

nobu:r30063 2010-12-03 07:08:45 +0900

StringIO にマルチバイト文字列を渡してそこから read(1) とかすると、エンコーディングを無視して 1バイトだけ読めてしまう不具合を修正。[ruby-dev:42674]

nobu:r30064 2010-12-03 12:17:22 +0900

特異クラスを定義してそこで可視性を protected に変更されたメソッドを同じクラスの別のオブジェクトから呼ぶとエラーになる不具合を修正。protected のメソッドはそのメソッドが定義されているクラスと呼び出し元のself が is_a? 関係にないといけないので、特異クラスのメソッドの時は superclass (つまり元のクラス)を判定に使うようにしています。……これ Module を extend されたオブジェクトの場合は super が Module (正確には Module への参照である IClass)になるからここはさらに辿ったほうがいいんじゃないかなーと思って実験してみました。

module M
end
class A
  def meth
    :called
  end
  def test
    a = dup
    a.extend M
    class << a
      protected :meth
    end
    a.meth
  end
end

o = A.new
p o.test

実行結果

test_protected.rb:11:in `test': protected method `meth' called for #<A:0x82de440> (NoMethodError)
        from test_protected.rb:19:in `<main>'

よーしパッチ送っちゃうぞ。

[追記]この修正は元々特異クラス内で protected にしたら呼べないというのが仕様通りということで revert されています。次の日の r30074 を参照してください。[/追記]

shyouhei:r30065 2010-12-03 12:53:21 +0900

rb_objspace_free で ObjectSpace の解放(現状ではプロセス終了時?)する時に全てのオブジェクトをきちんと解放するようにしています。これもマルチVMになった時に VM 解放で拡張ライブラリで確保しているリソースの解放がきちんと行なわれるようにするための布石だろうと思います。また ruby_vm_destruct で ruby_vm_t のメモリ解放は rb_objspace_free の後にするようにしています。
マルチ VM の登場は近づいているのでしょうか。

usa:r30066 2010-12-03 12:56:21 +0900

win32/Makefile.sub rc.exe の -nologo オプションをつけるのは $(MSC_VER) >= 1600 の時(コメントによると
VC10 and after)にしています。コミットログでは r30015 の修正と書いてありますが多分 r30012 のことですね。 [ruby-core:33530]

nobu:r30068 2010-12-03 19:48:12 +0900

mkmf.rb の check_sizeof が常に Integer を返すように修正。

nobu:r30069 2010-12-03 19:53:53 +0900

mkmf.rb に convertible_int というメソッドが追加されています。型名を渡すとそれを基本型で表現した型の文字列を返してくれます。実装はけっこうゴツいので深追いしていませんが、ちょっと irb で実行してみたら、これおもしろいというか便利ですね。

>> require "mkmf"
=> true
>> convertible_int("size_t")
checking for convertible type of size_t... unsigned int
=> "unsigned int"
>> convertible_int("pid_t")
checking for convertible type of pid_t... int
=> "int"
>> convertible_int("FILE")
checking for convertible type of FILE... failed
=> nil

整数型で表現できない型の時は nil になるようです。

nobu:r30070 2010-12-03 20:23:48 +0900

convertible_int で型の printf 用の指示文字の prefix のマクロまで生成するようにしています。