ruby-trunk-changes r53363 - r53375

今日は標準添付ライブラリ resolv.rb の frozen string literal による不具合修正、-w/-W オプションの優先度の修正、OpenStruct を Psych でロードした時の不具合修正、timer thread の起動失敗時の不具合修正などがありました。

normal: r53363 2015-12-29 05:31:10 +0900

標準添付ライブラリ resolv.rb には r52571 で frozen_string_literal: true の magic comment を追加したので、破壊的に利用する文字列リテラルに .b をつけて(String#b は dup+force_encoding("ASCII-8BIT") 相当なので dup される)います。 [ruby-core:72559] [Bug #11910]

normal: r53364 2015-12-29 06:52:15 +0900

thread_sync.c のクラスを保持する変数を static 変数に変更して外部に公開しないようにしています。

mrkn: r53365 2015-12-29 10:37:20 +0900

標準添付ライブラリ mkmf のテストに -DHAVE_RUBY_INIT というオプションが $defs に含まれていることを確認する assertion を追加しています。

nobu: r53366 2015-12-29 12:48:36 +0900

標準添付ライブラリ ostruct で OpenStruct.allocate を new の alias として定義するようにしています。 Psych.load で YAML にダンプされたものをロードした時の respond_to? の呼び出しで @table が nil の状態で respond_to_missing? に委譲されて NoMethodError になるという問題の対策みたいです。 [ruby-core:72501] [Bug #11884]

nobu: r53367 2015-12-29 17:36:22 +0900

compile.c でコンパイル後の位置調整のための ADJUST という要素を作る new_adjust_body() で LABEL_REF() を呼び出してラベルの参照カウンタをインクリメントしておくようにしています。どういう問題を引きおこしていたのか不明ですがなにやら重要そうな変更ですね…。

nobu: r53368 2015-12-29 17:54:18 +0900

Refinements の using にブロックが渡されていたら警告メッセージを出力するようにしています。特に無名モジュールの時に Module.new へのブロックじゃない? というようなことが書かれているところをみると

using Module.new do |mod| ... end

のように書いた時にブロックが Module.new ではなく using に渡されてしまっているのを警告しようとしているみたいですね。

nobu: r53369 2015-12-29 19:12:48 +0900

コマンドラインオプションの -W で環境変数 RUBYOPT で渡されたオプションを上書きできるようにしています。これまで環境変数の指定のほうが強かったのかー。

nobu: r53370 2015-12-29 19:39:53 +0900

r53369 の再修正。コマンドライン引数 -W のパース時に既に -w や -W が設定済みでも、引数を解釈するのはやっておくようにしています。2つ目以降の -W は引数を未処理で残してしまっていたみたいです。

nagachika: r53371 2015-12-29 21:17:21 +0900

r53366 の ChangeLog エントリが重複していたのを削除。

nobu: r53372 2015-12-29 21:23:04 +0900

r53369 や r53370 のさらに再修正で、コマンドラインに複数の -w や -W オプションがあった時に、後に渡されたオプションで指定を上書きできるように cmdline_options::warning への代入は最後にまとめて行うようにしています。

normal: r53373 2015-12-30 03:20:27 +0900

timer thread の起動に失敗した時に timer thread への通知用 pipe の構造体 timer_thread_pipe の owner_process の設定が先に行なわれているので、close された pipe へ書き込んでしまうという race condition が起こり得るようになっていたので、rb_thread_create_timer_thread() の中で起動成功後にセットするようにしています。もっとも timer thread が起動できないという時点でもうどうしようも…と思ったら rb_thread_create_timer_thread() は timer thread を作るのに失敗しても警告を出力するだけで動き続けるようですね。なるほど、タイマー割り込みやシグナルはきかなくなるけどブロックしたら context switch は起きるので、そこそこは動くのかも。 [ruby-dev:37934] [ruby-core:72590] [Bug #11922]

svn: r53374 2015-12-30 03:20:33 +0900

version.h の日付更新。

nagachika: r53375 2015-12-30 04:26:52 +0900

rb_thread_create_timer_thread() で pthread_create() が失敗した時に pthread_attr_destroy() を呼ばずに返していたので、pthread_create() の呼び出し直後に破棄しておくようにしています。