ruby-trunk-changes r66310 - r66338

今日は ISeq を配列からロードした時に最適化しなおさないようにする変更や、peephole 最適化で ensure 節の命令が空っぽになると無限ループに陥るという不具合の修正などがありました。

nobu: r66310 2018-12-10 21:43:16 +0900

LEGAL に util.c の一部についてのライセンスがそれぞれ別の項目に書かれてたのをまとめて複数のライセンスのものが混ざっているのをわかりやすくしています。

naruse: r66311 2018-12-10 22:58:36 +0900

SolarisOracle Developer Studio 12.4 でコンパイルエラーになるとのことで、rb_inten() マクロ定義の最適化時に HAVE_BUILTIN___BUILTIN_CONSTANT_P だけでなく __extension__ というコンパイラ拡張? が使えることを確認して HAVE_STMT_AND_DECL_IN_EXPR というマクロもチェックするようにしています。Oracle Developer Studio 12.4 で __builtin_constant_p() が追加されたけど、これだけではここで使ってる定義に不十分なので追加したみたいです。 [ruby-dev:50666] [Bug #15293]

naruse: r66312 2018-12-11 00:48:45 +0900

r66311 の再修正。 configure で __extension__ の利用可否を確認する方法を AC_TRY_COMPILE と AC_CACHE_CHECK と AS_IF を使うように書き換えています。 cache という名前からして config.status に情報が残るようにしているのかな。

svn: r66313 2018-12-11 00:48:49 +0900

version.h の日付更新。

duerst: r66314 2018-12-11 08:12:12 +0900

r66300 で対応した Unicode 11.0.0 の Georgian の文字の対応について String#capitalize のテストを追加しています。

odaira: r66315 2018-12-11 08:22:56 +0900

r65834 以降徐々に追加されてきた Fiber の独自 coroutine 実装を ppc64le の Linux 向けの実装を追加しています。

svn: r66316 2018-12-11 08:23:00 +0900

r66315 の新規追加ファイルの svn property 設定。

nobu: r66317 2018-12-11 08:40:14 +0900

NEWS ファイルに flip-flop 演算子の deprecation について追記しています。 https://github.com/ruby/ruby/pull/2047

kazu: r66318 2018-12-11 08:52:59 +0900

NEWS ファイルのエントリの順序を辞書順にソートしています。

naruse: r66319 2018-12-11 08:54:14 +0900

標準添付ライブラリ net/http でヘッダの名前をキーワード引数っぽく書いて Symbol を入れるとそのままキーとして使われてしまうことがあるので、必ず文字列化して格納するようにしています。利用する時にはどうせ文字列化するのでは、と思ったけどつまり Symbol のまま入っていると、後で String で参照したりセットしようとすると本当は同じヘッダなので上書きしないといけないけど重複して入ってしまうため、ということみたいです。なるほど。 [ruby-core:90384] [Bug #15394]

nobu: r66320 2018-12-11 09:05:53 +0900

r66319 の再修正(コミットログの revision は間違ってるというか最後に 7 がついてしまっている)。to_str より to_s を使うようにしています。 to_s はかならずあるけど to_str は NoMethodError になることがあるから? ただ String っぽく使えるものは to_str で暗黙の変換をしてもいいという慣習があるし to_str でも、と思いましたがまあ些細なことです。 [ruby-core:90384] [Bug #15394]

nobu: r66321 2018-12-11 09:36:46 +0900

また r66319 の再修正。 ヘッダーの key を to_s(元は to_str)してから downcase していましたが、先に downcase してから to_str するようにしています。これをもって key が downcase があるオブジェクトであるという前提を入れてるんですね。うーんけどそれだったらやっぱり to_str してから downcase でもいいような。 [ruby-core:90384] [Bug #15394]

duerst: r66322 2018-12-11 09:44:24 +0900

NEWS ファイルの Unicode 11.0.0 の更新で具体的に何が変わったか(grapheme cluster 分割と Georgian の特殊な文字の対応)を追記しています。

hsbt: r66323 2018-12-11 12:07:37 +0900

添付している bundler のバージョンを 2.0.0 系から 1.17 系に戻しています。 Bundler 2.0 で Heroku 上でなにやら問題があって解決に時間がかかりそうなので Bundler 自体の 2.0.0 リリースが間にあわないかもしれないみたいなことのようでした。

nobu: r66324 2018-12-11 13:13:09 +0900

iseq_setup() を前半と後編に分割して前半を iseq_setup_insn() として、rb_iseq_compile_node() と rb_iseq_compile_ifunc() からも iseq_setup_insn() は呼ぶようにしています。たぶんこれはどっちかというと iseq_build_from_ary_body() から元の iseq_setup() が呼ばれてて、配列から load した ISeq に対して最適化が働いてしまうという不具合修正みたいです。

svn: r66325 2018-12-11 13:13:13 +0900

r66324 のインデントのタブを空白に除去。

nobu: r66326 2018-12-11 13:14:31 +0900

ensure 節に 0 if false みたいに最適化によって命令が消えそうな文だけがあるようなスクリプトでは ensure 節の ISeq が空っぽになるため catch table の範囲に ensure 節の先頭が含まれてしまって、VM が同じ位置で無限ループ状態になってしまうというすごい不具合があり、対策として iseq_setup_insn() で ensure 節が(最適化の結果で)空っぽになった時に nop 命令を入れておくようにしています。 ensure が元から空っぽの時は compile 時に明示的に nop を入れてたみたいですが、最適化で消えた後は救えてなかったということですね。 [ruby-core:90332] [Bug #15385]

mame: r66327 2018-12-11 13:26:04 +0900

NEWS ファイルの begin に対する rescue 節なしの else 節は SyntaxError にする変更にチケット番号を追記しています。 [Feature #14606]

nobu: r66328 2018-12-11 13:30:31 +0900

拡張ライブラリ date の struct SimpleDateData および struct ComplexDateData のメンバーの順番を変更しています。packing のため? と思いきやコメントをみると先頭のあたりの並びを Simple と Complex で同一にするためみたいでした。

nobu: r66329 2018-12-11 13:35:13 +0900

拡張ライブラリ date で hour, min, ..., zone などのメソッドを Date の private メソッドとして定義して DateTime では Kernel#public メソッドで public 化するということをなぜかしていたのを、単に DateTime のメソッドとして定義するようにしています。

nobu: r66330 2018-12-11 14:09:34 +0900

たぶん r66329 の変更での NDEBUG が未定義の時(というのはありえないような気がする)の不具合修正。関数名 typo しているというもので、この部分もういらないんじゃないのかな……。

nobu: r66331 2018-12-11 14:09:35 +0900

拡張ライブラリ date のテストで Date.nth_kday? が使える時のテストで __send__ を使ってたのは public になって不要になったので直接メソッド呼ぶようにしています。ただこのメソッドは NDEBUG が未定義の時だけ定義されるメソッドなので通常は動かないテストですね。

mame: r66332 2018-12-11 15:35:40 +0900

doc/contributing.rdoc の Platform Maintainers から IA64 (Linux) のエントリを削除しています。

ko1: r66333 2018-12-11 16:31:23 +0900

NEWS ファイルの空のセクションや重複したセクションを削除しています。

naruse: r66334 2018-12-11 17:44:00 +0900

CentOS 7 でヘッダファイルには open(2) のフラグ O_TMPFILE が定義されているのですが、実際には動かないという問題があったそうで、テストで File::TMPFILE を指定してディレクトリを File.open する時に Errno::EISDIR が発生したら skip するようにしています。

normal: r66335 2018-12-11 18:49:26 +0900

DTrace のテストで assertion のエラー時のメッセージの指定がなかったところを probe の情報を出力するようにしています。 CI のエラー調査のためみたいですね。

normal: r66336 2018-12-11 18:49:31 +0900

DTrace のテストで r66003 の TracePoint.enable へのキーワード引数追加で TracePoint.enable のメソッド定義が prelude.rb に移動したので miniruby で呼べなくなったので、直接 TracePoint.__enable を呼ぶように書き換えています。

naruse: r66337 2018-12-11 19:55:07 +0900

r66334 と同様に rubyspec の open に File::TMPFILE を渡すテストで Errno::EISDIR を無視させるようにしています。

hsbt: r66338 2018-12-11 20:02:41 +0900

bundler の 1.17.2 をマージ。設定の操作の互換性についての修正みたいです。