ruby-trunk-changes r62402 - r62414

今日は loaded features を管理するテーブルの最適化、String#-@ の不具合修正、Array#values_at の最適化、Emscripten 対応などがありました。

k0kubun: r62402 2018-02-14 21:34:49 +0900

appveyor.yml の slack 通知を trunk のビルドの時のみ行うようにしています。このため trunk 以外のブランチのビルド設定をコピーして作ってます。通知部分でブランチで絞ることができないみたいですね。

k0kubun: r62403 2018-02-14 23:09:32 +0900

r62402 のやりなおし。 "for" という項目で特定のブランチのみに有効な設定を書く方法があったみたいなので、これを使ってビルド設定のコピーをやめています。

tenderlove: r62404 2018-02-15 03:38:33 +0900

require で load 済みの feature を管理するインデックスをファイルパスの C の文字列をキーとした st_table (strtable)から、キーを st_hash() で hash 値にしたものを使って numtable() を利用するようにしています。これ hash 値の conflict 時のこと考慮しなくていいのかなと思ったけど、もともと features_index は重複したエントリがあったら配列で入れるようになってたので、それにまかせているようです。かなり前から最適化関係のパッチを送ってきてくれている funny_falcon さんのパッチです。 [ruby-core:53688] [Feature #8158]

svn: r62405 2018-02-15 03:38:34 +0900

version.h の日付更新。

normal: r62406 2018-02-15 07:35:08 +0900

test/ruby/test_optimization.rb で RubyVM::InstructionSequence.compile のテストで frozen_string_literal のオプションの有無で両方テストしてるところでオプションを Hash もしくは nil でオプション引数として渡してたのを、明示的にキーワード引数で渡すように書き換えています。 r62177 の変更の追随みたいです。

normal: r62407 2018-02-15 07:35:13 +0900

iseq_peephole_optimize() で VM 命令の最適化する時に freezestring と String#+@ メソッド(単項演算子 +)が繋がってる時に freezestring が無駄なので消してましたが(r62039)、String#-@ での fstring 化の時も重複しているので freezestring 命令を削るようにしています。しかしこれってよく考えると再定義時に dup や freeze とは違う意味になった時に freezestring が消えるとまずかったりしないのかな。チケットのほうをみると freeze_string_literal: true の magic comment をつけたスクリプトで String#-@ で dedup したのに別のオブジェクトになる、という不具合の修正みたいです。 [ruby-core:85542] [Bug #14475]

mame: r62408 2018-02-15 10:59:15 +0900

configure.ac で pthread が使えるかどうかの判定を pthread_kill(3) の存在チェックではなく pthread_create(3) のチェックで行うようにしています。 Emscripten による JavaScript 変換が pthread_create() はあるけど pthread_kill() がないということで Emscripted で ruby をビルドするために、ということみたいですね。

mame: r62409 2018-02-15 10:59:16 +0900

configure で pthread_attr_getguardsize() の存在チェックもして、未定義だったら getpagesize(3) で代替するようにしています。これも Emscripten 対応のためみたいです。

mame: r62410 2018-02-15 10:59:17 +0900

そして gc.c に #ifdef __EMSCRIPTEN__ の時に STACK_GROW_DIRECTION の定義を追加しています。

mame: r62411 2018-02-15 14:34:20 +0900

拡張ライブラリ io/console の IO#oflush のテストでタイミング問題のあるテストに sleep を追加しています。

nobu: r62412 2018-02-15 15:14:42 +0900

大きな配列に Array#values_at を呼ぶベンチマークスクリプトを追加しています。

nobu: r62413 2018-02-15 19:00:57 +0900

Array#values_at は内部的に Aarray#[] メソッドの実装相当の関数をコールバックとして使って実装していたのを append_values_at_single() という専用の関数を定義して結果の配列に要素詰めるのを高速にしています。

knu: r62414 2018-02-15 20:16:51 +0900

make mjit_config.h の生成ルールで $(Q) 変数をチェックして verbose モードだったら set -x するようにしているところで $(Q@:=:) という書きかたがされてたのを test コマンドを使うように書き換えています。 FreeBSD の make でこの記法がうまく働かなかったみたいです。