ruby-trunk-changes r65605 - r65635

今日は unsigned な整数の overflow の対策や Rational() で文字列から変換する時のコーナーケースの修正などがありました。

nobu: r65605 2018-11-07 21:48:36 +0900

rb_nativethread_id_t の文字列化に使うマクロで Solaris 環境での警告抑制のため明示的キャストを追加しています。

svn: r65606 2018-11-07 21:48:39 +0900

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

nobu: r65607 2018-11-07 23:27:27 +0900

r65577 や r65586 の configure での MJIT_CC の展開で cygpath でのパスの変換は $build_os が cygwin でなくても行うようにしています。

nobu: r65608 2018-11-08 00:47:21 +0900

r65607 のさらに続きで win32/setup.mak において mswin でも MJIT_CC をフルパス化するのと -nologo オプションと追加して出力を抑制するようにしています。

svn: r65609 2018-11-08 00:47:23 +0900

version.h の日付更新。

hsbt: r65610 2018-11-08 00:55:14 +0900

標準添付ライブラリ fileutils の FileUtils::Entry_#entries で r58879 で追加された Dir.children を利用するようにして "." と ".." の除外しなくても良いようにしています。fileutils って upstream があると思うので、そちらで 2.4 以前の ruby の対応のコードがあるのかな。 https://github.com/ruby/ruby/pull/1754 [ruby-core:83777] [Feature #14109]

nobu: r65611 2018-11-08 01:51:19 +0900

macOS の最新の Xcode の linker の不具合(?)の対応のために tool/dawrin-cc を経由して使うための変数 CC_WRAPPER を拡張ライブラリのビルド時にはツールが使えない可能性があるのでクリアするようにしています。

hsbt: r65612 2018-11-08 02:18:14 +0900

r65583 で rubyspec の bundler 用のスタブデータのファイル群(?)を削除したのを tool/sync_default_gems.rb で同期した時も自動で消すように対応しています。

k0kubun: r65613 2018-11-08 09:06:38 +0900

test/rdoc/minitest_helper.rb で gem "minitest" から Bundler::GemfileNotFound が発生する場合があるようになったので rescue に追加しています。

nobu: r65614 2018-11-08 09:12:53 +0900

compile.c の到達しないはずの場所に rb_bug() で異常終了させるコードがあったので、専用の UNREACHABLE マクロを利用するようにしています。

yui-knk: r65615 2018-11-08 09:36:35 +0900

NEWS ファイルに RubyVM::AST.of メソッドの追加について追記しています。

shyouhei: r65616 2018-11-08 10:43:07 +0900

st_hash_uint() の宣言で Undefined Behavior Sanitizer のチェックを抑制する NO_SANITIZE() で unsigned int overflow のチェックをしないようにしています。

nobu: r65617 2018-11-08 10:57:03 +0900

compile.c で AST からのコンパイル時にローカル変数のテーブルのインデックスがみつからなかった時と、inline cache のテーブルのインデックスも不正だったに rb_bug() で強制終了してたのを CompileError 例外発生にするようにしています。普通にスクリプトを parse した結果だと起きないはずですが AST をどこかからもってきて compile みたいな黒魔術がそろそろ入るってことかな。

nobu: r65618 2018-11-08 11:25:44 +0900

Rational のパースで read_num() という関数で割る数(10の累乗)を引数のポインタに書き戻してたのを、指数だけ指定するようにして不要に大きな Bignum を生成しなくてすむようにしています。また極端に絶対値小さい浮動小数点数表現の文字列(Float にした時に 0 になるようなの)を Rational() で変換した時に例外になってたのを 0 になるようにしています。

normal: r65619 2018-11-08 12:27:16 +0900

