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_name()、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 修正。