ruby-trunk-changes r60220 - r60317

今日は Ruby 開発者合宿があったので、とてもたくさんの変更がありました。不具合修正に新規メソッドの追加と冒頭では書ききれないほどあるので、どこかで 2.5 の新機能として紹介されるのをご期待ください。
ちなみに今日は svn さんのコミットも含めて 98個もあり、ruby-trunk-changes 開始から最多を記録しました。

yui-knk: r60220 2017-10-21 01:22:22 +0900

branch coverage で分岐の位置を指定するなどに使うためと思われますが、parse した時にその token のカラム番号を NODE に保持するようにしています。大作ですね。

svn: r60221 2017-10-21 01:22:24 +0900

version.h の日付更新。

svn: r60222 2017-10-21 01:22:24 +0900

r60220 の行末の空白のみ。

yui-knk: r60223 2017-10-21 09:14:32 +0900

r60220 で cdecl という変数を使ったら Windows では(というか VC では?) cdecl は予約語? で変数名には使えないようなので nd_cdecl と改名しています。

nobu: r60224 2017-10-21 10:06:25 +0900

正規表現リテラルの once オプションつきのものをコンパイルする時に compile.c で NEW_NODE() を呼び出して NODE を確保していたのを parse.y でやっておくようにしています。

yui-knk: r60225 2017-10-21 11:50:38 +0900

parse_numeric() で浮動小数点数リテラルを読んだ後に literal_flush() という関数を呼んでいたのをやめています。 Float のリテラルや Complex のリテラル浮動小数点数リテラル部分を示すカラム位置が正確になるようにしているそうです。

nobu: r60226 2017-10-21 12:18:46 +0900

r60225 の修正に対するテストを追加しています。

knu: r60227 2017-10-21 14:18:38 +0900

拡張ライブラリ pty の IO#expect の実装で不要な String#chr があったのを削っています。

knu: r60228 2017-10-21 14:18:40 +0900

同じく拡張ライブラリ pty の IO#expect で MatchData#to_a を使っていたところを MatchData#captures を利用するようにリファクタリングしています。

glass: r60229 2017-10-21 15:08:33 +0900

Hash#slice メソッドを新規追加しています。可変長の引数を指定して、その引数をキーとしてもつサブセットの Hash オブジェクトを返すメソッドです。 ActiveSupport にはあったそうで、そうなのか…。 [ruby-core:55330] [Feature #8499]

glass: r60230 2017-10-21 15:11:01 +0900

r60229 の Hash#slice の追加について NEWS ファイルに追記しています。

k0kubun: r60231 2017-10-21 15:22:43 +0900

ruby_current_thread, ruby_current_vm, ruby_vm_event_flags, ruby_vm_const_missing_count などの VM 関係の変数を export するようにしています。JIT コンパイラを作りやすくするためみたいです。

akr: r60232 2017-10-21 15:22:53 +0900

標準添付ライブラリ open-uri でオプションに :encoding を受け付けられるようにしています。

akr: r60233 2017-10-21 15:45:41 +0900

IO.copy_stream の rdoc 用コメントに引数として IO のオブジェクトを受け付けるという記述を、src は read または readpartial を、dst は write メソッドを呼び出せるオブジェクトである必要があるというふうに修正しています。

naruse: r60234 2017-10-21 15:51:01 +0900

String#start_with? が引数に文字列だけでなく正規表現も受け付けるようにしています。これは便利そう。 [ruby-core:81897] [Feature #13712]
というかこの変更とは関係ないけどこれで実装読んで知ったんですが、String#start_with? って複数の引数を受け取って、どれかが先頭にマッチしたら true を返すっていうことができたんですね…。

k0kubun: r60235 2017-10-21 15:57:04 +0900

r60231 のさらに続きで ruby_vm_global_method_state, ruby_vm_global_constant_state, ruby_vm_class_serial といったキャッシュ関係の変数も static を消して export するようにしています。

akr: r60236 2017-10-21 16:00:58 +0900

