Hatena::ブログ(Diary)

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

2016-05-30 ruby-trunk-changes r55207 - r55224

[][]ruby-trunk-changes r55207 - r55224

今日は Addrinfo が NUL 終端していない文字列でうまく動かない(現状は表面化しない)不具合の修正や、拡張ライブラリ openssl の ECDH の鍵の指定方法の変更などがありました。

nobu: r55207 2016-05-30 14:18:16 +0900

variable.c の check_autoload_required() の feature の文字列サイズのチェックで RSTRING_LEN() をみるべきところ RSTRING_PTR() をみていたのを修正しています。

nobu: r55208 2016-05-30 14:41:02 +0900

String#[ ] と String#byteslice で引数評価の順序を固定するために rb_str_substr() の引数にそのまま NUM2LONG() を渡していたのを一旦ローカル変数に受けてから渡すようにしています。

nobu: r55209 2016-05-30 14:50:27 +0900

rb_str_substr() から str_substr() という関数を切り出し、というかほぼ完全にコピーして、引数 empty を追加してこれが偽の時には結果が空の文字列になる時には文字列オブジェクトを作らずに Qnil を返すようにして内部的にはこちらを利用してい不要なオブジェクト生成を抑制するようにしています。

nobu: r55210 2016-05-30 14:54:59 +0900

拡張ライブラリ stringio で StringIO から読み込む時に内部のバッファ文字列から部分文字列を常に新しく生成するのではなく rb_str_subseq() を使って可能なら(現状だと文字列末尾の場合)バッファを共有するようにしています。

nobu: r55211 2016-05-30 15:12:13 +0900

拡張ライブラリ socket の Addrinfo のテストに "<any>" と "<broadcast>" という特殊なホスト名(それぞれ "0.0.0.0" と "255.255.255.255" になる)についてのテストを追加しています。

nobu: r55212 2016-05-30 16:20:28 +0900

str_fill_term() で引数文字列先頭ポインタではなく、拡張したり複製したりした新しい文字列バッファを返すように修正しています。これは不具合修正かな?

nobu: r55213 2016-05-30 16:28:55 +0900

現状では部分文字列文字列の末尾のみ共有できるようになっていて、これは String オブジェクトバッファは拡張ライブラリの互換性のために NUL 文字終端するようにしているからなのですが、SHARABLE_MIDDLE_SUBSTRING というマクロを 1 にすると、文字列の途中も共有可能にして NUL 終端しないようにするのですが、そうすると拡張ライブラリ socket の Addrinfo で strcmp(3) や strlen(3) を使っていてうまく動かないところがあったので修正しています。

rhe: r55214 2016-05-30 18:30:38 +0900

拡張ライブラリ opensslOpenSSL::SSL::SSLContext の #tmp_ecdh_callback= は deprecate にして、利用すると警告が出るようにしています。 OpenSSL の SSL_CTX_set_tmp_ecdh_callback() という関数自体が削除される予定なんだそうです。2.3 から入った機能だったので短い命だった。 ECDH では SSL_CTX_set_ecdh_auto() を使って自動的にサーバクライアントで利用できる鍵の仕様を決定するようにしています。

duerst: r55215 2016-05-30 20:00:26 +0900

String#downcase の rdoc 用コメントに省略可能な引数 :ascii/:turkic/:lithuanian/:fold について追記しています。

nobu: r55216 2016-05-30 20:23:32 +0900

r55213 で NUL 終端を期待しないように修正した Addrinfo のテストで "0001.0001.0001.0001" のような書きかたの IP アドレスで各数値が 8進数と解釈されたり10進数として解釈されたりが実装依存なので、影響を受けないように 127.0.0.1 を使ってたのを 1.0.0.1 を使うようにしています。0 で padding しているのは、 embed string にならないようにサイズを増やすためでしょうね。

duerst: r55217 2016-05-30 21:15:41 +0900

String#upcase, #upcase!, #downcase!, #capitalize, #capitalize!, #swapcase, #swapcase! の rdoc 用コメントにも省略可能な引数について追記して、 r55215 で追記した String#downcase の説明を参照させるようにしています。

usa: r55218 2016-05-30 21:51:14 +0900

r55213 および r55216 の Addrinfo のテストで 0埋めで文字列を伸長するのではなくて "127.0.0.1xxxxxxx..." と末尾に文字を付加して、この部分を base_str[0,9] で切り出して使うようにしています。この場合って結果の文字列のサイズが小さいと embed string にならないんでしたっけ。

rhe: r55219 2016-05-30 22:02:13 +0900

