ruby-trunk-changes r60948 - r60964

今日は Kernel#pp の prelude 入りにまつわる race condition 修正や psych の 3.0.0 への更新、prelude.rb の C ソースへの埋め込み方法の変更などがありました。

mame: r60948 2017-12-01 09:41:17 +0900

r60944 で prelude.rb に Kernel#pp の定義を追加した時に標準添付ライブラリのほうの lib/pp.rb で Kernel#pp を定義する時に一旦 undef するようにしていましたが、undef 直後に再定義する前に別の Thread で pp が呼ばれると NoMethodError になる可能性があったので alias で一旦別名をつけてから再定義してその後別名のほうを undef するようにしています。へーこうすると警告が抑制できるのか。

svn: r60949 2017-12-01 09:41:18 +0900

version.h の日付更新。

usa: r60950 2017-12-01 10:29:50 +0900

r60873 で prelude.rb を埋め込む前にコメント行を削っていたのをやめています。警告やエラー発生時に行番号がずれてどこかわかりにくくなるのでそれを避けるためみたいです。

hsbt: r60951 2017-12-01 10:52:26 +0900

拡張ライブラリ psych の 3.0.0 をマージしています。 r60917 で YAML.load に追加したキーワード引数 symbolize_names を YAML.safe_load にも追加しています。

nobu: r60952 2017-12-01 12:54:49 +0900

prelude.rb で Kernel#pp および Binding#irb の定義をしたところで、再定義時の警告除去のため alias irb irb のように自分自身に alias することで警告抑制しています。バグ技っぽいですね。

nobu: r60953 2017-12-01 12:54:50 +0900

template/prelude.c.tmpl で prelude.rb の内容を C のソースコードに埋め込む時に、C89 の規格上の文字列リテラルのサイズ制限があるみたいで、char の配列をメンバーに持つ構造体と、その初期化子という形に分解するようにしているようです。またコメント行は埋め込まず C のソースのコメントとして残すようにしています。差分読んでもわからなかったので実際に make prelude.c して再生成してみました。

hsbt: r60954 2017-12-01 13:25:32 +0900

doc/standard_library.rdoc と doc/maintainers.rdoc に bundler について追記しています。

nobu: r60955 2017-12-01 13:27:32 +0900

prelude.c.tmpl で prelude.rb 内の C のコメントになってしまう /* や */ はエスケープして埋め込むようにしています。

hsbt: r60956 2017-12-01 13:39:49 +0900

doc/maintainers.rdoc に各ライブラリの upstream のリポジトリの URL を追記しています。

usa: r60957 2017-12-01 14:32:29 +0900

rb_write_error2() で Windows 環境向けに端末に出力する時は rb_w32_write_console() を呼ぶ処理を追加しています。

yui-knk: r60958 2017-12-01 15:32:59 +0900

メソッド呼び出し時のキーワード引数の名前の NODE_LIT の範囲を、引数の値の部分まで含めてしまっていたので ":" までにするように修正しています。

mrkn: r60959 2017-12-01 17:35:58 +0900

NEWS ファイルの net/http の変更点が組込みクラスのセクションにあったので標準添付ライブラリのところに移動しています。

yui-knk: r60960 2017-12-01 18:48:17 +0900

メソッド呼び出しのキーワード引数の NODE_HASH の位置情報の範囲が、引数全体になってたのを修正しています。

akr: r60961 2017-12-01 19:48:29 +0900

Kernel#pp の再定義ですが、まだ race condition があったようで、lib/pp.rb で Kernel module の再定義を module PP の定義後に行うようにしています。なるほどー Kernel#pp の再定義は終わったけどまだ PP が定義される前に再定義された Kernel#pp を別 Thread で呼ばれてしまうと今度は定数 PP が未定義のエラーになるんですね。

nobu: r60962 2017-12-01 21:00:09 +0900

vm_trace.c の rb_suppress_tracing() で tracing という変数は ec->trace_arg のチェックで代替できるとのことで変数を削除しています。

nobu: r60963 2017-12-01 21:00:10 +0900

vm_trace.c の rb_suppress_tracing() で clobbered の警告除去のため変数 ec や vm の宣言に const を追加し EC_EXEC_TAG() の分岐に else 節を追加しています。こういう回避のしかたははじめて見たような気がする。

k0kubun: r60964 2017-12-01 21:26:40 +0900

r60558 で削除されてた rb_frame_method_id_and_class() を復活させて、deprecated にマークするようにしています。 誰も使ってないと思ったけど rbtrace で利用していたみたいです。