ruby-trunk-changes 2020-03-18

今日はキーワード引数を keyword splat で呼び出し/受け取りする時に生成される Hash オブジェクトの無駄をなくす最適化などがありました。

[ac04b778c1] Jeremy Evans 2020-02-27 19:15:04 UTC

Hash リテラル内で {**h} のように keyword splat と同じ記法で Hash オブジェクトを展開することができますが、これがキーワード引数の処理と同じ命令列にコンパイルされるため、結果として得られる Hash オブジェクトが freeze された状態になってしまっていたとのことで、文脈で扱いを変えてメソッド呼び出し引数内の時だけ最適化するようにしています。

[d2c41b1bff] Jeremy Evans 2020-02-24 20:05:07 UTC

キーワード引数を m(**kw) のように定義した場合と呼び出す場合でそれぞれ呼び元と受け取るほうでそれぞれ Hash オブジェクトを作成するので、呼び出し時のフラグに情報を追加して既に呼び元で Hash が専用に確保されていたらそれを流用するようにして余分なオブジェクト生成を減らすようにしています。コミットログが長い。通常のキーワード引数と **kw みたいな Hash 渡しを混在させると呼び元で Hash は作るけど、**kw だけの時は余分な Hash オブジェクトは作らなくするようにしているそうです(そしてその場合呼ばれたメソッド定義のほうで **kw で受け取ってたら新たな Hash オブジェクトが作成されるけど、通常のキーワード引数のみの場合はそれも抑制される)。要するに呼び元の呼びかたとメソッド定義のしかたでそれぞれ Hash オブジェクトを確保する必要の有無があるけど、いずれにしても caller/callee あわせてたかだか 1つの Hash オブジェクトの確保ですむように情報を受け渡すようにしたということのようです。ところで **kw みたいな渡しかたって複数並べることができたんですね。

[f4fc81fe92] git 2020-03-17 19:10:10 UTC

version.h の日付更新

[afd23ed049] Kazuhiro NISHIYAMA 2020-03-18 04:57:03 UTC

47141797bed55eb10932c9a722a5132f50d4f3d8 の Hash#each のブロック起動の仕様変更についての NEWS の追記のチケット参照をリンクにするため footnote を追加。