ruby-trunk-changes r62040 - r62057

今日は NameError.new でキーワード引数 receiver と key を受け付けるようにする変更や Hash#transform_keys! で既存の別の key に変更した時の不具合修正などがありました。

nobu: r62040 2018-01-25 22:10:14 +0900

coderange (文字列内のバイト列が Encoding のどんな文字に対応してるかの情報)が壊れている文字列から slice などで切り出した部分文字列の coderange が壊れたままでしたが、切り出された部分文字列に含まれたバイト列は valid な可能性もあるので、coderange 情報をクリアして返すようにしています。 [ruby-dev:50430] [Bug #14388]

nobu: r62041 2018-01-25 22:22:36 +0900

r62039 の freezestring 命令の後で dup してたら freezestring 命令を削る最適化で、やはり send 命令でメソッド名のチェックが抜けていたようなので "+@" かどうかのチェックを追加しています。

mrkn: r62042 2018-01-26 10:33:45 +0900

Hash#transform_keys! で Hash の key を変更する時に元からある別の key に変更するような書き換えができるように、key, value のペアを取っておいてから一旦 Hash の内容をクリアして追加しなおす処理に書き換えています。 [ruby-core:84951] [Bug #14380]

svn: r62043 2018-01-26 10:33:46 +0900

version.h の日付更新。

mrkn: r62044 2018-01-26 11:01:47 +0900

r62042 の Hash#transform_keys! の変更で rubyspec が壊れてたのでテスト内容を変更しています。 [ruby-core:84951] [Bug #14380]

nobu: r62045 2018-01-26 12:13:32 +0900

ext/psych/.gitignore から不要になったファイル名を削除しています。

nobu: r62046 2018-01-26 12:13:33 +0900

ext/readline/.gitignore と ext/zlib/.gitignore を追加して、ダウンロードしたライブラリのアーカイブファイルを無視するようにしています。

nobu: r62047 2018-01-26 12:41:04 +0900

標準添付ライブラリの lib/optparse.rb の magic comment frozen_string_literal を false から true に変更して、dup が必要なところには String#+@ をつけています。

hsbt: r62048 2018-01-26 12:54:55 +0900

.travis.yml から sudo: required と group の追加を元に戻して、コンテナでテスト実施するようにしています。 r61209, r61210 で TravisCI の環境での Etc のテストがこけてたので一時的に変更していましたが、直ったみたいですね。

kou: r62049 2018-01-26 13:51:14 +0900

例外クラス KeyError の KeyError.new でキーワード引数 key と receiver を追加して receiver と検索した key を渡せるようにしています。 NameError も receiver と name を保持してるけど、ruby レベルでは指定できませんね確か。 [ruby-core:84626] [Feature #14313]

nobu: r62050 2018-01-26 14:34:18 +0900

r62049 で追加した KeyError#initialize の実装で key, receiver を CONST_ID() マクロで(キャッシュありとはいえ) rb_intern() を呼んでいたのを、事前に確保済みの idKey や idReceiver を使うようにしています。 [ruby-core:84626] [Feature #14313]

shyouhei: r62051 2018-01-26 15:30:58 +0900

VM 命令の定義の属性に handle_frame というのを追加して、leave, defineclass, opt_call_c_function などの命令で true に設定しています。handle_frame = true の命令では VM 実装のコードを吐く時に PREFETCH() は行なわないようにして、それ以外の時は ADD_PC() と PREFETCH() を VM 命令の実装の最後に移動しています。VM 命令のコードサイズの削減と PC の操作部分を極力集めることでキャッシュにのりやすくすると書いてあるので、移動してるほうは PC の操作部分を集めるためみたいですね。

shyouhei: r62052 2018-01-26 15:30:59 +0900

gc.c の gc_event_hook() という関数で GC のイベントのコールバックを呼ぶ時に cfp->pc を 1つずらして呼ぶようにしています。 r62051 の変更で vm_trace() の呼び出しが PC のインクリメントの前に呼ばれるようになったので、その調整みたいです。

nobu: r62053 2018-01-26 15:41:13 +0900

r62049 で KeyError.new のキーワード引数を追加しましたが、キーワード引数が指定されていなかった時も rb_ivar_set() してたので KeyError#receiver や KeyError#key が nil を返していましたが、指定がなかった時は ArgumentError が発生するようにしています。 [ruby-core:84626] [Feature #14313]

nobu: r62054 2018-01-26 19:55:45 +0900

さらに KeyError.new の実装の修正で rb_call_super() にオプション引数も渡すようにしています。 [ruby-core:84626] [Feature #14313]

nobu: r62055 2018-01-26 19:55:45 +0900

NoMethodError.new の rdoc 用コメントに省略可能な引数 priv について追記しています。こんなのあったっけ。

nobu: r62056 2018-01-26 19:55:46 +0900

NameError.new と NoMethodError.new について省略可能引数やキーワード引数を指定した場合についてテストケースを追加しています。

nobu: r62057 2018-01-26 19:55:47 +0900

NameError#initialize の実装 name_err_initialize_options() でキーワード引数以外にもオプション引数(Hash で渡される引数)の :receiver も受け付けるようにして、NoMethodError#initialize からオプション引数を super に渡すようにして receiver の設定を共通化するようにしています。うーむ、NoMethodError.new は通常の(省略可能)引数でも name を受け付けているので、互換性を保ちつつの引数の設計が悩ましいですね…。 [ruby-core:84626] [Feature #14313]