Hatena::ブログ(Diary)

PB memo このページをアンテナに追加 RSSフィード

2017-05-26 ruby-trunk-changes r58888 - r58904

[][]ruby-trunk-changes r58888 - r58904

今日は Kernel#sprintf や String#% のフォーマット文字列の末尾の単独の "%" で例外発生にする変更や、先日追加した Dir.glob

キーワード引数 base の意味を変える変更などがありました。

stomar: r58888 2017-05-26 00:14:38 +0900

Hash#transform_values の rdoc 用コメントの文法修正。

svn: r58889 2017-05-26 00:14:39 +0900

version.h の日付更新。

eregon: r58890 2017-05-26 00:33:28 +0900

Kernel#sprintf や String#% メソッドでフォーマット文字列の末尾に "%" が単独で存在していた時に無視して "%" という文字列にしていたのを、例外を発生させるようにしています。 https://github.com/ruby/ruby/pull/1560 [ruby-core:80153] [Bug #13315]

k0kubun: r58891 2017-05-26 00:38:25 +0900

標準添付ライブラリ erb に ERB#result_with_hash というメソッドを新設して、引数に Hash を受け取ってそれをローカル変数としてセットした状態でテンプレートを解釈することができるようにしています。 https://github.com/ruby/ruby/pull/1623 [ruby-core:55985] [Feature #8631]

k0kubun: r58892 2017-05-26 00:43:49 +0900

r58891 の ERB#result_with_hash の追加について NEWS ファイルに追記しています。

ko1: r58893 2017-05-26 08:43:33 +0900

ruby 自体のテスト用のユーティリティ EnvUtil に EnvUtil.apply_timeout_scale を追加して、環境変数 RUBY_TEST_SUBPROCESS_TIMEOUT_SCALE で指定したタイムアウト値を変更するパラメータを考慮したタイムアウトを計算することができるようにしています。これを使って Thread と Process.fork を使ったテストのタイムアウト値に適用しています。

rhe: r58894 2017-05-26 10:50:20 +0900

