Hatena::ブログ(Diary)

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

2016-05-27 ruby-trunk-changes r55176 - r55184

[][]ruby-trunk-changes r55176 - r55184

今日は rb_scan_args() のマクロ版の再修正や String#encode の修正、Module#constants の不具合修正などがありました。

nobu: r55176 2016-05-27 00:39:43 +0900

r55174 の古い clang の警告除去のための fmt"\0\0\0\0\0\0" の連結を rb_scan_args() のマクロ定義の時点で行うようにしています。また古い clang では条件分岐のコンパイル時の考慮が未熟で完全にチェックできないので、そのような場合でもゼロ除算を行うことで実行時に不定値を返すようにしています。実際にはこれなにが起きるんだろう。

svn: r55177 2016-05-27 00:39:44 +0900

version.h の日付更新。

naruse: r55178 2016-05-27 01:51:49 +0900

symbol.c の is_identchar()、is_special_global_neme()、rb_enc_symname_type() などのマクロ/関数で文字の種別を判定するのに rb_enc_is{alnum,digit,alpha}() などのエンコーディングを考慮した関数を利用していましたが、この場所では single byte の文字しか扱っておらず ASCII 互換なエンコーディングしか使えないはずなので、速度のために ISALNUM() や ISDIGIT() などの標準のマクロを利用するようにしています。

nobu: r55179 2016-05-27 14:44:52 +0900

r55176 の rb_scan_args() のマクロ定義で展開する変数名をまちがえていたのを修正。

nobu: r55180 2016-05-27 15:07:34 +0900

rb_scan_args() のマクロ定義で fmt"\0\0\0\0\0\0" と NUL 文字の文字列と連結していたのをやめています。 fmt が文字列リテラルじゃない時にコンパイルエラーになるからとのこと。__builtin_constant_p() で fmt が定数なのは確認しているけど、分岐ではないから引数は先に評価されてしまうということかな。また rb_scan_args_verify() で _Pragma() を使って部分的に警告を抑制するようにしています。またマクロ群を inline 関数に変換しています。ちょっと読みやすくなったかも。

nobu: r55181 2016-05-27 17:09:46 +0900

Encoding に対して不正な文字を含む文字列を String#encode で str.encode("UTF-8", "UTF-8") のように source encoding も指定して変換すると :invalid や :replace のオプションによる不正な文字の処理が働かないというチケットの対応で、String#encode で変換前後の encoding に同じものが指定された時に scrub する場合に、文字列自体の Encoding について行うのではなく、指定された Encoding を基準として scrub するようにしています。 文字列の Encoding と指定された source encoding が異なるというのが使いかたがまちがっているような気はしますけどね。 [ruby-core:75732] [Bug #12431]

nobu: r55182 2016-05-27 17:38:50 +0900

Module#constants の省略可能引数に false を渡すと、大文字で始まらない識別子の内部的な隠し定数まで返してしまう不具合を修正しています。 [ruby-core:75575] [Bug #12389]

nobu: r55183 2016-05-27 20:43:23 +0900

Process.abort の rdoc 用コメントの call-seq の呼び出し例で Process::abort を Process.abort に修正しています。 Kernel::abort はいいのかな。

kazu: r55184 2016-05-27 22:13:08 +0900

r55180 の ChangeLog エントリの typo 修正。

2016-05-26 ruby-trunk-changes r55166 - r55175

[][]ruby-trunk-changes r55166 - r55175

今日は openssl の不具合修正や rb_scan_args() のマクロ版の警告除去などがありました。

eregon: r55166 2016-05-26 05:01:24 +0900

rb_define_class() の rdoc 用コメントの super が NULL の時の記述の修正と、再定義で super が異なる場合の例外を NameError から TypeError に修正しています。

svn: r55167 2016-05-26 05:01:25 +0900

version.h の日付更新。

duerst: r55168 2016-05-26 09:45:44 +0900

Unicode文字列の downcase, upcase, capitalize の時の casefold をチェックするテストを追加しています。 enc/unicode/data にダウンロードした UnicodeData, CaseFolding, SpecialCasing などのデータを元に自動的にテストを生成するようにしています。

