ruby-trunk-changes r67257 - r67267

今日は不正なインスタンス変数/クラス変数のエラーメッセージの強化などがありました。

k0kubun: r67257 2019-03-14 22:47:10 +0900

r67226 の正規表現リテラルの不正なオプションのエラーメッセージの強化で rubyspec の bundler のテストが通らなくなったそうなので一旦 skip するようにしています。

nagachika: r67261 2019-03-15 07:43:57 +0900

tool/make-snapshot で生成したパッケージのサイズや各種ダイジェストを表示する時にインデントを深くしています。これはリリースノートの Markdown 書くときにこのままコピペできるように、という意図です。

svn: r67262 2019-03-15 07:43:59 +0900

version.h の日付更新。

nobu: r67264 2019-03-15 09:44:51 +0900

不正なインスタンス変数やクラス変数名を parse した時の SyntaxError のメッセージにその行を含めるようにしています。

nobu: r67265 2019-03-15 10:19:31 +0900

NEWS ファイルのインデント修正やチケット番号の参照がマークアップとして解釈されないようにするエスケープの追加など。

mame: r67266 2019-03-15 14:19:54 +0900

NODE の type が NODE_HASH の時に node.u2.argc にアクセスするための別名に nd_alen を使っていましたが、専用の nd_brace というマクロ定義を追加してこれを使うようにしています。 struct NODE は 3分木の構造体なんですが type によってそれぞれの子が表すものが異なるのでマクロで名前をつけてソース上はそれを使ってアクセスするようにしているので、意味にあわせて名前をちゃんと付けよう、ということですね。実際の挙動は変化ありません。なお nd_brace はメソッドの引数の Hash がキーワード引数として渡したものを parse したものなのか、明示的に meth({a: 1}) のように Hash リテラルとして書かれたものなのかというのを保存するフラグだそうです。

svn: r67267 2019-03-15 14:19:58 +0900

r67266 のインデントのタブを空白に展開。

ruby-trunk-changes r67247 - r67256

今日は parse.y のリファクタリングやエラーメッセージ強化と、メソッド呼び出しの引数の扱いのコーナーケースの修正などがありました。

mame: r67247 2019-03-14 10:04:53 +0900

標準添付ライブラリ fileutils のテストで root 権限下だと失敗してしまうテストを実行しないようにしています。

svn: r67248 2019-03-14 10:04:55 +0900

version.h の日付更新。

nobu: r67249 2019-03-14 11:18:05 +0900

parse.y で YYLTYPE の値の初期化用の初期化子のマクロ RUBY_INIT_YYLLOC() を導入して RUBY_SET_YYLLOC() のかわりに使うようにしています。 RUBY_SET_YYLLOC() も中身の rb_parser_set_location() では同様の初期化をしてると思うけど。

nobu: r67250 2019-03-14 14:32:30 +0900

parse.y の parser_yyerror() から ruby_show_error_line() や parser_show_error_line() といった関数を切り出して regx_options() からも利用するようにするリファクタリング

nobu: r67251 2019-03-14 14:57:42 +0900

不正なグーバル変数名で SyntaxError になった時にその名前とその位置を表示するようにしています。

mame: r67252 2019-03-14 15:43:50 +0900

compile.c の compile_array() という関数からメソッドの引数を作る処理を別の関数 compile_args() として切り分けて関数内での分岐を整理しています。

svn: r67253 2019-03-14 15:43:54 +0900

r67252 のインデントのタブを空白に展開。

nobu: r67254 2019-03-14 17:13:46 +0900

parse.y でインスタンス変数名やクラス変数名の @ の後の文字のチェックを強化しています。

mame: r67255 2019-03-14 17:43:51 +0900

compile.c の setup_args() から setup_args_core() という関数を切り出して引数の評価の順番を変更しています。前から評価するほうが不要な配列の複製がなくなって効率的なケースがあるとのこと。

mame: r67256 2019-03-14 18:04:57 +0900