compile.c で LABEL::unremovable というメンバが未初期化になっていたので初期化を追加しています。 r58810 で入り込んでたみたいです。 [ruby-core:81272] [Bug #13578]

ko1: r58895 2017-05-26 14:26:57 +0900

オブジェクトの比較の最適化関数 opt_eq_func() で Symbol オブジェクトも直接 VALUE を比較する最適化を行うようにしています。 https://github.com/ruby/ruby/pull/1540 [ruby-core:80231] [Bug #13330]

nobu: r58896 2017-05-26 15:28:38 +0900

r58895 と同様に opt_eql_func() でも Symbol の比較の最適化に対応しています。即値で判定できるかどうかのチェックをする comparable_by_identity() という関数を切り出して共有するようにリファクタリングもしています。

nobu: r58897 2017-05-26 15:39:06 +0900

string.c の else 節のスタイル修正。

nobu: r58898 2017-05-26 15:39:49 +0900

r58890 で Kernel#sprintf でフォーマット文字列の末尾の単体の "%" についての変更で同じ条件分岐をしていたので冗長な分岐を削っています。 [ruby-core:80153] [Bug #13315]

sonots: r58899 2017-05-26 15:42:11 +0900

標準添付ライブラリ uriURI.unescape の rdoc 用コメントに、このメソッドが obsolete であるとことと代替メソッドについて追記しています。 https://github.com/ruby/ruby/pull/1630

nobu: r58900 2017-05-26 16:02:51 +0900

tool/runruby.rb で RbConfig::CONFIG["PRELOADENV"] があった時に LD_PRELOAD などの環境変数の設定をする処理を arch 毎の ruby-runner がない時にセットするのをやめています。cross compile ビルド時向け?

nobu: r58901 2017-05-26 16:04:43 +0900

r58858 で追加した Dir.glob のキーワード引数 base の扱いをがらっと変えて、逆に base で指定した prefix 部分を削ったものを返すようにしています。 うむ、こっちのほうが使い勝手がありそうな気がします。しかしそんなコロコロ変わっていいのかw [ruby-core:78767] [Feature #13056]

normal: r58902 2017-05-26 16:28:23 +0900

rb_alloc_tmp_buffer2() に elsize(各要素のサイズ)が VALUE のサイズの整数倍(2倍以上)だった時に誤って ruby_malloc_size_overflow() を呼ぶことがあった不具合を修正しています。 [ruby-core:81388] [ruby-core:81391] [Bug #13595]

nobu: r58903 2017-05-26 18:49:20 +0900

拡張ライブラリ win32ole で OleInitialize() を二重に呼び出していたのを修正しています。 https://github.com/ruby/ruby/pull/1629

k0kubun: r58904 2017-05-26 21:12:13 +0900

標準添付ライブラリ erb のテンプレートを展開した文字列を force_encoding でスクリプトエンコーディングに変換していたのをやめるようにしています。 String.new のかわりに "".dup とすることでテンプレート展開のために作成される ruby スクリプト片の先頭にある magic comment のエンコーディング指定が反映されるので force_encoding は不要になったということみたいです。これは高速化を目的とした変更みたいです。 https://github.com/ruby/ruby/pull/1147

2017-05-25 ruby-trunk-changes r58872 - r58887

[][]ruby-trunk-changes r58872 - r58887

今日は Dir.children と Dir.each_child という "." と ".." を含まないエントリを返すメソッドの追加やいくつかの最適化がありました。

nobu: r58872 2017-05-24 22:30:54 +0900

r58855 で例外発生時に nil に対して finish メソッドを呼んでしまう不具合を修正しています。

nobu: r58873 2017-05-24 23:26:09 +0900

struct dirent の d_name が NUL 文字終端しているとはかぎらず、サイズが d_namlen で渡されていることがあるので glob_helper で NUL 文字終端を前提としていた部分を NAMLEN() マクロを使って移植性のある実装にそろえています。

normal: r58874 2017-05-25 03:59:24 +0900

pthread 版の thread の実装で timer thread の起動時に EINVAL が発生した時に pthread_attr の指定なしの起動に fallback するようにしています。やむをえず stack size の指定をなしで起動するようです。

svn: r58875 2017-05-25 03:59:25 +0900

version.h の日付更新。

normal: r58876 2017-05-25 06:26:14 +0900

r58855 の変更で String#crypt でメモリ解放の条件がおかしくてメモリリークしていた不具合を修正しています。

nobu: r58877 2017-05-25 10:46:36 +0900

dir_entries() で to_a メソッドなどを呼んで配列に変換していたのを dir_each() から切り出した dir_each_entry() を呼ぶように最適化しています。

nobu: r58878 2017-05-25 11:50:20 +0900

Dir#entries のテストをしていたテストメソッドDir.entries のテストも追加しています。

nobu: r58879 2017-05-25 11:50:21 +0900

Dir.children と Dir.each_child というメソッドを新規追加しています。つまりこれは "." と ".." が現れない Dir.entries と Dir.each というわけですね。なるほどメソッドを別に追加することにしたのかー。 [ruby-dev:49135] [Feature #11302]

watson1978: r58880 2017-05-25 13:25:37 +0900

Array#index と Array#rindex で rb_equal_opt() が Qundef を返した時に rb_equal() に fallback していたのを rb_equal() の中に rb_equal_opt() の呼び出しを埋め込んでいます。これは Array#index, #rindex のほうが主眼じゃなくて、rb_equal() を最適化版を使うように高速化して、Array#index, #rindex のほうは同じ高速化のための分岐をしてたのが冗長になったので削ってるってことですね。 https://github.com/ruby/ruby/pull/1552 [ruby-core:80360] [Bug #13365]

watson1978: r58881 2017-05-25 13:25:39 +0900

rb_eql() も最適化版の rb_eql_opt() を導入して即値オブジェクトの比較でメソッド呼び出しを回避して高速にするようにしています。 https://github.com/ruby/ruby/pull/1589 [ruby-core:80761] [Bug #13447]

nobu: r58882 2017-05-25 14:29:35 +0900

r58881 で rb_eql_opt() で opt_eq_func() を呼んでいましたが eql? メソッド相当の関数を呼ぶため opt_eql_func() という関数を新設してこちらを呼ぶように修正しています。

nobu: r58883 2017-05-25 16:36:47 +0900

r58882 で BUILTIN_CLASS_P() と EQ_UNREDEFINED_P() というマクロを重複してい定義していたのをあとのを削っています。また使っていた関数の後で #undef しておくようにしています。

stomar: r58884 2017-05-25 16:50:20 +0900

r58879 で新規追加した Dir.children と Dir.each_child の rdoc 用コメントでメソッド名が typo というかコピー元の Dir.entries と Dir.foreach のままだったのを修正しています。

stomar: r58885 2017-05-25 17:34:13 +0900

Dir.glob の rdoc 用コメントに説明を追記、修正しています。 [ruby-core:78767] [Feature #13056]

k0kubun: r58886 2017-05-25 20:14:40 +0900

String#concat で引数が1つの時に rb_str_concat() を直接呼ぶショートカットを追加して余分な中間オブジェクトの生成を抑制する最適化https://github.com/ruby/ruby/pull/1631

k0kubun: r58887 2017-05-25 20:41:45 +0900

insns.def の tostring 命令のコメントを to_str の結果ではなく to_s の結果と修正しています。

2017-05-24 ruby-trunk-changes r58854 - r58871

[][]ruby-trunk-changes r58854 - r58871

今日は Dir.glob にキーワード引数 base を追加する変更や Array#inject の不具合修正などがありました。

nobu: r58854 2017-05-23 21:11:57 +0900

INSNS を文字列化する時に label 用のフォーマット文字列を LABEL_FORMAT というマクロに切り出すリファクタリング

nobu: r58855 2017-05-23 21:38:01 +0900

標準添付ライブラリ net/http のテストで Net::HTTP.start を呼んだ後に Net::HTTP#finish を読んで fd leak を修正しています。けどこれ例外発生時は h が nil になって NoMethodError になるんじゃないかな。

nobu: r58856 2017-05-23 21:42:40 +0900

.travis.yml で build というディレクトリを掘ってそこでビルド実行するようにしています。ソースディレクトリ以外でのビルドをテストするようにしてるんですかね。

nobu: r58857 2017-05-23 22:18:45 +0900

r58856 の続きで .travis.yml でソースディレクトリを書き込み不可にしてビルドするようにしています。

nobu: r58858 2017-05-23 22:47:36 +0900

Dir.glob に base というキーワード引数を追加して、glob の結果に prefix を付けたものを返すことができるようにしています。 [ruby-core:78767] [Feature #13056]

nobu: r58859 2017-05-23 22:54:10 +0900

r58858 で追加したテストで Dir.glob の結果の順序に依存しないように sort を追加しています。 [ruby-core:78767] [Feature #13056]

nobu: r58860 2017-05-23 23:34:12 +0900

r58858 で追加した Dir.glob のキーワード引数 base に Dir オブジェクトを渡すことができるようにしています。 ついでに(?) openat(3) を使ってディレクトリfd を元にサブディレクトリfd を開いていくように実装を書き換えています。 [ruby-core:78767] [Feature #13056]

naruse: r58861 2017-05-24 01:51:48 +0900

IO.select に MSG_OOB に書き込みのある TCPSocket を渡して exceptfds で検出できるというテストが Solaris 11 でうまくパスしないそうで(readfds のほうで検知されるらしい)、skip するようにしています。

svn: r58862 2017-05-24 01:51:48 +0900

version.h の日付更新。

normal: r58863 2017-05-24 09:34:12 +0900

rubyspec の IO.popen のテストで無限に sleep する子プロセスを起動する時に環境によって shell が間にはさまると長時間待たされるのを直接 ruby を起動するようにして修正しています。

normal: r58864 2017-05-24 12:01:44 +0900

String#crypt の実装で struct crypt_data を自動変数としてスタックに確保していたのを ALLOC() を使ってヒープにメモリを確保するようにしています。環境によっては 131232 bytes もあるそうです。

ko1: r58865 2017-05-24 15:46:44 +0900

r57676 で導入した DEBUG_COUNTER に様々な条件のオブジェクトの数をみる obj_free, obj_str_ptr, obj_str_embed, obj_str_shared, obj_str_nofree, obj_str_fstr, obj_ary_ptr, obj_ary_embed, obj_obj_ptr, obj_obj_embed などを追加しています。

nobu: r58866 2017-05-24 15:55:09 +0900

r58864 の再修正。missing/crypt.h を使っていたら struct crypt_data のサイズは小さいのでやっぱりスタック上に置くようにしています。っていうか ALLOCV() とかでサイズをみて大きかったら自動でヒープに変えてくれるマクロがありませんでしたっけ?

watson1978: r58867 2017-05-24 15:57:08 +0900

Array#push や Array#<< で要素を追加する時に共有されてない配列では rb_ary_modify() を呼ばず rb_ary_modify_check() だけ直接呼ぶようにして最適化しています。 https://github.com/ruby/ruby/pull/1609 [ruby-core:81082] [Bug #13553]

nobu: r58868 2017-05-24 16:11:41 +0900

test/ruby/test_enum.rb で assert_float_equal という assertion method が重複して定義されていたので 1つ消しています。

nobu: r58869 2017-05-24 16:57:18 +0900

ruby のテスト用のライブラリ test/unit で assert_all_assertions_foreach というメソッドを追加して、第2引数以降に渡した引数を使ってブロックを呼び出して全て成功したら成功とするようにしています。こういうのまだなかったっけ?

nobu: r58870 2017-05-24 16:57:19 +0900

r58869 で追加した assert_all_assertions_foreach をさっそく利用して Integer の演算子メソッドを再定義した時の Array#inject の挙動のテストを + だけじゃなく他の二項演算子もテストするようにしています。 [ruby-dev:49510] [Bug #12178]

nobu: r58871 2017-05-24 17:00:42 +0900

Array#inject (#reduce) に Symbol をブロック引数として渡した時に要素が Integer だと最適化されてメソッドの visibility が考慮されないことがあるという不具合を修正しています。 [ruby-core:81349] [Bug #13592]

2017-05-23 ruby-trunk-changes r58847 - r58853

[][]ruby-trunk-changes r58847 - r58853

今日は bundled gem の test-unit のバージョン更新などがありました。

nobu: r58847 2017-05-22 23:25:56 +0900

rubyspec の Dir のテストで対象のファイルを一時ファイルを作成して利用するようにしています。source directory が書き込み不可能な時に配下のファイルを消そうとすると ENOTDIR でなく EACCESS になるのでサブディレクトリに入れるようにしています。

normal: r58848 2017-05-23 08:41:50 +0900

autoload の排他処理で linked list の処理で list_del_init() を list_del() に変更しています。不要な再初期化をなくす最適化みたいですね。

svn: r58849 2017-05-23 08:41:51 +0900

version.h の日付更新。

nobu: r58850 2017-05-23 10:04:07 +0900

appveyor.yml で不要になっていた環境変数 UNICODE_VERSION, UNICODE_URL_BASE の設定と UNICODE_DATA_DIR のディレクトリ作成を削っています。

nobu: r58851 2017-05-23 10:04:09 +0900

Windows のコマンドの書きかたが独特で雰囲気で読んでますが appveyor.yml で先に必要なファイル生成をしておいて srcdir を書き込み不可にしてからビルドとテストを実施するようにしています。

kou: r58852 2017-05-23 15:02:20 +0900

gems/bundled_gems の test-unit のバージョンを 3.2.4 に更新しています。

nobu: r58853 2017-05-23 20:35:54 +0900

vsnprintf.c の構造体 FILE の宣言で未使用のメンバ _lbfsize をコメントアウトしています。この構造体 FILE って stdio.h の FILE のレイアウトにあわせるようになってたりしないんでしょうか?

2017-05-22 ruby-trunk-changes r58832 - r58846

[][]ruby-trunk-changes r58832 - r58846

今日は Net::Protocol の最適化や Net::Protocol の multi thread 時の不具合修正、Net::IMAP の不具合修正などがありました。

nobu: r58832 2017-05-21 23:29:00 +0900

tool/downloader.rb の RubyGemsダウンロード機能から --verify オプションによるパッケージの検証機能を使わなくなったので削っています。

nobu: r58833 2017-05-22 01:45:35 +0900

tool/downloader.rb で .downloaded-cache というディレクトリ(環境変数 CACHE_DIR で変更可能)にキャッシュするようにしています。

svn: r58834 2017-05-22 01:45:36 +0900

version.h の日付更新。

stomar: r58835 2017-05-22 04:25:19 +0900

rubyspec の String#casecmp のテストで to_str で変換が走ることを確認するテストで特異メソッド定義していたところを should_receive を使って確認するように変更しています。

stomar: r58836 2017-05-22 04:27:08 +0900

rubyspec に String#casecmp や Symbol#casecmp などのメソッドテストケースを追加しています。

stomar: r58837 2017-05-22 04:28:48 +0900

String#casecmp や String#casecmp? で文字列変換できない引数が渡された時に例外を発生させずに nil を返すように変更しています。これは仕様変更なのかな? [ruby-core:80145] [Bug #13312]

stomar: r58838 2017-05-22 04:29:58 +0900

と思ったらやっぱり仕様変更だったようで r58837 の変更について NEWS ファイルに追記しています。 [ruby-core:80145] [Bug #13312]

stomar: r58839 2017-05-22 04:31:37 +0900

rubyspec の String#casecmp のテストでも 2.5 とそれより前のバージョンで挙動の違いを確認するテストを追加しています。 [ruby-core:80145] [Bug #13312]

normal: r58840 2017-05-22 08:52:08 +0900

標準添付ライブラリ net の Net::Protocol#fill_buf で IO#read_nonblocks から受信した文字列オブジェクトを String#clear で空にしてすぐメモリ解放するようにしています。メモリ使用量の削減に効果があるそうで、こういうのやったことはあるけど、細かいところが効くもんだなぁ。

nobu: r58841 2017-05-22 12:18:17 +0900

r58833 の tool/downloader の cache 対応で cache file をダウンロードした場合に hard link を貼るようにしています。 save_cache でも link_cache は呼んでるけど rename がエラーになるからスキップするってことかな。

k0kubun: r58842 2017-05-22 12:56:16 +0900

標準添付ライブラリ erb の ERB::Compiler::SimpleScanner#scan でインスタンス変数に格納されている配列の内容が変更されていなかったら、デフォルト正規表現リテラルで記述したものを利用して、変更がある時だけ毎回正規表現コンパイルするように最適化しています。 r53412 で遅くなってたそうです。 [ruby-core:73820] [Bug #12074]

nobu: r58843 2017-05-22 13:10:51 +0900

r58833 の tool/downloader.rb の cache 対応で cygwin の時に symbolic link を利用していると mingw/mswin で参照できないことがあるそうなので symbolic link を利用する条件を追加しています。

shugo: r58844 2017-05-22 15:13:11 +0900

標準添付ライブラリ net/imap の r58792 の修正の続きのようです。 Net::IMAP#send_literal で @exception の参照に race condition がありえるから @continuation_request_exception という別のインスタンス変数を使うようにしています。

rhe: r58845 2017-05-22 16:13:06 +0900

Hash#transform_values! は新しい Hash オブジェクトではなく receiver をそのまま返すのに rdoc 用コメントで逆の記述になっていたので修正しています。

normal: r58846 2017-05-22 16:36:00 +0900

標準添付ライブラリ net の Net:Protocol#read と #read_all で読み込み用のバッファの String オブジェクトに読み込んだ文字列を String#<< で追加する前に read_bytes を増加させておくようにしています。どうせすぐ増やすのにそこまで厳密さいるのかなと思ったけどテストコードをみると ruby で実装されているので、その隙間で Thread のスイッチがおきて、しかもバッファ用 String オブジェクトは呼び元で渡せるのでそれを操作されると期待したサイズの増加ができない可能性があったようです。なるほど。