標準添付ライブラリ open3 の各種メソッドで stdin_data 引数に文字列でなく readpartial メソッドを呼び出せる IO のようなオブジェクトが渡された時に IO.copy_stream を使って対応するようにしています。 [ruby-core:80936] [Feature #13527]

usa: r60237 2017-10-21 16:44:11 +0900

r60218 で追加された FileUtils.cp_r のテストを symbolic link が有効な環境でのみ実施するようにしています。

akr: r60238 2017-10-21 17:34:49 +0900

拡張ライブラリ pathname に Pathname#glob メソッドを新規追加しています。 receiver の Pathname オブジェクトのパスを基準として、そこからの相対パスで Dir.glob を行うようなメソッド(当然戻り値も Pathname オブジェクトになる)です。 [ruby-core:49373] [Feature #7360]

mame: r60239 2017-10-21 17:40:28 +0900

NODE オブジェクトの NODE_ALLOCA というタイプを T_IMEMO 型オブジェクトのサブタイプの imemo_alloc というのに置き換えています。これは確か一時利用のバッファを GC 対象にするために導入されたものですね。

usa: r60240 2017-10-21 17:41:22 +0900

Windows 版で時刻を取得する時に可能なら GetSystemTimeAsFileTime() のかわりに GetSystemTimePreciseAsFileTime() という関数を使うようにしています。こちらのほうがより精度のよい時刻を取得できるようです。 [ruby-dev:50167] [Feature #13732]

akr: r60241 2017-10-21 17:41:59 +0900

拡張ライブラリ pathname の idXxxx 系の変数の宣言をまとめて書いていたのを 1つずつ1行の宣言になるように変形しています。

akr: r60242 2017-10-21 17:44:56 +0900

NEWS ファイルに RbConfig::LIMITS の参照に require "rbconfig/sizeof" が必要なことを追記しています。

nobu: r60243 2017-10-21 17:56:58 +0900

tool/vcs.rb で git で revision 番号を取得するのに git log を使う前に git describe を使ってタグから計算する手法を使うようにしているようです。タグ指定でチェックアウトされている時には使えるっぽい?

nobu: r60244 2017-10-21 18:10:42 +0900

r60239 の NODE_ALLOCA の T_IMEMO 型オブジェクトの imemo_alloc タイプへの変更の追加修正。 linked list 構造になっているので GC 用の mark 関数でリストを辿って全要素を mark するのに再帰していたのをループを使うようにしたり、変数の型を修正したりしています。

ko1: r60245 2017-10-21 18:24:59 +0900

tool/runruby.rb に RUNRUBY_USE_GDB という環境変数が "true" にセットされていたら rubygdb 経由で実行するようにしています。さらに run.gdb というファイルがあったらそれを使って実行するようにしています。これで make test-all するとすごい時間かかりそうですね。

nobu: r60246 2017-10-21 18:25:05 +0900

make update-bundled_gems で Gem::SpecFetcher.fetcher.detect を呼んでるところで他の情報も break で返すようにしています。が、この $$F ってなんだろう…。[追記]$F は -a オプションの時に入力を自動で split して格納されている特殊変数らしい。$$ になっているのは Makefileエスケープ。[/追記]

hsbt: r60247 2017-10-21 18:50:36 +0900

make test-bundled-gems というターゲットを追加して、bundled gem のソースツリーを GitHub からとってきてテストを実施するようにしています。

svn: r60248 2017-10-21 18:50:37 +0900

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

knu: r60249 2017-10-21 18:53:52 +0900

標準添付ライブラリ drb の ACL 機能の ACL::ACLEntry.new で引数の IP アドレスの net mask 部分が不正な時のエラーを無視してたのを、例外 IPAddr::InvalidPrefixError をそのまま発生させるようにしています。

ko1: r60250 2017-10-21 19:21:31 +0900

T_IMEMO 型オブジェクトのタイプの識別する部分のための bit mask の imemo_mask を enum imem_type の要素(っていうのかな)のひとつとして宣言してたのをマクロ定数に変更しています。

ko1: r60251 2017-10-21 19:23:59 +0900

r60250 で const 型の変数 imemo_name を不要な初期化してたのを revert しています。

tarui: r60252 2017-10-21 19:26:31 +0900

internal.h の IMEMO_FL_USHIFT についてのコメントを修正しています。 IMEMO_FL_USER3 が追加されているのに追随しています。

naruse: r60253 2017-10-21 19:28:34 +0900

Dir.glob に {a,b,c} のようなパターンマッチつきの時に fnmatch_helper() で分割して処理するように最適化しています。 Rails がこういう Dir.glob を使ってるそうなのでその高速化のためみたいです。 [ruby-core:82660] [Feature #13873]

sonots: r60254 2017-10-21 19:33:25 +0900

chomp_rs(), deleted_prefix_length(), deleted_suffix_length() に doxygen 用のコメントを追加しています。

naruse: r60255 2017-10-21 19:44:13 +0900

r60253 の Dir.glob の最適化を revert しています。 Linux でエラーが起きてたとのこと。

kazu: r60256 2017-10-21 20:59:08 +0900

svn:ignore property を同期しているとのこと。

usa: r60257 2017-10-21 21:12:52 +0900

拡張ライブラリ win32 の win32/registry の Win32::Registry#read, #write で REG_NONE というタイプに対応するようにしています。 REG_BINARY と同じ扱いにしています。 [ruby-core:50627] [Bug #7526]

nobu: r60258 2017-10-21 21:18:35 +0900

gc.c のインデント修正のみ。

nobu: r60259 2017-10-21 21:18:38 +0900

gc.c の rb_raw_obj_info() のswitch 文で警告除去のために default 節と UNREACHABLE; を追加しています。

akr: r60260 2017-10-21 21:22:46 +0900

拡張ライブラリ socket の Socket.gethostbyaddr の rdoc 用コメントにサンプルコードを追加しています。

nobu: r60261 2017-10-21 21:34:13 +0900

標準添付ライブラリ scanf の浮動小数点数の対数表現の時の E/e の後に符号がなくても受け付けるように修正しています。おおー。でも最近 scanf 使ってないな…。 https://github.com/ruby/ruby/pull/1689 [ruby-core:82435] [Bug #13833]

kosaki: r60262 2017-10-21 21:57:14 +0900

拡張ライブラリ psych の ext/psych/yaml/scanner.c で未使用の式の警告除去のために代入するためだけの変数が、今度は未使用の変数の警告を出してるので、変数は削除して (void) のキャスト(っていうのかな)を付けるように変更しています。

kosaki: r60263 2017-10-21 22:01:51 +0900

ext/psych/yaml/scanner.c に他にも同様の未使用変数の警告があったので除去しています。

kosaki: r60264 2017-10-21 22:02:04 +0900

拡張ライブラリ psych の ext/psych/yaml/emitter.c の PUT_BREAK() というマクロで値を捨てている式があるという警告が出てるので条件演算子の書きかたを変更しています。これは等価なのかな。脳内 parse が難しい。

yui-knk: r60265 2017-10-21 22:06:36 +0900

node.h からすでに削除されている関数 rb_node_newnode_longlife() の宣言を削除しています。

akr: r60266 2017-10-21 22:13:02 +0900

拡張ライブラリ socket の Socket.gethostbyname と Socket.gethostbyaddr の rdoc 用コメントに、これらのメソッドが deprecated であることを追記しています。 このメソッドで利用されている getaddrinfo(3) と getnameinfo(3) の仕様や thread safe でないという問題により、これらのメソッドが他の Thread を block してしまうことや戻り値が扱いにくい形式であることなどを理由として追記しています。 [ruby-core:78947] [Feature #13097]

kosaki: r60267 2017-10-21 22:15:11 +0900

拡張ライブラリ psych の yaml_emitter_write_indicator() の引数 indicator に const 修飾子をつけて警告除去しています。呼び元で const のついた変数を引数に渡して警告が出てたみたいです。

kosaki: r60268 2017-10-21 22:15:23 +0900

拡張ライブラリ psych の yaml_emitter_write_block_scalar_hints() で変数に const 修飾子を追加しています。これも警告除去のため。

hsbt: r60269 2017-10-21 22:17:54 +0900

r60247 の make test-bundled-gems で bundled gem のソースディレクトリで gem install の --install-dir を spec/rspec から .bundle に改名しています。テストに rspec 使ってるとは限らないから、ということかな。

knu: r60270 2017-10-21 22:34:19 +0900

標準添付ライブラリ ipaddr を upstream から最新版をマージしています。 IPAddr#prefix, IPAddr#loopback?, IPAddr#private?, IPAddr#link_local? などのメソッドの追加、不正な netmask をエラーにする機能、IPAddr#ipv4_compat などのメソッドの deprecate にして警告メッセージを出すようにするなどの変更がどーんと入っています。 [Feature #11666] [Feature #10912] [Bug #13399] [Bug #13769]

knu: r60271 2017-10-21 22:34:22 +0900

r60249 で追加した drb/acl のテストに r60270 でマージした ipaddr-1.2.0 での不正な mask の検出に対応したテストを追加しています。

knu: r60272 2017-10-21 22:38:03 +0900

r60270 の NEWS ファイルの追記のチケット参照の記法を修正。 [Bug #13769]

hsbt: r60273 2017-10-21 22:40:12 +0900

Hash#update, #merge! の rdoc 用コメントのサンプルに receiver の内容が破壊的に変更されていることを示す行を追加しています。 https://github.com/ruby/ruby/pull/1652

hsbt: r60274 2017-10-21 22:49:39 +0900

File.unlink や File.delete の rdoc 用コメントに unlink(2) システムコールが返すエラーを Errno::Xxxx の例外で発生させることがあることを追記しています。 https://github.com/ruby/ruby/pull/1505

hsbt: r60275 2017-10-21 22:58:31 +0900

標準添付ライブラリ resolv の Resolv::MDNS#each_address で ".local" でおわるアドレスが渡された時にエラーになってた不具合を修正しています。 https://github.com/ruby/ruby/pull/1484

svn: r60276 2017-10-21 22:58:32 +0900

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

nobu: r60277 2017-10-21 23:06:22 +0900

r60243 の tool/vcs.rb の git で revision 番号検出の修正。 git log で最後のコミットが svn に入ってないものだと取れないのに対応したのかな。

hsbt: r60278 2017-10-21 23:11:08 +0900

標準添付ライブラリ irb で $SAFE が 3以上というチェックがあって、$SAFE 3以上というのはもうサポートされてないので削除しています。 https://github.com/ruby/ruby/pull/1713

nobu: r60279 2017-10-21 23:19:23 +0900

拡張ライブラリ etc の Etc.sysconfdir の rdoc 用コメントで Windows 向けの追記をしています。 [ruby-core:43110] [Bug #6121]

akr: r60280 2017-10-21 23:21:52 +0900

r60266 で拡張ライブラリ socket の Socket.gethostbyname と Socket.gethostbyaddr が deprecated だとコメントに追記したに対応して、代替として Addrinfo.getaddrinfo, Addrinfo#getnameinfo があることも追記しています。

kosaki: r60281 2017-10-21 23:21:56 +0900

標準添付ライブラリ fileutils の FileUtils.cp のテストで assert_equal_filemode という独自 assertion の第4引数に ~File.umask を渡して umask の設定に依存した失敗を回避するようにしているようです。

kazu: r60282 2017-10-21 23:22:04 +0900

r60271 のテストの追加で assert_raise のブロック内に2つ式を追加していたので2つ目が実行されなくなってたので、assert_raise を分けるように修正しています。

kosaki: r60283 2017-10-21 23:22:12 +0900

拡張ライブラリ pathname のテストでも umask の設定に依存している assertion を File.umask を考慮するように修正しています。

glass: r60284 2017-10-21 23:25:46 +0900

Linux の新しめのカーネルで追加された copy_file_range(2) というシステムコールを IO.copy_stream で利用して高速化を図っています。kernel 内で直接移動するので user land へのコピーが不要になるということですね。

sonots: r60285 2017-10-21 23:31:21 +0900

ヘッダの構造体や enum 型のメンバーに doxygen 用のコメントを追加しています。こんなふうに各メンバーにも書けるのか。

yui-knk: r60286 2017-10-21 23:32:32 +0900

parse.y の new_op_assign() というマクロの定義を本体用と ripper 用で別々に定義するようにしています。定義内容は同じだけど、なぜだろう…。同じだったら共有したほうが良さそう(最近 parse.y では共通化する方向の変更が多い気がする)けど。

ko1: r60287 2017-10-21 23:35:19 +0900

r60281 の FileUtils のテストで umask の影響を考慮させるのに assert_equal_filemode の第4引数に渡してましたが、umask キーワード引数(オプション?)で渡すのが正解だったようです。

kazu: r60288 2017-10-21 23:40:03 +0900

標準添付ライブラリで caller を使って呼び元のメソッド名などを取得する時に第2引数で取得するフレーム数も指定して余分なオブジェクトを生成しないように節約しています。

yui-knk: r60289 2017-10-21 23:51:07 +0900

r60286 の続き。 parse.y の new_op_assign_gen() の ripper 版の定義で column 引数が不要なので削っています。なるほどここで差が出るから分離したんですね。

hsbt: r60290 2017-10-21 23:55:22 +0900

拡張ライブラリ fiddle の fiddle/cparser の rdoc 用コメントのサンプルコードに明示的な require "fiddle" を追記しています。 https://github.com/ruby/ruby/pull/1666

hsbt: r60291 2017-10-22 00:02:25 +0900

README.md の記法の変更(Mix-in -> mix-in, ruby -> Ruby, OS X -> macOS など)や余分な空白除去など。 https://github.com/ruby/ruby/pull/1610

svn: r60292 2017-10-22 00:02:26 +0900

version.h の日付更新。

k0kubun: r60293 2017-10-22 00:02:46 +0900

標準添付ライブラリ erb で #frozen-string-literal: true の magic comment を付けるようにしています。破壊的変更が必要な文字列リテラルには String#+@ を使って dup しておくようにしています。

hsbt: r60294 2017-10-22 00:16:54 +0900

IO.write の rdoc 用コメントに offset が省略された時の挙動について mode との関係も追記しています。 https://github.com/ruby/ruby/pull/1571 [ruby-core:71277] [Bug #11638]

hsbt: r60295 2017-10-22 00:19:45 +0900

doc/syntax/methods.rdoc に代入記号つきメソッドの戻り値は式の評価結果では無視されて右辺値がそのまま代入式の値になることを追記しています。 https://github.com/ruby/ruby/pull/1682

svn: r60296 2017-10-22 00:19:46 +0900

r60295 の行末の空白除去。

akr: r60297 2017-10-22 00:21:26 +0900

標準添付ライブラリ securerandom に SecureRandom.alphanumeric というメソッドを新設しています。これは hex (16進数)にかぎらず a-z, A-Z, 0-9 の英数字全部を使って乱数を元にした文字列を生成するメソッドのようです。このために private なメソッドとして choose というのも追加しています。チケットの提案としては choose も public なメソッドとして追加しようというものだったみたいですけど。名前がいまいちってことでとりあえず private にしているようです。 [ruby-core:68098] [Feature #10849]

knu: r60298 2017-10-22 00:38:38 +0900

標準添付ライブラリ set の SortedSet に freeze メソッドを追加して、freeze された時に to_a を呼び出して @keys をセットしておくようにしています。freeze するとちゃんと動かなくなってたみたいです。 [ruby-core:73897] [Bug #12091]

k0kubun: r60299 2017-10-22 00:39:35 +0900

benchmark/driver.rb に --rbenv オプションを指定して、rbenv を使って複数のバージョンを切り替えた実行をできるようにしています。 https://github.com/ruby/ruby/pull/1724

usa: r60300 2017-10-22 00:43:05 +0900

__dir__ の返す文字列の Encoding を __FILE__ と同じく locale encoding に変換するようにしています。 Windows 向け、かと思いきや macOS でも NFD/NFC の正規化の扱いで UTF-8-MAC という Encoding があったりするので影響あるようです。

k0kubun: r60301 2017-10-22 00:45:32 +0900

benchmark/driver.rb に shebang を追加して直接実行できるようにしています。 うーん env 使うと誰かが文句をいいそう。

yui-knk: r60302 2017-10-22 00:56:03 +0900

T_NODE 型オブジェクトの NODE_IASGN2 というノードは未使用になっていたそうなので削除しています。

knu: r60303 2017-10-22 00:57:26 +0900

標準添付ライブラリ set で 特異メソッドのコンテキストでなぜかブロック渡しで module_eval していたところがあったので module_eval 削って直接実行するようにしています。

knu: r60304 2017-10-22 00:57:32 +0900

標準添付ライブラリ set の SortedSet.setup が multi thread でうまく動作しないそうで Mutex を追加して排他するようにしています。 [ruby-core:81985] [Bug #13735]

k0kubun: r60305 2017-10-22 01:01:48 +0900

man/erb.1 に -r オプションの説明を追記しています。

hsbt: r60306 2017-10-22 01:05:01 +0900

r60275 で追加した Resolv::MDNS#each_resource のテストが Raspberry Pi の環境では Errno::EADDRNOTAVAIL で失敗するそうなので rescue して無視するようにしています。

yui-knk: r60307 2017-10-22 01:09:51 +0900

T_NODE 型のオブジェクトの NODE_CVDECL という NODE も未使用になっているそうなので削除しています。結構未使用の NODE ありそう。

hsbt: r60308 2017-10-22 01:11:58 +0900

IO#gets, IO#readline, IO#readlines, IO#each_line などの rdoc 用コメントに chomp オプションについて追記しています。正確には各メソッドには getline_args という名前で書いておいて、IO.readlines の rdoc コメントに詳細はまとめて書いておくという記法になっています。 https://github.com/ruby/ruby/pull/1717

akr: r60309 2017-10-22 01:12:46 +0900

r60297 で追加した Random::Formatter#choose で、とりあえず雑に文字数ぶん乱数を生成して候補の文字から取得して join していたのを、複数の文字ぶん一気に1回の乱数生成で決定するようにしています。

naruse: r60310 2017-10-22 01:25:19 +0900

拡張ライブラリ openssl の OpenSSL::SSL::SSLContext#min_version= や #max_version= で Symbol による指定が使えないのに rdoc には書いてあったので、METHODS_MAP のテーブルを lookup するように修正しています。

naruse: r60311 2017-10-22 01:25:22 +0900

r60310 で修正した OpenSSL::SSL::SSLContext#min_version= と #max_version= を利用して、標準添付ライブラリ net/http でも min_version, max_version というオプションに対応して受け付ける SSL/TLS の方式の範囲を限定できるようにしています。 [ruby-core:60108] [Feature #9450]

knu: r60312 2017-10-22 01:28:52 +0900

標準添付ライブラリ set の Set#superset?, #proper_superset?, #subset?, #proper_subset? などのメソッドで @hash が比較演算子に対応しているかチェックするようにしています。ふーむどうやら SortedSet は RBTree というのを利用しているので、all? を使った実装を使わないといけなかったようです。 [ruby-core:73807] [Bug #12072]

naruse: r60313 2017-10-22 01:34:34 +0900

r60311 で追加した Net::HTTP の min_version, max_version のテストの assertion でログや例外メッセージの内容が異なっていたのでマッチさせる正規表現を修正しています。

naruse: r60314 2017-10-22 01:43:54 +0900

r60253 の Dir.glob の最適化の再チャレンジ。 {a,b,c} みたいなパターンがあった時の最適化を flags に FNM_EXTGLOB が指定されてるかどうかチェックしてから行うようにしています。…と思ったけどコミットログが "ignore server side error" で r60311 の Net::HTTP のテストの修正が一緒に入っているので、どうやらコミットミスっぽいですね。

naruse: r60315 2017-10-22 01:44:56 +0900

やっぱりコミットミスだったようで r60314 を revert しています。

naruse: r60316 2017-10-22 01:44:56 +0900

r60311 の Net::HTTP のテストでログの assertion は削って server 側のエラーは無視するようにしています。

knu: r60317 2017-10-22 02:03:40 +0900

標準添付ライブラリ set の Set#collect! で self.class.new(self) としていたのをやめて、引数なしで self.class.new してから each でループ回してセットするようにしています。これはサブクラスの initialize で collect! を使ってると無限ループに陥る可能性があるから、とのこと。 [ruby-core:75770] [Bug #12437]