拡張ライブラリ openssl で時刻を表す数値を time_t 型に変換する時に NUM2LONG() ではなく NUM2TIMET() を利用するように修正しています。 [ruby-core:45552] [Bug #6571]

nobu: r55220 2016-05-30 23:05:36 +0900

拡張ライブラリ socket の Addrinfo で文字列が長過ぎる時の例外メッセージに size_t 型の値を埋め込む時に %ld ではなく PRIdSIZE を利用するようにしています。

nobu: r55221 2016-05-30 23:07:01 +0900

r55195 で File#flock のテストを強化した時に flock を呼ぶ時の open の mode を "r+" にして書き込み可能な開きかたをするようにしています。

usa: r55222 2016-05-31 00:33:06 +0900

拡張ライブラリ socket の Addrinfo で渡された文字列に NUL 文字が途中に含まれていた場合を考慮して StringValueCStr() を使って NUL までの文字列を切り出して使うように修正しています。

svn: r55223 2016-05-31 00:33:07 +0900

version.h の日付更新。

rhe: r55224 2016-05-31 01:52:10 +0900

r55214 で追加した拡張ライブラリ opensslOpenSSL::SSL::SSLContext#ecdh_curves= のテストで渡す curve のリストを変更しています。 RHEL だと P-224 という種類は利用できないそうです。

2016-05-29 ruby-trunk-changes r55195 - r55206

[][]ruby-trunk-changes r55195 - r55206

今日は正規表現まわりの最適化などがありました。

nobu: r55195 2016-05-28 19:45:48 +0900

File#flock のテストで呼び出しがエラーにならないかだけチェックしていたのを、ちゃんとロック取得のためにブロックするケースで止まってるかを timeout を使ってチェックするようにしています。

duerst: r55196 2016-05-28 20:34:20 +0900

test/test_unicode_normalize.rb でも r55193 と同様に Unicode のデータファイルが存在するかのテストを追加しています。また文字列に破壊的変更を加える unicode_normalize! というメソッドを直に呼び出していたところで dup するようにしています。

nobu: r55197 2016-05-28 20:40:58 +0900

misc/ruby-additional.el で ruby-insert-heredoc-code-block という関数を追加して、ヒアドキュメントブロックを追加できるようにしています。 assert_separately 用とのこと。

nobu: r55198 2016-05-29 12:08:45 +0900

テスト用の拡張ライブラリ群 ext/-test-/* の extconf.rb がだいたい同じことやっているのでそのメソッドを ext/-test-/auto_ext.rb というファイルに切り出しています。

svn: r55199 2016-05-29 12:08:46 +0900

version.h の日付更新。

nobu: r55200 2016-05-29 13:10:28 +0900

win32/win32.c の RUBY_CRITICAL() というマクロ引数をなくして、実質なにもしないようにしています。これまでも、実質引数の C のブロックをそのまま展開してるだけでなにもしてなかったので、デバッガで扱いやすくするためみたいです。このマクロかなり古いものみたいだけど、もう不要みたいですね。

nobu: r55201 2016-05-29 19:18:20 +0900

rb_exc_set_backtrace() の宣言を vm_core.h に追加してソースファイルで個別に宣言していたのをやめています。

naruse: r55202 2016-05-29 22:56:38 +0900

regexec.c の match_at() で mem_start_stk というメモリ領域の初期化をしている処理が共通だったので #ifdef USE_SUBEXP_CALL の分岐の外に出して、さらにループ内で飛び飛びのアドレスを初期化していたのを連続した2つずつ初期化するようにしています。最適化がききやすくしているのだと思います。

naruse: r55203 2016-05-29 22:58:45 +0900

regexec.c で ONIGENC_IS_MBC_ASCII_WORD() というマクロを再定義していて、encoding が ASCII-compatible なら ISALNUM() と "_" との比較だけで済ませるようにして高速化を図っています。

usa: r55204 2016-05-30 00:10:44 +0900

r55198 で追加した ext/-text-/auto_ext.rb で create_makefile に渡す feature 名の切り出しかたがまちがっていた("-test-/" を含んでなかった)のを修正しています。

svn: r55205 2016-05-30 00:10:44 +0900

version.h の日付更新。

nagachika: r55206 2016-05-30 03:28:39 +0900

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

2016-05-28 ruby-trunk-changes r55185 - r55194

[][]ruby-trunk-changes r55185 - r55194

今日は opensslOpenSSL::SSL::SSLSocket の実装の変更や bundled gem のバージョン更新などがありました。

hsbt: r55185 2016-05-28 10:26:21 +0900

標準添付ライブラリ cgiCGI.escapeHTML の rdoc 用コメントでエスケープ対象の文字にシングルクオートを追記しています。 https://github.com/ruby/ruby/pull/1363

svn: r55186 2016-05-28 10:26:22 +0900

version.h の日付更新。

duerst: r55187 2016-05-28 10:37:49 +0900

r55168 で追加した casefold のテストで unicode のデータファイルがない時にエラーにならないようにスキップするようにして、かわりにファイルの存在チェックをするテストを追加しています。

duerst: r55188 2016-05-28 10:39:48 +0900

r55187 のテスト修正についての ChangeLog エントリを追加しています。

hsbt: r55189 2016-05-28 10:46:27 +0900

ATARI ST というプラットフォームのサポートを打ち切っています。そんなのあったのか。コミット読みを始めてから ATARI 用という変更はみたことない気がする。 https://github.com/ruby/ruby/pull/1350

hsbt: r55190 2016-05-28 10:47:44 +0900

gems/bundled_gems のバージョンの指定を power_assert を 0.3.0, test-unit を 3.1.9, minitest を 5.9.0, did_you_mean を 1.0.1 にそれぞれ更新しています。

rhe: r55191 2016-05-28 14:00:36 +0900

拡張ライブラリ opensslOpenSSL::SSL::SSLSocket の #initialize メソッドの実装を C 実装にして、オブジェクト初期化時に OpenSSLSSL 構造体を初期化するようにしています。これまで SSL初期化するのが OpenSSL::SSL::SSLSocket#accept や #connect で実際に接続をはるタイミングまで遅延されていて、この影響で OpenSSL::SSL::SSLSocket#hostname= に不正な値を代入した場合にそれを検出して例外を発生させるのが #hostname= を呼んだ時点ではなくて #connect した時点にずれるという問題があったのを修正しているようです。なるほどなー。実にわかりやすいコミットログでした。 [ruby-dev:49376] [Bug #11724]

nobu: r55192 2016-05-28 14:33:52 +0900

r55185 と r55189 の ChangeLogtypo 修正。

duerst: r55193 2016-05-28 19:08:37 +0900

r55187 の Unicode 用のデータファイルが存在しているかどうかのチェックのテストで共通部分を括り出して、専用の assertion を定義してエラー時のメッセージをわかりやくしています。

svn: r55194 2016-05-28 19:08:37 +0900

r55193 の行末の空白除去。

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_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 修正。

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]