r67255 で切り出した setup_args_core() で引数のないメソッドの呼び出しの実引数に *rest と **kw が両方含まれていると ArgumentError になるという問題を修正しています。 [Bug #10856]

ruby-trunk-changes r67227 - r67244

今日は parse.y のちょっとしたリファクタリングと、昨日の変更へのテストの追加がありました。

nobu: r67227 2019-03-12 21:04:03 +0900

r67226 の不正な正規表現リテラルのオプションのエラー表示の強化についてテストも追加(追随)させています。

nobu: r67243 2019-03-13 10:44:34 +0900

parse.y の parse_yyerror() で固定の "\n" を代入してフォーマット文字列に埋め込んでるだけの newline というローカル変数を削除して、フォーマット文字列内に直接 \n を書くようにリファクタリングしています。

svn: r67244 2019-03-13 10:44:45 +0900

version.h の日付更新。

ruby-trunk-changes r67216 - r67226

今日はキーワードrest引数のSymbol以外のキーに対する挙動の変更や不正な正規表現リテラルのオプションのエラー表示の強化などがありました。

nobu: r67216 2019-03-11 21:47:02 +0900

parse.y の block_param というノードのアクション部のブロックで宣言されてた excessed_comma という変数を トップレベルに移動しています。

mame: r67217 2019-03-11 21:48:33 +0900

r64358 で 2.6 以降キーワード引数を **kw のように Hash に受け取る時にキーに Symbol とそれ以外のオブジェクトを混ぜて受け取るのは禁止されるようになっていましたが、これを revert して再度受付けるようにしています。3.0 でのキーワード引数の仕様変更に向けて現状の仕様だとうまく migration できるような中間的な書きかたができないため。 [ruby-core:91779] [Bug #15658]

svn: r67218 2019-03-11 21:48:34 +0900

r67217 のインデントのタブを空白に展開。

naruse: r67221 2019-03-11 22:00:31 +0900

r67217 で NEWS ファイルの profiler 削除についてのエントリも削除してたので revert しています。

nobu: r67224 2019-03-12 13:11:41 +0900

parser_yyerror() と parser_compile_error() で return 前に token_flush() を追加しています。 parser_yyerror() は(ripper ではない時に)先頭でも呼んでますね。エラー位置の表示の修正かな。

svn: r67225 2019-03-12 13:11:51 +0900

version.h の日付更新。

nobu: r67226 2019-03-12 13:23:17 +0900

parse.y の正規表現リテラルの最後につく /foo/i の i みたいなオプションを処理する regx_options() で未知のオプションが付いていた時の SyntaxError のメッセージにその正規表現と、未知のオプション部分の位置の表示をするようにしています。

ruby-trunk-changes r67203 - r67215

今日は Enumerator::Yielder をブロック引数として渡せるように to_proc メソッドを追加する変更や int_pow() が無限ループに陥る場合がある不具合修正、標準添付ライブラリ profiler の削除などがありました。

nobu: r67203 2019-03-11 10:37:16 +0900

int_pow() の y に 1 を渡すと無限ループに陥る不具合を修正しています。単に ruby で 1**1 としても大丈夫ですが Enumerable#permutation などで発生する可能性があったようです。 [ruby-core:91734] [Bug #15651]

svn: r67204 2019-03-11 10:37:21 +0900

version.h の日付更新。

nobu: r67205 2019-03-11 12:53:31 +0900

rubygems のテストでテストメソッド名が重複していて上書きしていたところがあったので、メソッド名を改名して衝突を回避しています。

nobu: r67206 2019-03-11 12:53:33 +0900

lib/rubygems/text.rb から require "rubygems" を削除。相互 load を避けるため。

knu: r67211 2019-03-11 18:49:14 +0900

Enumerator::Yielder#to_proc というメソッドを新規追加しています。 Enumerator::Yielder ってあんまり知られてないんじゃないかと思いますけど、Enumerator::Yielder.new でブロックを受け取って、yield メソッドを呼ぶたびにそれを実行するという、Enumerator.new のブロックに渡されるためのクラスですが、to_proc を実装したのはこれをそのまま & をつけてブロック引数として渡せるようにするためのようです。なるほど。

hsbt: r67212 2019-03-11 18:52:31 +0900

標準添付ライブラリ fileutils の FileUtils.mv で File.rename が Errno::EPERM を発生させた時も copy+unlink による実装を試すようにしています。通常は移動元と移動先が異なるブロックデバイスの時に Errno::EXDEV が発生して fallback しますが、ファイルシステム ext4ディレクトリ単位の暗号化?の機能で暗号化されてるところからされてないディレクトリへの移動は rename(2) でできなくて EPERM がかえってくるそうなので、それに対応しています。 [ruby-core:90536] [Feature #15415]

knu: r67213 2019-03-11 18:52:40 +0900

r67211 の Enumerator:Yielder#to_proc の追加について NEWS ファイルに追記しています。

hsbt: r67214 2019-03-11 19:09:48 +0900

webrick のテストで MJIT が有効かどうかチェックするのに RubyVM::MJIT.enabled? をチェックしてますが、webrick は default gem 化されてるので古い ruby でも動くように defined? で定数自体が定義されてるかチェックしてから参照するように修正しています。

hsbt: r67215 2019-03-11 20:37:17 +0900

標準添付ライブラリ profiler と profile を削除しています。しばらくメンテナがいないままなので。すごーく昔にちょっと使ってみたことあったなぁ。当時(たぶん 1.8かそれより前)の実装ではすごく遅くなるのであまり真面目には使わなかったと思うけど。 [ruby-core:91736] [Bug #15652]

ruby-trunk-changes r67201 - r67202

今日は at_exit などで例外情報を参照すると SEGV するケースがあった不具合修正がありました。

nobu: r67201 2019-03-10 15:46:28 +0900

fork のブロック内での break のように致命的エラーで終了する時に at_exit に登録していた処理が $! を参照すると SEGV する恐れがあったのを修正して errinfo を nil にクリアするようにしています。 [ruby-core:91731] [Bug #15650]

svn: r67202 2019-03-10 15:46:36 +0900

version.h の日付更新。

ruby-trunk-changes r67195 - r67200

今日は拡張ライブラリ ripper の不具合修正などがありました。

nobu: r67195 2019-03-09 09:00:26 +0900

gc.c の gc_mark_children() でオブジェクトの型が T_FLOAT、T_BIGNUM、T_SYMBOL だったらなにもしないので、switch 文の先頭のほうに移動してすぐ return するようにしています。処理としては変わりはないですがこうすると最適化されるってことかな。 https://github.com/ruby/ruby/pull/2091

svn: r67196 2019-03-09 09:00:35 +0900

version.h の日付更新。

nobu: r67197 2019-03-09 09:12:52 +0900

variable.c にオブジェクトが T_MODULE か T_CLASS であることを確認する rb_namespace_p() という関数を切り出して同じような条件分岐していたところの条件部で利用するようにしています。 RB_SPECIAL_CONST_P() でのチェックを先にして即値オブジェクトは early return するようにしているので若干最適化されているかも。

svn: r67198 2019-03-09 09:12:53 +0900

r67197 のインデントを空白に展開しています。

nobu: r67199 2019-03-09 19:14:16 +0900

拡張ライブラリ ripper のテストで respond_to? のチェックに assert_respond_to を利用するようにリファクタリングしています。

nobu: r67200 2019-03-09 19:17:33 +0900

拡張ライブラリ ripper でインデント除去つきヒアドキュメントを Ripper::Lexer でスキャンした時に :ignore_sp というイベントが使われていますが、定数 Ripper::SCANNER_EVENTS にこれが含まれていないので、追加するようにしています。 [ruby-core:91727] [Bug #15648]