ruby-trunk-changes r59741 - r59751

今日は Hash オブジェクト生成の最適化などがありました。

mame: r59741 2017-09-04 22:25:01 +0900

拡張ライブラリ io/nonblock の IO#nonblock, IO#nonblock? の簡単なテストを追加しています。

nobu: r59742 2017-09-04 23:04:50 +0900

rb_str_enumerate_xxx() 系の関数で各要素を配列に追加するか yield するかを分岐していたのを enumerator_element() という inline 関数の中に分離しています。

nobu: r59743 2017-09-04 23:04:54 +0900

String#each_grapheme_cluster のブロック内で receiver の String オブジェクトの内容を書き換えられても、変更前の内容を元に処理するように rb_str_new_frozen() でバッファを共有した frozen string を作ってそちらを参照するようにしています。

shyouhei: r59744 2017-09-05 13:48:19 +0900

rb_hash_new_with_size() というテーブルの初期サイズを指定して Hash オブジェクトを生成する関数を追加して、Hash#transform_values や Hash[] での生成時に最初から必要なサイズを確保しておくようにして拡張のコストを削減するようにしています。 [ruby-dev:50216] [Bug #13861]

svn: r59745 2017-09-05 13:48:19 +0900

version.h の日付更新。

shyouhei: r59746 2017-09-05 13:49:01 +0900

rb_hash_bulk_insert() で要素数が1つだけの時やテーブルサイズが小さい時に最適化した処理を st_insert_single() や st_insert_linear() として追加して場合に応じてこちらを利用するようにしています。

nobu: r59747 2017-09-05 16:50:13 +0900

st.c で assert(3) を使っていたところを st_assert() というマクロを利用するように統一しています。またテーブルの entry が初期状態でないかのチェックを st_assert_notinitial() という専用のマクロに切り出しています。

nobu: r59748 2017-09-05 16:52:08 +0900

st_insert2() で新規キーの追加時に num_entries を increment し忘れてたパスがあったのを修正しています。st.c も書き換えられたのですっと理解できなくなったなぁ。要素数が少なくて bins がまだ利用されていない時の追加時に num_entries が増えてなかったのだと思います。 st_insert2() 自体 encoding 回りで1か所しか使われてなかったのであまり影響はなかったのだと思います。

mame: r59749 2017-09-05 17:15:54 +0900

r59741 で追加したテストで Windows で NotImplementedError が発生していたので rescue しておくようにしています。

hsbt: r59750 2017-09-05 17:25:26 +0900

.travis.yml の Slack 通知のセキュリティトークンを更新しています。

rhe: r59751 2017-09-05 18:47:59 +0900

r59734 の openssl の更新で一部の環境でテストが失敗していたのをチェックを強化したり特定の例外で skip するようにしたり対策しています。