今日は主に benchmark のドライバを benchmark_driver.gem に依存するように乗り換える変更や Pathname#glob の不具合修正、Object#clone と不正な initialize_copy で SEGV する不具合の修正などがありました。
k0kubun: r63886 2018-07-08 22:03:01 +0900
benchmark/ サブディレクトリの下には driver.rb のほかに run.rb, runc.rb, report.rb などのもう使われなくなったファイルが残っていてまぎらわしいので削除しています。 [ruby-core:87884] [Misc #14902]
k0kubun: r63887 2018-07-08 23:08:25 +0900
make benchmark および make benchmark-each のターゲットでベンチマークスクリプト実行する時に prelude.rb を読み込むようにしています。miniruby が IO#write_nonblock を実行できないので prelude.rb を読み込んでおかないといけないとのこと。
k0kubun: r63888 2018-07-08 23:38:05 +0900
benchmark に benchmark_driver.gem という外部の gem パッケージを利用することにしています。 make update-benchmark-driver でインストールするようになっているようです。 benchmark_driver.gem はベンチマークスクリプトを YAML ファイル内に文字列として書くみたいで、一部の benchmark スクリプトは YAML ファイルに書き換えられています。 [ruby-core:87884] [Misc #14902]
k0kubun: r63889 2018-07-09 00:05:18 +0900
svn: r63890 2018-07-09 00:05:19 +0900
version.h の日付更新。
k0kubun: r63891 2018-07-09 00:12:24 +0900
k0kubun: r63892 2018-07-09 00:35:22 +0900
k0kubun: r63893 2018-07-09 01:28:34 +0900
r63891 で YAML に書き換えたベンチマークスクリプト vm1_*.yml で while ループを直書きしていたのを YAML ファイルの prelude や loop_count などの属性を使って書き直しています。なるほど benchmark_driver.gem はこのように本体部分と前処理やループの回数を分離して設定できるんですね。
k0kubun: r63894 2018-07-09 01:35:44 +0900
benchmark/vm1_*.yml は機械的に書き換えたものみたいで(そりゃそうでしょうね)、一部リテラルの書きかたを整形したりしています。
k0kubun: r63895 2018-07-09 01:46:49 +0900
よくわかりませんが benchmark/vm1_ensure.yml で loop_count を使って繰り返し回数を指定してたのをやめてベンチマーク本体の中で while ループを書くうようにしています。本体部分が速すぎて? 負の結果が出てしまうとのこと。
k0kubun: r63896 2018-07-09 02:03:23 +0900
ベンチマークスクリプト vm2_*.yml も同様に prelude や loop_count を利用するようにするリファクタリング。
k0kubun: r63897 2018-07-09 02:19:57 +0900
そして vm2_*.yml も一部 YAML の文字列の記法を修正したりしています。
k0kubun: r63898 2018-07-09 02:22:58 +0900
で benchmark/vm2_struct_small_aset.yml も loop_count を使わず本体で while ループするようにしています。こっちは本体でループカウンタの i を参照していたので消せなかったようです。
k0kubun: r63899 2018-07-09 02:31:06 +0900
benchmark/gc/ の GC 絡みのベンチマークは AO Bench や pentomino など他のベンチマークスクリプトに依存していて require することで再利用していたのですが、YAML 化するためにコピーを持つようにしています。うーむ、YAML 化した後でまた共通化できるのかな。
k0kubun: r63900 2018-07-09 02:36:26 +0900
残りの benchmark/bm_*.rb も YAML ファイル化しています。
k0kubun: r63901 2018-07-09 02:47:32 +0900
benchmark/app_pentomino.yml の __END__ の後のスクリプトも YAML に含まれてしまっていたので削除しています。
k0kubun: r63902 2018-07-09 02:48:58 +0900
benchmark/ 配下のベンチマークスクリプトは YAML に変換されたので benchmark/driver.rb の ruby スクリプト実行のための機能は削除しています。
k0kubun: r63903 2018-07-09 03:08:26 +0900
benchmark/README.md を追加して benchmark_driver.gem に依存していることや実行方法などのドキュメントを追加しています。
svn: r63904 2018-07-09 03:08:27 +0900
r63903 の新規追加ファイルの svn property 設定。
k0kubun: r63905 2018-07-09 03:10:14 +0900
r63903 で追加した benchmark/README.md のサンプルコードの Markdown のハイライト指定を変更しています。
k0kubun: r63906 2018-07-09 03:33:43 +0900
benchmark/driver.rb のオプションを benchmark_driver.gem にあわせるように変更/追加しています。
stomar: r63907 2018-07-09 04:30:19 +0900
Range.new および Range#to_a などの rdoc 用コメントの文法やマークアップを修正しています。
normal: r63908 2018-07-09 08:43:14 +0900
addr2line.c で mmap(3) でファイルをメモリにマップした後に fd を struct obj_info に保持していたのですが、mmap() 後にすぐに fd を close するようにしています。
nobu: r63909 2018-07-09 10:20:20 +0900
Pathname#glob でパターンに最後に path separator ("/")が含まれているものを渡すと結果から 1文字欠けてしまうという不具合を修正しています。 pathname 特有の実装というわけではなくて Dir.glob でも使われている glob_helper() の修正です。 [ruby-dev:50588] [Bug #14899]
nobu: r63910 2018-07-09 10:50:12 +0900
make exe/ruby で ruby-runner をコンパイルする時にも POSTLINK コマンドがあれば実行するようにしています。 macOS での codesign 用の変数みたいですね。
normal: r63911 2018-07-09 12:07:59 +0900
addr2line.c の kprintf() が addr2line.c の中でしか使われていなかったので static 関数に変更しています。
ko1: r63912 2018-07-09 17:07:26 +0900
Object#clone は dup よりも freeze のフラグや特異メソッドなどより多くの情報をコピーするメソッドです。struct RBasic::flags の FL_USER* のフラグが過剰にコピーされていて、内部的に利用している情報が食い違って SEGV などを起こす可能性があったので、FL_PROMOTED0、FL_PROMOTED1、FL_FREEZE、FL_FINALIZE など一部のフラグのみ明示的にコピーしてあとはコピーしないように修正しています。 [ruby-dev:50575] [Bug #14847]