svn: r55169 2016-05-26 09:45:45 +0900

r55168 の行末の空白除去。

svn: r55170 2016-05-26 09:45:45 +0900

r55168 で新規追加されたファイルの svn property 設定。

nobu: r55171 2016-05-26 10:30:31 +0900

rb_scan_args() のマクロ版の実装で clang での警告を除去するため fmt を fmt[i] と配列としてアクセスしていたのを *(""fmt+i) とポインタとしてアクセスするようにしています。文字列リテラルと連結させるようにしているのはなんでだろ。

nobu: r55172 2016-05-26 14:11:07 +0900

r55171 を revert しています。clang で文字列整数演算で別の警告が出てしまったそうです。

nobu: r55173 2016-05-26 14:13:54 +0900

rb_scan_args() のマクロ版の fmt 文字列のチェックを修正。もうすごすぎて読む気力も出ませんが、引数の数のカウンタとサイズチェックを同時にするようにマクロ群に引数を追加しています。

nobu: r55174 2016-05-26 14:16:04 +0900

rb_scan_args_count() で clang での警告除去のため rb_scan_args_count_var() と rb_scan_args_count_opt() に渡す fmt に fmt"\0\0\0\0" のように余分な NUL 文字を連結しておくようにしています。

rhe: r55175 2016-05-26 14:24:58 +0900

拡張ライブラリ opensslOpenSSL::PKey::{DH,DSA,RSA}#size で NULL になる可能性のあるポインタにチェックなしにアクセスしていたところを修正しています。 [ruby-core:75720] [Bug #12428]

2016-05-25 ruby-trunk-changes r55148 - r55165

[][]ruby-trunk-changes r55148 - r55165

今日は拡張ライブラリ opensslOpenSSL の 0.9.8 以上をサポート対象とするように対象のバージョンの引き上げや、正規表現コンパイル時の不具合修正などがありました。

nobu: r55148 2016-05-25 00:21:53 +0900

