ruby-trunk-changes r66453 - r66468

今日は Hash リテラルのための Hash オブジェクトを ObjectSpace からアクセスして変更できてしまう不具合の修正や、拡張ライブラリ rexml の更新などがありました。

hsbt: r66453 2018-12-19 21:46:29 +0900

NEWS ファイル内の RubyGems のバージョン記述を更新しリリースノートへのリンクを追加しています。

hsbt: r66454 2018-12-19 21:57:19 +0900

NEWS ファイル内の Psych のバージョンの記述を更新しています。

yuki: r66455 2018-12-20 04:01:02 +0900

gems/bundled_gems の did_you_mean のバージョンを 1.2.1 から 1.3.0 に更新しています。

svn: r66456 2018-12-20 04:01:04 +0900

version.h の日付更新。

normal: r66457 2018-12-20 09:07:19 +0900

r66446 で割り込みタイマーが POSIX timer による実装の時の ubf_timer_destroy() で timer_posix.state を ATOMIC_CAS() でチェックしつつ RTIMER_DEAD に遷移させるようにしたやつの続き。ubf_timer_disarm() で既に timer_posix.state が RTIMER_ARMED になっていた時に timer_settime() で即刻タイマー発火させようとした時に errno=EINVAL で帰ってきた時は main thread で ubf_timer_destroy() が呼ばれた場合があるので rb_bug() で異常終了させていたのを、この条件の時は正常に抜けるようにしています。

kou: r66458 2018-12-20 11:49:10 +0900

拡張ライブラリ rexml を upstream の 3.1.8 に更新しています。不具合修正も含まれているようですね。リリースノートはこちら。 https://github.com/ruby/rexml/blob/master/NEWS.md

kou: r66459 2018-12-20 12:08:57 +0900

r66458 の追加修正。 rexml のテストに require "rexml/document" を追加。

nobu: r66460 2018-12-20 12:51:15 +0900

tool/rbinstall.rb の load_gemspec で .gemspec ファイルを eval してみた時に SyntaxError を無視していましたが、そのまま発生させるようにしています。また評価結果が Gem::Specification クラスのインスタンスでなかったらエラーにするようにしています。

nobu: r66461 2018-12-20 13:03:07 +0900

拡張ライブラリ etc の gemspec ファイルが files のために git コマンドを使っているため git なしでインストールできない不具合の対応。.gemspec ファイル自体をいじるのではなくて tool/rbinstall.rb で `git ...` というのを消しているところが etc.gemspec では %x[] の記法を使っているため削れなかったので、この記法も削るようにしています。 [ruby-dev:50068] [Bug #13423]

kou: r66462 2018-12-20 13:03:10 +0900

r66459 の続きで rexml のテストで require_relative "rexml_test_utils" を追加しています。

nobu: r66463 2018-12-20 14:43:15 +0900

正規表現の名前つき capture で先頭が大文字の時は定数なので代入しないようにしていましたが、このチェックに ISASCII() が含まれてて non-ASCII な文字の大文字始まりの定数は上書きされてしまうのを修正しています。 rb_enc_symname_type() で識別子としてみた時にローカル変数扱いになるかどうかで判定するようにしています。 [ruby-dev:50719] [Bug #15437]
このチケットで例として使われてる大文字の C のようにみえるものは "MATHEMATICAL BOLD CAPITAL C" というものらしい。いろいろあるんですなー。

nobu: r66464 2018-12-20 15:44:50 +0900

r66258 で Hash リテラルを duphash という命令を使って ISeq のオペランドに埋め込まれてる Hash オブジェクトを複製するようにしてましたが、このオペランドの Hash が ObjectSpace.each_object でアクセスして変更してしまえるので、とりあえず freeze するようにしています。 klass=0 にして内部的オブジェクトにしてしまったほうがいいんでしょうけどね。 [ruby-core:90629] [Bug #15440]

nobu: r66465 2018-12-20 15:59:27 +0900

r66464 で追加した Hash リテラルの内容を書き換えるテストで関係ない Hash がたまたま内容が一致して変更してしまわないように assert_separately を使って子プロセス内で実施するようにしています。

ko1: r66466 2018-12-20 16:17:55 +0900

r66464 の続きで Hash リテラルのための duphash のオペランドに埋め込む Hash は rb_obj_hide() を使って ObjectSpace.each_object でアクセスできないようにしています。このままだと dup した時も hide されたままになっちゃうので rb_hash_resurrect() という関数を導入して klass を rb_cHash に戻すようにしています。 [ruby-core:90629] [Bug #15440]

kazu: r66467 2018-12-20 18:55:05 +0900

README.ja.md に貼っている TravisCI のステータスバッジの更新と Wercker の追加。README.md に追随。

mame: r66468 2018-12-20 19:17:37 +0900

拡張ライブラリ coverage の Coverage.line_stub にて lines の初期化に TracePoint のイベントの行番号を元にしていましたが、全てのイベントを使っていたのを :line イベントのみ使うように修正しています。