ruby-trunk-changes r66756 - r66759

今日は Array#reject! が shared array を変更してしまう可能性があった不具合修正などがありました。

tenderlove: r66756 2019-01-09 04:22:05 +0900

Array#reject! の実装 rb_ary_reject_bang() で rb_ary_modify() の呼び出しが漏れてて、内部的にヒープを共有している配列の場合にコピーせずに共有元を変更してしまう不具合があったのを修正しています。これはでかいですね。しかも 2.4, 2.5 にも同じ不具合あがあるという。意外と気がつかれないんだな。 [ruby-core:90781] [Bug #15479]

svn: r66757 2019-01-09 04:22:11 +0900

version.h の日付更新。

mrkn: r66758 2019-01-09 16:05:37 +0900

complex.c の f_zero_p() で引数が Float の時のメソッド呼び出しをバイパスする最適化を追加しています。

nobu: r66759 2019-01-09 17:43:50 +0900

r66758 で internal.h に FLOAT_ZERO_P() の定義が追加されたため不要になった rational.c での同じマクロ定義を削除しています。

ruby-trunk-changes r66749 - r66755

今日は Range#last の最適化の再修正や NameError の例外メッセージの Encoding の修正などがありました。

mrkn: r66749 2019-01-08 13:37:40 +0900

r66734 の Range#last の最適化の再修正で Range#each が再定義されていた場合も脱最適化するようにしています。うーむなるほど。

svn: r66750 2019-01-08 13:37:44 +0900

version.h の日付更新。

mrkn: r66751 2019-01-08 13:53:06 +0900

r66688 での complex.c の f_add() の最適化で条件に誤って UNLIKELY() を使ってたところを LIKELY() に変更しています。

nobu: r66752 2019-01-08 16:45:04 +0900

Time.strptime のテストに "%p" という指示子を使ったテストを追加しています。

nobu: r66753 2019-01-08 18:08:31 +0900