r55142 のコンパイラオプション -fexcess-precision=standard や -fp-model precise を ruby_cflags に入れるようにしていたのを XCFLAGS に追加して、ruby 本体のビルドにのみ利用するようにしています。 [ruby-core:75658] [Bug #12409]

svn: r55149 2016-05-25 00:21:54 +0900

version.h の日付更新。

nobu: r55150 2016-05-25 00:23:06 +0900

rb_scan_args_set() で引数の数のチェックを最後の option 引数の Hash のぶんを削ってから rb_check_arity() でチェックするようにして、引数の数が間違っている時に余計な option 引数の処理をスキップできるようにしています。

rhe: r55151 2016-05-25 01:27:11 +0900

拡張ライブラリ opensslOpenSSL::PKey::EC#generate_key を #generate_key! に改名して、互換性のため #generate_key は alias として残しています。他の OpenSSL::PKey のクラスとメソッド名を一致させるため。 [ruby-core:45541] [Bug #6567]

rhe: r55152 2016-05-25 01:30:15 +0900

拡張ライブラリ opensslOpenSSL::PKey::EC.generate メソッドを追加しています。これも他の PKey と一致させるため。また OpenSSL::PKey::EC#initialize のエラーチェック強化もしています。 [ruby-core:45541] [Bug #6567]

duerst: r55153 2016-05-25 08:01:39 +0900

Unicode の casemap 処理のフラグで ONIGENC_CASE_UP_SPECIAL と ONIGENC_CASE_DOWN_SPECIAL の考慮が漏れていたところを修正しています。

naruse: r55154 2016-05-25 13:21:31 +0900

正規表現コンパイル時に compile_length_tree() を再帰的に呼び出しているところでエラーがかえってきた場合が考慮されていなかったので、例外を発生させるようにしています。 ある種の不正な正規表現Regexp.new で作ろうとすると SEGV することがあったようです。 [ruby-core:75694] [Bug #12418]

naruse: r55155 2016-05-25 13:21:32 +0900

regcomp.c に onig_is_prelude() という関数があって Thread::MUTEX_FOR_THREAD_EXCLUSIVE という定数の有無で prelude 内かどうか判定するようにしていて、デバッグ出力を抑制するようにしてましたが、これは削除しています。 現在 prelude で正規表現は使っていないとのこと。

nobu: r55156 2016-05-25 15:05:47 +0900

tool/fake.rb で RbConfig::CONFIG["buildlibdir"] にもビルドディレクトリを格納するようにしています。で RbConfig::MAKEFILE_CONFIG["libdirname"] には "buildlibdir" のほうを入れるようにしています。 mkmf.rb の MakeMakefile#configuration で builddir は filter されるからということですが、どこだろう。

nobu: r55157 2016-05-25 15:05:48 +0900

regcomp.c のデバッグ用の出力の条件を ONIG_DEBUG の定義から ONIG_DEBUG_COMPILE と ONIG_DEBUG_MATCH, ONIG_DEBUG_PARSE_TREE の定義と細かくわけています。

nobu: r55158 2016-05-25 17:11:36 +0900

r55144 の rb_scan_args_verify() の fmt 文字列のチェックをさらに分割しています。ちょっと読む気になれないですが cygwin でのビルドエラーの対処らしいです。 [ruby-core:75714] [Bug #12426]

nobu: r55159 2016-05-25 17:13:37 +0900

関数版のほう(従来版)の rb_scan_args() で fmt が数字2文字の時の n_trail の処理はその他の分岐の時の処理とまとめられるので不要な分岐と goto を除去しています。

rhe: r55160 2016-05-25 17:46:39 +0900

拡張ライブラリ openssl の extconf.rb で OPENSSL_FIPS マクロのチェックをして HAVE_OPENSSL_FIPS を定義していたのを削除して、OPENSSL_FIPS を直接 #ifdef でチェックするようにしています。

rhe: r55161 2016-05-25 17:46:40 +0900

ext/openssl/ossl.h と ext/openssl/openssl_missing.h から C++ の時に extern "C" { } でくくるようにしていたのを削除しています。これらのヘッダは openssl 内のソースからしか #include されないので不要だろうということで、まあそうですね。

rhe: r55162 2016-05-25 17:50:03 +0900

拡張ライブラリ openssl のサポート対象から OpenSSL 0.9.6 と 0.9.7 を外して 0.9.8 以降でないとビルドできないように static_assert の条件を引き上げています。これで不要になった have_func のチェックなどを整理しています。

naruse: r55163 2016-05-25 18:45:22 +0900

r55154 と似てますが、正規表現の文字クラスのところに \ooo で大きすぎる数値が書かれていた時に例外を発生させるようにして、SEGV などするのを防いでいます。いちおう 3文字までしか数字はみないようになっていますが 0400〜0777 の範囲を弾くようにしています。 [ruby-core:75702] [Bug #12420] [ruby-core:75709] [Bug #12423]

duerst: r55164 2016-05-25 19:07:19 +0900

Unicode の casemap 処理で DOTLESS_i の文字の upcase だけは専用の分岐を入れています。 folding に含まれてないからとのこと。

naruse: r55165 2016-05-25 20:51:37 +0900

r55163 の追加修正。 正規表現の文字クラスの \ooo による記述を unescape する時に高々3文字までしか数字をみないようにしています。 [ruby-core:75702] [Bug #12420] [ruby-core:75709] [Bug #12423]

2016-05-24 ruby-trunk-changes r55138 - r55147

[][]ruby-trunk-changes r55138 - r55147

今日は rb_scan_args() のマクロ版のさらなる最適化(というかコンパイル時チェック強化?)や、OpenSSL::Cipher#key=, #iv= に長すぎる文字列を渡した時の挙動の変更などがありました。

shyouhei: r55138 2016-05-24 12:43:59 +0900

common.mk の COMMONOBJS のファイル名を辞書順にソートして、依存関係を追加しています。 tool/update-deps で更新したみたいですね。

svn: r55139 2016-05-24 12:44:00 +0900

version.h の日付更新。

nobu: r55140 2016-05-24 16:20:55 +0900

configure で gcc 拡張の attribute をチェックする RUBY_FUNC_ATTRIBUTE() で __error__ と __warning__ の時にこれらに展開するマクロはメッセージも渡すのでそれを受け付けるようにしています。

nobu: r55141 2016-05-24 16:28:34 +0900

r55140 の続き。ERRORFUNC() や WARNINGFUNC() にメッセージの他に関数名というか宣言引数に受け付けるように修正しています。

naruse: r55142 2016-05-24 16:49:25 +0900

コンパイラオプション -fexcess-precision=standard や -fp-model precise を optflags ではなく cflags に追加するようにしています。 C++ の拡張ライブラリでうまくビルドできないことがあったようです。 [ruby-core:75658] [Bug #12409]

nobu: r55143 2016-05-24 17:18:47 +0900

include/ruby/defines.h に RUBY_FUNC_ATTRIBUTE() で ERRORFUNC() や WARNINGFUNC() が定義されなかった場合の代替マクロ定義を追加しています。

nobu: r55144 2016-05-24 18:52:14 +0900

rb_scan_args() のマクロ版でコンパイル時のチェックを強化するために format 文字列の内容をチェックするマクロを導入しています。なんかすごいことになってる…。ここにくる時に fmt はリテラルなので、コンパイル時に内容が決まっているはずなので、めちゃくちゃ頑張って展開しておいたらコンパイラコンパイル時にチェックしておいてくれる、というのを狙ったのかなと思います。

rhe: r55145 2016-05-24 21:39:57 +0900

拡張ライブラリ opensslOpenSSL の内部的に使うための M_ という prefix つきのマクロを使っていたところを M_ なしの外部から使うためのマクロ(関数?)を使うようにしています。これにより不要な OPENSSL_malloc()/OPENSSL_free() でのメモリ領域の確保/解放を削除しています。 参考URL: https://git.openssl.org/gitweb/?p=openssl.git;a=blob;f=CHANGES;h=bf61913d7b01212b4d8b2f3c13d71d645914f67c;hb=b6079a7835f61daa9fb2cbf9addfa86049523933#l878

rhe: r55146 2016-05-24 22:09:03 +0900

拡張ライブラリ opensslOpenSSL::Ciper#key= や #iv= で短すぎる文字列には例外を発生させていましたが、長過ぎる文字列が渡された場合に勝手に切り詰めて使っていたのを、この場合も例外を発生させるようにしています。

kazu: r55147 2016-05-24 23:00:53 +0900

r55138 の ChangeLog エントリの空白除去。

2016-05-23 ruby-trunk-changes r55120 - r55137

[][]ruby-trunk-changes r55120 - r55137

今日は拡張ライブラリ bigdecimalopenssl の不具合修正がありました。

normal: r55120 2016-05-23 08:09:38 +0900

Dir#close の rdoc 用コメントに重複した close で IOError が発生しなくなったことを追記しています。

[ruby-core:75679] [Bug #12413]

svn: r55121 2016-05-23 08:09:39 +0900

version.h の日付更新。

naruse: r55122 2016-05-23 12:23:24 +0900

array.c の rb_ary_fill() でローカル変数 item が未初期化で利用されるという警告(実際にはブロック渡しでない時のみ使われるので未初期化で使われることはないみたいですが、コンパイラにはわからない)を抑制するため Qundef で初期化しています。

nobu: r55123 2016-05-23 12:30:30 +0900

拡張ライブラリ bigdecimal の GetVpValueWithPrec() で Float::INFINITY や Fload::NAN と比較しようとすると FloatDomainError 例外が発生するのを抑制して、nil を返すようにしています。 GetVpValueWithPrec() で引数が Float の INFINITY だった場合を考慮するようにしています。 [ruby-core:75682] [Bug #12414]

nobu: r55124 2016-05-23 12:47:11 +0900

rb_scan_arg() のマクロ版から呼ばれる rb_scan_args0() で引数の数が一致しない場合 rb_raise() ではなく rb_fatal() で強制終了させるようにしています。

nobu: r55125 2016-05-23 13:19:43 +0900

r55124 の続き。 マクロ版の rb_scan_arg() で引数の数の不一致や fmt 文字列が期待した内容でない時は gcc 4.4 以降ではコンパイル時エラーにするようにしています。

nobu: r55126 2016-05-23 13:31:54 +0900

拡張ライブラリ tk の cbsubst_table_setup() で変数に volatile 修飾子をつけるかわりに RB_GC_GUARD() を使うように修正しています。

nobu: r55127 2016-05-23 13:31:55 +0900

拡張ライブラリ dbm, sdbm, tk などでもローカル変数の不要な volatile 修飾子を外しています。

nobu: r55128 2016-05-23 13:40:43 +0900

拡張ライブラリ tk引数を Fixnum に変換後に taint チェックしていたのを消しています。 nil や fixnum は tainted にならないからとのこと。

usa: r55129 2016-05-23 15:55:48 +0900

r55123 で拡張ライブラリ bigdecimal の Float::INFINITY などの対応をした時に isfinite() を呼んでいましたが Windows ではビルドできないので、finite() を呼ぶ代替マクロ定義を追加するようにしています。

nobu: r55130 2016-05-23 19:35:37 +0900

r55129 の ChangeLog エントリの typo 修正。

nobu: r55131 2016-05-23 19:45:13 +0900

r55125 で rb_scan_args0() で不正な fmt や引数の数の不一致をコンパイルエラーにしようとしたのを revert しています。拡張ライブラリ readline最適化で消えずにエラーになったみたいです。

rhe: r55132 2016-05-23 19:47:37 +0900

拡張ライブラリ opensslOpenSSL の RND_egd(), RND_egd_bytes() などの関数がエラー時に -1 を返すのに 0 をエラーとしてチェックしていたのを修正しています。また RND_pseudo_bytes() は 0 または -1 をエラーとして返すのでこれもチェック方法を修正しています。 0 は返す乱数暗号論的強度を持ってない時に返すみたいです。また -1 は関数がサポートされてない時に返すようです(RND_bytes() も同様)。 参考URL: https://www.openssl.org/docs/manmaster/crypto/RAND_bytes.html https://www.openssl.org/docs/manmaster/crypto/RAND_egd.html ついでに RND_bytes() を呼び出したエラー時の例外発生の処理を ossl_raise() を使うようにリファクタリングしています。 [ruby-core:63795] [Bug #10053]

usa: r55133 2016-05-23 20:21:11 +0900

r55129 の続き。 HAVE_ISFINITE のチェックでは不十分だったようで cygwin で警告が出るそうなので defined(isfinite) で直接 isfinite のマクロ定義がないかもチェックするようにしています。 [ruby-core:75691] [Bug #12417]

rhe: r55134 2016-05-23 20:40:07 +0900

拡張ライブラリ openssl で NUL 文字終端が期待されている文字列を渡すところでは StringValueCStr() で変換するようにしています。また例外メッセージへの埋め込み時に PRIsVALUE を利用して VALUE のまま埋め込むようにしています。

rhe: r55135 2016-05-23 21:10:38 +0900

拡張ライブラリ openssl の Init_openssl() で ossl_raise() を利用するより前にグローバル変数 dOSSL の初期化を行うようにして初期化前に利用されるのを避けるようにしています。 [ruby-core:58264] [Bug #9101]

nobu: r55136 2016-05-23 21:33:39 +0900

r55136 からの続きで拡張ライブラリ bigdecimal で isfinite() がない時に finite() を使うようにマクロ定義していた部分を include/missing.h に移動しています。 numeric.c にも同様の定義があったのでこれも移動しています。 HAVE_FINITE のチェックはしなくていいのかな。

kazu: r55137 2016-05-23 22:26:22 +0900

ChangeLog エントリのインデント修正。