拡張ライブラリ socket の wait_connectable() で getsockopt() で socket のエラー情報を取得して EHOSTUNREACH, ECONNREFUSED, EISCONN, EALREADY などのエラーを検出したらエラーを返すようにしています。socket を non-blocking で開いた時に必要とのこと。 [ruby-core:88305] [Bug #14968]

k0kubun: r65620 2018-11-08 13:06:15 +0900

標準添付ライブラリ net/ftp のテストで --jit-wait つきのテスト時にタイムアウトすることがあるので MJIT 有効時の read_timeout を伸ばしています。

shyouhei: r65621 2018-11-08 13:24:26 +0900

st.c の st_locale_insensitive_strcasecmp() という関数でキーに大文字小文字の区別をしない文字列を使ったテーブルのキーの比較関数を 'a' または 'A' からのオフセットにして比較してたのを直接 char 型で文字のままで、大文字だったら小文字に変換して比較するようにしています。

ko1: r65622 2018-11-08 14:01:23 +0900

Thread の実体である構造体 rb_thread_t の first_proc, first_args, first_func などのメンバーを invoke_arg という共用体にまとめて、Thread の生成が Thread.start などのメソッドで行なわれてブロックを実行するのか rb_thread_create() で C の関数ポインタを渡して作ったかの種別を invoke_type というメンバーに格納しておくようにしています。また引数を格納した配列オブジェクト invoke_args.args のサイズが小さい(8未満)時には ALLOCA_N() でスタック上にメモリ領域を確保してここにコピーして配列オブジェクトは破棄されるようにしています。また rb_thread_create() で引数に渡される void * 型の引数は GC の mark 対象ではなかったのですが、VALUE をキャストして渡してて mark されることを期待したテストが rubyspec にあったそうで、本来の意図とは違うのですが mark 対象に追加しています。

svn: r65623 2018-11-08 14:01:30 +0900

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

shyouhei: r65624 2018-11-08 14:06:52 +0900

st.c と util.c で while(n--) みたいなデクリメント演算子を使った while 文を for 文を使った記法に変更しています。特に不具合ではないのですが変数の型が unsigned なのでループを抜けた後に↑ の例だと変数 n が 0 から1デクリメントされてオーバーフローしてしまうのでこれを避けようということみたいです。

shyouhei: r65625 2018-11-08 14:24:07 +0900

r65624 の書き換えで for 文のカウンタ変数の型を上限との比較のために int から size_t に変更。 util.c のほうはいいのかな?

k0kubun: r65626 2018-11-08 14:34:36 +0900

.travis.yml の build matrix の ruby 2.3 で rubyspec を実行させるテストの名前をすこし変更。

shyouhei: r65627 2018-11-08 14:34:58 +0900

r65624 および r65625 の while 文から for 文への書き換えを revert しています。 CI でエラーがあったとのこと。ほう。

ko1: r65628 2018-11-08 14:35:46 +0900

Init_postponed_job() を Init_vm_postponed_job() と改名して Init_vm_trace() の中から呼び出してたのを inits.c の各種 Init_xxx() を呼んでいるところから呼ぶようにしています。 postpone job は Transient Heap 機能で利用しているので先に初期化するようにしているそうです。 GC.stress = true の環境で SEGV してたそうです。 [ruby-core:89745] [Bug #15288]

k0kubun: r65629 2018-11-08 15:19:36 +0900

rubygems の lib/rubygems/indexer.rb で gem 'builder' した時の例外として LoadError を捕捉していましたが、Bundler::GemfileNotFound も捕捉するようにしています。 require 'bundler/errors' が LoadError になった時は例外クラス自体が参照できないのでその場合も考慮しています。

shyouhei: r65630 2018-11-08 15:22:57 +0900

r65624 および r65625 の while(n--) の for 文への書き換えのリトライ。今度は util.c のほうもカウンタ変数を size_t にしています。

k0kubun: r65631 2018-11-08 15:26:21 +0900

r65622 の変更で rb_thread_t の列挙型のメンバ invoke_type の宣言で最後の要素の後にカンマがあったので、古いコンパイラでもビルドできるようにカンマを削っています。

shyouhei: r65632 2018-11-08 16:41:24 +0900

T_HASH 型オブジェクトで要素数が小さくて配列を使って実装してる状態でサイズを減らす HASH_ARRAY_SIZE_DEC() で HASH_ARRAY_SIZE_ADD() を使って実装してたのですが、-1 を加算するのは、RHASH_ARRAY_SIZE() が unsigned な型であるため -1 との加算で -1 が 0xFF...FF に変換されて、結果的には2の補数で整数が表現されてて大丈夫なはずですが、移植性のため? に明示的に減算するようにマクロを書きかえています。

shyouhei: r65633 2018-11-08 18:46:09 +0900

gc.c の finalize_list() でも size_t 型の objspace->heap_pages.final_slots をデクリメントしているところで0じゃないかのチェックを追加しています。

svn: r65634 2018-11-08 18:46:15 +0900

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

shyouhei: r65635 2018-11-08 18:52:14 +0900

st.c の st_rehash_indexed() でも st_table::entries の要素を取り出す処理を EMPTY_OR_DELETED_BIN_P(bin) が偽の時には bin - ENTRY_BASE すると st_index_t 型の unsigned の bin より大きい数を引くことになってしまう可能性があるので条件分岐後に参照するように修正しています。