ruby-trunk-changes r50409 - r50416

今日は Hash リテラルのキーにクオート付き文字列を使う記法で %q,%Q 記法を使えないようにする文法上の修正と、異なるバージョンの ruby 用にビルドされた拡張ライブラリをロードしようとしたらエラーにするための変更などがありました。

nobu: r50409 2015-04-30 23:36:19 +0900

2.2 から Hash リテラルのキー部分に { "key": 0 } のようにクオート付きの Symbol キーの記法が利用できるようになりましたが、この文字列部分に %q{} とか %Q{} のような%記法のクオートは利用できないようにしています。これまで %Q"" のようなクオート記号を使った %q,%Q 記法のみキーの部分に使えていたようなのですが、あまり意味がないので %q,%Q 記法自体を禁止するようにしています。

nobu: r50410 2015-05-01 13:29:20 +0900

拡張ライブラリのロード時に呼び出すエントリポイントの関数名の prefix が _Init_ か Init_ かの分岐を消し、export される symbol の prefix を保持する EXPORT_PREFIX を利用するようにしています。

svn: r50411 2015-05-01 13:29:33 +0900

version.h の日付更新。

nobu: r50412 2015-05-01 13:30:26 +0900

拡張ライブラリのロード時に ruby_xmalloc() のシンボルのアドレスを ruby 本体のものと比較して、異なっていたら別のバージョンの ruby 向けの拡張ライブラリなのでロード失敗させるようにしています。
これは若干背景があって、rvm の機能で環境のバージョンを変更する機能があるそうで、その時に既存の拡張ライブラリのパスが通ったままになるので古い(別の)バージョンの ruby 用にビルドされた拡張ライブラリがロードされて SEGV するという現象の報告がよく来るので、別の拡張ライブラリの対象のバージョンをチェックして弾きたいという動機が前々からありました。その方法として ruby_xmalloc() を調べるというのを使っているようです。これって libruby.so を利用している場合のみ有効なのかなぁ。

nobu: r50413 2015-05-01 13:41:27 +0900

r50412 では OS X の場合は dlclose(3) が SEGV するということで dlclose(3) をスキップさせてましたが、そもそも開いたままだと問題があるので(SEGV する?)その場で rb_fatal() でバージョン不一致として異常終了させるようにしています。

nobu: r50414 2015-05-01 15:46:59 +0900

r50410 で EXPORT_PREFIX というマクロが必須になったので Windows 環境向けに win32/Makefile.sub で生成する config.h にその定義を追加するようにしています。が空白になってますね。

nobu: r50415 2015-05-01 15:57:17 +0900

r50414 の再修正。 Windows 環境では EXPORT_PREFIX は "_" に定義するようにしています。

nobu: r50416 2015-05-01 16:27:03 +0900

r50410 および r50414, r50415 を revert して、EXPORT_PREFIX のかわりに、拡張ライブラリのエントリポイントの関数名を作るところで元のようにプラットフォームから判定して EXTERNAL_PREFIX を作るようにしています。 EXPORT_PREFIX は extern したシンボルにつく prefix でここで欲しいものとは違うんだそうです。そうなのか…。