内部的に発生する主に NameError や NoMethodError などのメッセージで埋め込まれる文字列に非 ASCII な encoding の文字があった時に、実際に端末や標準エラー出力に出力されない状態でも locale の設定に依存して encoding が変化しているので、メッセージのセット時ではなくて出力時に escape するようにしています。と、書きつつよくわかってないんですけど元の挙動そんなにダメなんですかね。まあこのほうがいいといえばいいか…… [ruby-core:90853] [Bug #15497]

svn: r66754 2019-01-08 18:08:37 +0900

r66753 のインデントのタブを空白に展開。

nobu: r66755 2019-01-08 19:53:43 +0900

r43217 あたりで追加した NameError のテストで例外のメッセージを正規表現でチェックしていたのを NameError#name のチェックで代替するようにしています。 [ruby-core:90853] [Bug #15497]

ruby-trunk-changes r66739 - r66747

今日は Complex の除算(Complex#/ メソッド)で右辺が Complex じゃない時に結果の Integer への正規化がされないことがある不具合の修正や Time.new の timezone の指定の不具合修正や対応する timezone name の追加などがありました。

k0kubun: r66739 2019-01-06 23:53:43 +0900

internal.h の C++ の bool, true, false などの型と定数が未定義の時の代替定義を missing/stdbool.h に移動してまとめています。古い VisualStudio および Oracle Solaris Studio 対応だそうです。

mrkn: r66740 2019-01-07 00:46:21 +0900

r66733 の変更で benchmark/range_last.yml の prelude セクションが不要になってたので削除しています。

svn: r66741 2019-01-07 00:46:22 +0900

version.h の日付更新。

nobu: r66742 2019-01-07 10:58:05 +0900

common.mk に BENCH_RUBY という変数を追加して make benchmark でベンチマーク実行に使う? ruby のコマンドの位置を指定できるようにしています。

nobu: r66743 2019-01-07 11:05:21 +0900

benchmark/time_strptime.yml という Time.strptime のベンチマークを追加しています。

mrkn: r66744 2019-01-07 13:49:34 +0900

Complex#/ で Complex の除算をした結果の real, imag が整数になる時に Integer に正規化する処理が右辺値が Complex じゃない時に働いてなかったのでその時も正規化するようにしています。 https://github.com/ruby/ruby/pull/2065 [ruby-core:90891] [Bug #15505]

hsbt: r66745 2019-01-07 15:01:49 +0900

拡張ライブラリ date の gemspec ファイルの spec.version を 1.0.0 から 2.0.0 に更新しています。

nobu: r66746 2019-01-07 15:59:46 +0900

Time.new で timezone の指定に文字列で "UTC" や "Z" を指定した時に生成したインスタンスutc? が true にならなかったのを修正しています。

nobu: r66747 2019-01-07 16:03:23 +0900

Time.new の timezone の指定に "A"〜"Z" のアルファベット1文字("J" は除くらしい)の指定(military time zone names というらしい)をサポートするようにしています。

ruby-trunk-changes r66723 - r66738

今日は整数でできた Range の Range#last に引数として個数を渡した時の最適化などがありました。

nobu: r66723 2019-01-05 21:13:39 +0900

compile.c の iseq_compile_each0() から演算子つきメソッド呼び出しの NODE_QCALL のコンパイルに関する部分を qcall_branch_start() と qcall_branch_end() という関数に切り出すリファクタリング

nobu: r66724 2019-01-05 22:15:07 +0900

parse.y の Symbol リテラルに関する文法ルールを少し組みかえて symbol というノードに ssym と dsym というノードを一旦まとめるルールを追加するようにしています(それぞれ static symbol と dynamic symbol かな)。これまで symbol は ssym 相当のものだけで、dsym はその上の fitem というノードで合流されてました。

nobu: r66725 2019-01-05 23:31:12 +0900

r66723 で切り出した qcall_branch_start() の変数の初期化を追加して警告除去。

mrkn: r66726 2019-01-06 00:09:44 +0900

Range#first と Range#last に不正な引数を渡した時のテストを追加しています。

svn: r66727 2019-01-06 00:09:45 +0900

version.h の日付更新。

ko1: r66730 2019-01-06 07:23:54 +0900

hash.c の要素数が少ない時の array 実装用の static 関数群に ar_ という prefix を付けるように改名しています。ついでに一部使うマクロの変更などしています。

ko1: r66731 2019-01-06 07:40:32 +0900

hash.c の array 実装用のマクロ EQUAL()、PTR_EQUAL()、SET_KEY()、SET_HASH()、SET_RECORD() などは削除して展開したり inline 関数化したりしています。と思ったけど EQUAL() と PTR_EQUAL() は同じものが移動しただけで残ってますね。これ inline 関数を呼ぶように展開結果を変えるつもりで忘れてたんじゃないかなぁ。

ko1: r66732 2019-01-06 07:41:59 +0900

と思ったらやっぱり r66731 の EQUAL() と PTR_EQUAL() は消し忘れだったみたいで PTR_EQUAL() の利用しているところを inline 関数版の呼び出しに変更してマクロ定義は削除しています。

mrkn: r66733 2019-01-06 09:46:35 +0900

r66721 で追加した Range#last の benchmark にさらに引数の数値を変えたものを追加しています。

mrkn: r66734 2019-01-06 09:46:36 +0900

Range#last で Range が Integer を元にしたものだったら中間オブジェクトとして Array を発生させずに数列を作るようにする最適化を行なっています。 Range#last に引数渡すと一旦全要素の配列を作ってたのか。場合によってはメモリにかなり厳しそう。 r66721 や r66733 の benchmark 追加はこの布石だったのですね。

nobu: r66735 2019-01-06 13:36:56 +0900

標準添付ライブラリ time の Time.strptime で %j で yday (年の通算日)を parse する時に日付が次の月に繰り上げになる処理が不足していたのを修正しています。 [ruby-core:90897] [Bug #15506]

nobu: r66736 2019-01-06 14:07:10 +0900

RubyVM::AbstractSyntaxTree.parse で引数が String でない時に変換失敗したらそのまま処理続けてたのでStringValue() マクロを使って TypeError 発生させるようにしています。 [ruby-core:90904] [Bug #15511]

duerst: r66737 2019-01-06 16:50:18 +0900

tool/downloader.rb の Unicode のデータファイルダウンロード用のコードで beta バージョンのファイル? の命名規則に対応するようにしています。これも日本の元号対応のための措置かなぁ。

duerst: r66738 2019-01-06 20:41:12 +0900

r66737 の続きで tool/downloader.rb でファイルパスから basename の拡張子を取り除いたものを取得するのに正規表現を使っていのを File.basename の第2引数を渡す方法を使うようにリファクタリングしています。

ruby-trunk-changes r66708 - r66722

今日は single thread 時の拡張ライブラリからの blocking 処理で割り込みが効かなくなる場合がある不具合修正や bundler の 2.0系への移行、SyntaxError のエラーメッセージをわかりやすくする変更などがありました。

normal: r66708 2019-01-04 21:53:06 +0900

2.6 以降の timer thread の廃止(環境によって)に伴なって single thread で動いている場合に拡張ライブラリから rb_thread_call_without_gvl() を呼んで blocking 処理している時に割り込み時に ubf 関数が呼ばれないという不具合があったのを修正しています。このために single thread の時にはそのために sleep するだけの pthread を起動するそうで。うーん。なんで ubf のために thread が必要なのかもよくわかってませんが、timer thread 削除には無理があったような気も。 [ruby-core:90865] [Bug #15499]

svn: r66709 2019-01-04 21:53:10 +0900

r66708 のインデントのタブを空白に展開。

hsbt: r66710 2019-01-04 22:10:58 +0900

bundler の 2.0.1 を upstream からマージしています。2.6.0 で延期した 2.0 系への移行ですね。

svn: r66711 2019-01-04 22:11:02 +0900

r66710 の新規追加ファイルの svn property 設定。

normal: r66712 2019-01-04 22:14:11 +0900

r66708 の修正にもからんで rb_nogvl() という C API を追加して、flags 引数で ubf が追加の thread を必要とするかどうか指定できるようにして、bignum や拡張ライブラリ zlib からの呼び出し時に不要な thread 生成を抑制するようにしています。 [ruby-core:90865] [Bug #15499]

svn: r66713 2019-01-04 22:14:18 +0900

r66712 のインデントのタブを空白に展開。

svn: r66714 2019-01-04 22:14:18 +0900

r66712 の新規追加ファイルの svn property 設定。

k0kubun: r66715 2019-01-05 00:41:29 +0900

r66598 で restrict 修飾子を有効にしたのに追随して Visual Studio 2013 でも __restrict というキーワードを利用するように #define の条件分岐を修正しています。
https://bugs.ruby-lang.org/issues/15347#note-7

svn: r66716 2019-01-05 00:41:32 +0900

version.h の日付更新。

ko1: r66717 2019-01-05 08:48:33 +0900

Hash の要素数が少ない時の array 実装の lookup の条件分岐を hash_stlike_lookup() という関数内に移動して共有するようにしています。

ko1: r66718 2019-01-05 09:06:09 +0900

hash.c で objhash という st_table 生成のための hash関数と cmp関数をメンバーとして持つ static 変数が用意されていますが、do_hash() や EQUAL() マクロでこのメンバーを参照して関数呼び出ししていたのを直接対象の関数を呼ぶようにしています。

ko1: r66719 2019-01-05 09:31:54 +0900

hash.c のインデントとスタイルの修正。

duerst: r66720 2019-01-05 18:47:55 +0900

common.mk で make update-unicode-property-files のファイルダウンロードの対象を UNICODE_PROPERTY_FILES から一部を UNICODE_AUXILIARY_FILES という変数に分離してコマンドを分けてダウンロードするようにしています。

mrkn: r66721 2019-01-05 19:07:40 +0900

benchmark/ 配下にRange#last の引数つきの呼び出しのベンチマークを追加しています。

nobu: r66722 2019-01-05 20:35:24 +0900

Symbol の開始を意味する ":" と文字列リテラルのクオートが許可されない場所に現われた時の SyntaxError のメッセージをわかりやすく表示するようにしています。

ruby-trunk-changes r66700 - r66707

今日は Hash の要素数が少ない時の実装のちょっとした最適化や標準添付ライブラリ rdoc の rdoc 用コメントの修正などがありました。

ko1: r66700 2019-01-04 10:59:49 +0900

Hash の要素数が少ない時の array による実装に使う構造体 ar_table_entry のメンバー hash の型を VALUE から st_hash_t に変更し、また st_hash_t を st_data_t として typedef 定義していたのも st_index_t に修正しています。

svn: r66701 2019-01-04 10:59:54 +0900

version.h の日付更新。

ko1: r66702 2019-01-04 16:49:00 +0900

Hash の要素数少ない時の array 実装の ar_lookup() でテーブルサイズが 0 の時(つまり空の時)は先に分岐して return するようにしています。 hash 値計算が無駄なので先に分岐したほうが速いということらしい。

nobu: r66703 2019-01-04 17:22:27 +0900

Object#methods の rdoc 用コメントのマークアップの閉じタグが間違ってたのを修正。

kazu: r66704 2019-01-04 18:10:10 +0900

標準添付ライブラリ rdoc と rexml の rdoc 用コメントのマークアップの閉じタグが間違ってたのを修正。

nobu: r66705 2019-01-04 18:25:32 +0900

標準添付ライブラリ rdoc の rdoc 用コメントで関数名を2つまとめて TT タグで括ってたのを1つずつ分けるように修正しています。

nobu: r66706 2019-01-04 18:41:13 +0900

標準添付ライブラリ rdoc の rdoc 用コメントでマークアップの追加と、サンプルの C のソースコードの関数宣言のスタイルが古かったので今採用しているものに修正しています。

nobu: r66707 2019-01-04 18:49:32 +0900

標準添付ライブラリ rdoc の rdoc 用コメントで rdoc の derective について書いているドキュメントで directive が解釈されてしまわないようにエスケープを追加しています、多分。

ruby-trunk-changes r66690 - r66699

今日は Complex の演算のメソッド呼び出しをバイパスする最適化の強化や OpenBSD での Random の実装の修正などがありました。

k0kubun: r66690 2019-01-03 14:08:43 +0900

.travis.yml の x86-64 Linux の環境で -w オプションをつけて実行するようにしています。RubyCI の CI 群は -w をつけて実行するようになってるので、Travis CI でもひとつは -w をつける環境を作っとこうということだそうです。

svn: r66691 2019-01-03 14:08:46 +0900

version.h の日付更新。

k0kubun: r66692 2019-01-03 14:15:54 +0900

r66690 の再修正。 -w オプションを RUN_OPTS ではなく RUBYOPT 環境変数経由で渡すようにしています。

k0kubun: r66693 2019-01-03 14:19:05 +0900

r66688 で追加した Complex のテストがメソッド再定義の警告が出てたので $VERBOSE を一時的に nil にして抑制するようにしています。

k0kubun: r66694 2019-01-03 14:24:05 +0900

r66693 の再修正。警告を $VERBOSE をいじって抑制するのではなく、メソッド再定義前に remove_method で削除しておくようにしています。

kazu: r66695 2019-01-03 14:51:18 +0900

Kernel#Integer(), #Float(), #Rational(), #Complex() などのメソッドの rdoc 用コメントの call-seq に戻り値が nil になり得ることを追記しています。 exception: true と書いてあって nil も書いてあるのはちょっと違和感がありますね。

kazu: r66696 2019-01-03 14:51:19 +0900

r66695 に続いて Kernel#Complex() の call-seq でキーワード引数 exception: のデフォルト値は true なので false から true に表記をかえています。あーなるほど、キーワード引数についてはデフォルト値を書くから true なのか。

mrkn: r66697 2019-01-03 15:19:17 +0900

Float#* を実装している flo_mul() や Rational#* を実装している関数 nurat_mul() をそれぞれ rb_float_mul()、rb_rational_mul() と改名して static 宣言をはずして、complex.c の f_mul() から直接呼び出すようにする最適化。

k0kubun: r66698 2019-01-03 15:27:35 +0900

r66690 および r66692 の続きで .travis.yml で make test-all に -w オプションを渡すのに env: で環境変数 RUBYOPT にセットさせるのはうまく働かなかったそうなので、make test-all のコマンドラインに直接 RUBYOPT=-w を追加するようにしています。

nobu: r66699 2019-01-03 20:42:24 +0900

random.c に OpenBSD の時に #include を追加しています。 チケットをみると r64625 で Random の実装に arc4random_buf() を利用できるかどうか各 OS のバージョンチェックするようになりましたが、OpenBSD ではこのチェックのためにヘッダが必要だったみたいです。 [ruby-core:90850] [Bug #15494]