4/12にJRuby 1.6.1がリリースされました。
このblogでは、1.6.0のリリースの紹介はしていませんでした。1.6.0の概略については、この記事にあるプレゼンを参照してください。
1.6.1は、1.6.X系列初のメンテナンスリリースで、全てがバグ修正です。1.6.0をリリースして一ヶ月、集まったバグ報告の中から、互換性に関する問題を中心に対処されています。「せっかくJRubyを試したのに互換性がない!」という声には弱い、というところでしょうか。などと偉そうに書いていますが、1.6.1での修正については私は一切絡んでいません。ここしばらく、JRuby以外のことばかりやってました。
それでは以下、修正点です。
実行環境
- JRUBY-5285 jruby-complete.jarを利用していた場合、jruby -Sによるスクリプト実行で、$JRUBY_HOME/binが検索されていなかったのを修正。irbやrakeの呼び出しでコケていました。
- JRUBY-5607 JRUBY-5609 rubygems mavenサポートのバグ修正。rubygems mavenサポートはまだexperimentalです。
- JRUBY-5608 1.6.0で、IBMのJ9 VMで動かなくなっていたのを修正。
- JRUBY-5651 1JVM内で、複数のRuby VMを同時生成したときにJavaプロパティへのアクセスで例外になっていたのを修正。
CRuby互換性
- JRUBY-2126 JRUBY-2488 JRUBY-4791 irbで、入力済み文字上でのCtrl-D(1文字削除)が効くようにしました。また、irbで1行入力するたびに6 fdがリークしていた(ただしGCでは回収される)のを修正。Javaでのreadline実装である、JLineを更新しました。どうやらCharlesがJLineのメンテナに加わったようです。
- JRUBY-5591 NKFで短い文字列を変換すると、NullPointerExceptionが発生していたのを修正。
- JRUBY-5596 nonblocking readでは、EAGAIN例外が多発します。JRuby 1.6では、スタックトレース保持方法の変更により、通常動作は高速に動作し、例外発生時(バックトレース生成時)に多少遅くなりました。結果として、1.6.0でnonblocking readを利用すると遅くなっていました。EAGAINは通常リトライのために用いられ、バックトレースは利用されないことが多いことから、EAGAIN発生時にデフォルトではバックトレースを生成しないように変更しました。
- JRUBY-5610 TCPSocket#accept_nonblockの修正。たぶん一度も動いたことがなかったものです。nonblock系はもう少し気合を入れて書き直さないといけません。
- JRUBY-5627 read openしたファイルにLOCK_EXでflockした時に、LOCK_SHとしてlockを取っていたのを修正。JVMではOSに寄らず例外です(なのでこれを回避する目的でLOCK_SHにしていた)。CRubyではOS依存で、Solarisだと例外。Railsがこれを使ってしまっていたので、Rails側にも修正を依頼しました(read openしたものをLOCK_EXしないように)
- JRUBY-5634 File.newに渡すオブジェクトがto_intを実装していた場合(例えば__FILE__)に、間違ったファイルを開こうとして刺さっていたのを修正。
- JRUBY-5640 Dir#pos=に負の値を与えた場合には何もしないように変更。
- JRUBY-5687 Process::Status#exitstatusの値が間違っていたのを修正。
- JRUBY-5688 Process::Status#pidを実装。
- JRUBY-5694 DATAをrootファイルでしか初期化していなかったのを、CRuby同様、ファイル読み込み毎に再初期化するように修正。
- JRUBY-5604 jruby -vの表示中のCRubyバージョン表示形式を、CRubyにあわせました。
- JRUBY-5629 バックトレースのmodule/class名表示方法をCRubyにあわせました。
- JRUBY-5637 Exceptionインスタンスがsingleton classを持っている時のデフォルトの例外メッセージがCRubyと異なっていたのを修正。
Java連携
- JRUBY-5597 byte配列に128以上の値を代入できなくなっていました(1.5ではできた)。ubyte_setというメソッドを追加。
- JRUBY-5602 Dir.globでjarに固められたディレクトリの一覧を取得しようとするとエラーになっていたのを修正。
- JRUBY-5649 プロファイラが使うJavaクラスのimportメソッドが、Rakeの同名メソッドと衝突していたのを修正(java_importに)。
C拡張
- JRUBY-5044 JRubyでは、ある条件でsystemコマンドをインプロセスの別Ruby VMで実行します。特にrakeで多く使われます。cextを読み込んでいる場合、複数のVMでcextを読み込もうとして発狂するので、cextを読み込んでいる場合にはインプロセスでのsystem実行を禁止しました(別プロセスで実行します)
- JRUBY-5598 JRUBY-5601 JRUBY-5606 Solarisでもcextをbuild、利用できるようにしました。
- JRUBY-5628 FFI APIの修正。
- JRUBY-5690 cextで参照したmodule/classが、Java側でまだ使っているにもかかわらずGCされてしまう問題を修正。ただし「module/classはGCしない」という対処なので、今後問題になりそうです。
1.9モードの互換性
- JRUBY-5396 YAML解析のバグ修正(CRuby側で修正してJRubyに持ってきた)。
- JRUBY-5590 irb/completionを利用した場合、Java classのメソッド補完をしようとするとエラーになっていたのを修正。
- JRUBY-5624 Class.newに渡したブロックのselfが間違っていたのを修正。
- JRUBY-5632 to_aを持つオブジェクトに対するsplat演算子の挙動を修正。
- JRUBY-5641 Stringの行モード読み込みが壊れていたのを修正。
- JRUBY-5646 RubyString.newUnicodeString(Java拡張用API)の設定するencodingが間違っていたのを修正。
- JRUBY-5648 overrideしたメソッドのsource_location(1.9から)が間違っていることがあったのを修正。
- JRUBY-5680 Kernel.bindingでの"self"のeval結果がCRubyと異なっていたのを修正。
- JRUBY-5682 YAMLの解析エラー時に上げる例外が間違っていて、Bundlerが正しく動いていなかったのを修正。
- JRUBY-5686 -> operator(stabby演算子)の解析に失敗することがあるのを修正。
- JRUBY-5693 **の結果がFixnum範囲にもかかわらずBignumとして返ることがあったのを修正。
- JRUBY-5705 open3ライブラリの修正。
1.6.0のリリースに伴い、「C拡張対応」「1.9対応」(実際は、いずれもexperimental: 実験的ステータス)を謳ったためか、今までJRubyを使ってなかったユーザさんが多く試してくれています。おかげで上記「CRuby互換性」に書いたような、細かいバグ修正が増えた、というところでしょうか。
C拡張と1.9対応についてはバグが出始めて、今後の開発も進みそうです。ていうかお前がやれ、という感じですが。1.9はRuby Spec側の整備も道半ばなので、Ruby Specが通ったとしても、上記のような大きめな問題がごろごろ残っています。また並行して、新中間表現の開発も進んでいますが、こちらはRubyとしての機能には無関係なので、ユーザに見えるような変化は(まだ)ありません。
1.6.1のリリースの後、1.6.Xのメンテナンス用ブランチが作られました。私が作ったMersenneTwister対応など、大きめな開発ブランチもマージできそうです。少しまたJRubyの開発に戻りたいと思います。


