Hatena::ブログ(Diary)

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

2014-10-30 ruby-trunk-changes r48189 - r48197

[][]ruby-trunk-changes r48189 - r48197

今日はブロックに lambda で作った Proc オブジェクトを渡した時の yield での呼び方に扱いについての仕様変更がありました。

nobu: r48189 2014-10-29 23:24:24 +0900

r48188 でメソッド引数デフォルト値の式にその引数自身があったら警告するようにした変更で、式にブロックつきメソッド呼び出しがあってその中に引数が登場した時にも警告するようにしています。 [ruby-core:65990] [Bug #10314]

nobu: r48190 2014-10-30 00:01:49 +0900

r48188 の引数デフォルト値に引数自身が現れた時の警告で、ブロックの引数やブロック変数で遮蔽された時には警告しないようにしています。なかなか大変ですなぁ。 [ruby-core:65990] [Bug #10314]

svn: r48191 2014-10-30 00:01:58 +0900

version.h の日付更新。

nobu: r48192 2014-10-30 09:47:58 +0900

NUM2CHR() (が呼び出してる rb_num2char_inline()) で TYPE() で方をチェックしているところを RB_TYPE_P() を利用するようにしています。このために RB_TYPE_P() のinclude/ruby/ruby.h 内での定義位置を前のほうへ移動しています。

nobu: r48193 2014-10-30 11:16:15 +0900

lambda や ->() で作られた Proc オブジェクト(lambda 型)は引数の arity チェックが厳格で、return 文の解釈が変化する(break 扱いになる)という違いがありますが、lambda 型の Proc オブジェクトをブロックとしてメソッド呼び出しした時に、yield に配列を渡しても splat されずにエラーになっていたのを、to_ary で変換して引数に受け取れるようにしています。

# yield x, y と複数の値を渡せば(lambdaの引数と一致すれば)OK
def m1
  yield 0, 1
end

m1(&->(a, b) { p [a, b] }) # => [0, 1]

# yield [x, y] みたいに配列(や配列に変換できるオブジェクト)は ArgumentError だった
def m2
  yield [0, 1]
end

m2(&->(a, b) { p [a, b] }) # => ArgumentError: wrong number of arguments (1 for 2)

これが m2 も変換されてエラーにならなくなりました。

おお、これメソッド定義側で呼び元でどっちが渡されたかを想定しないといけないので微妙、というか非常に使いずらい点でしたが、仕様変更されましたね。 [ruby-core:65887] [Bug #9605]

duerst: r48194 2014-10-30 13:23:27 +0900

tool/downloader.rb で unicode 用のデータをダウンロードする時の URL を変更しています。latest を指していたのを Unicode 7.0.0 とバージョンを指定したパスを参照するようにしています。

nobu: r48195 2014-10-30 15:33:11 +0900

拡張ライブラリ tk で 数値か数値を表す文字列を受け取るところで NUM2CHR() を用いることで分岐を消しています。 ふーむ、これ RARRAY_PTR() でバッファアクセスしてる配列のサイズチェックされてるのかなぁ。この関数内ではしていないような気がするけど……。

nobu: r48196 2014-10-30 16:39:51 +0900

tool/downloader.rb でダウンロードする Unicode 関係のファイルは Unicode のバージョン番号のサブディレクトリの下に配置するようにしています。バージョン番号は common.mk で UNICODE_VERSION = 7.0.0 として定義しています。

naruse: r48197 2014-10-30 18:48:59 +0900

r48058 で make に ALWAYS_UPDATE_UNICODE=yes と変数を渡すと Unicode 関係のファイルのダウンロード時に更新をチェックして必要なら再ダウンロードを行うようにしていましたが、ALWAYS_UPDATE_UNICODE=no が指定された時のことが考慮されていなかったので no が指定されたらオプション指定しないようにしています。 make の $(VAR:aaa=bbb) って aaa じゃなかった時はそのまま展開されるんですね。つまり ALWAYS_UPDATE_UNICODE には yes か no 以外を渡すとそのままコマンドラインに展開されてしまう(ので多分エラーになる)んですね。

2014-10-29 ruby-trunk-changes r48178 - r48188

[][]ruby-trunk-changes r48178 - r48188

今日は標準添付ライブラリ matrix.rb の機能追加、Kernel#load でのファイルパスのエンコーディング変換の不具合修正、メソッド定義の引数デフォルト値の式でその引数自体を参照していたときの警告の追加などがありました。

normal: r48178 2014-10-29 03:39:45 +0900

install_sighandler() でシグナルハンドラ設定する時に rb_disable_interrupt() と rb_enable_interrupt() で割り込みから保護していたのですが、シグナルハンドラの設定は起動時に Init_signal() でまとめて実行するだけなのでこまめに割り込み保護する必要もないので Init_signal() で全体でまとめて割り込み制御するようにしています。起動時のシステムコール呼び出しを削減し、実行形式のサイズも少し小さくできるとのこと。 [ruby-core:59480] [Feature #9345]

svn: r48179 2014-10-29 03:40:03 +0900

version.h の日付更新。

hsbt: r48180 2014-10-29 10:00:23 +0900

gems/bundled_gems の test-unit を 3.0.3 に、minitest を 5.4.2 に更新しています。

marcandre: r48181 2014-10-29 11:42:56 +0900

標準添付ライブラリ matrix で Vector#dot と Vector#cross というメソッドをそれぞれ inner_product と cross_product の alias として追加しています。 [ruby-core:65571] [Feature #10352]

marcandre: r48182 2014-10-29 11:43:28 +0900

標準添付ライブラリ matrix に Matrix#adjucate という行列の余因子行列(随伴行列とも)を返すメソッドを追加しています。 NEWS ファイルにも追記れています。 [ruby-dev:48425] [Feature #10056]

marcandre: r48183 2014-10-29 11:43:52 +0900

標準添付ライブラリ matrix の Vector#cross_product を 3次の Vector だけでなく n-次の Vector について実行できるようにしています。このため引数の数は可変になっています。 [ruby-core:63860] [Feature #10074]

nobu: r48184 2014-10-29 11:48:25 +0900

古い Mac OS X でしばしば __builtin_setjmp() が原因で TAG_JUMP() が無限ループ状態に陥るという不具合が報告されてたのですが、configure で Mac OS X で古い gcc や clang では(OS X じゃなくてコンパイラのほうのバージョンだったんですね)、__builtin_setjmp() を利用しないようにしています。 [ruby-core:65174] [Bug #10272]

nobu: r48185 2014-10-29 14:44:20 +0900

test/ruby/test_require.rb のテストメソッド test_load2 を test_load_scope ともう少し descriptive な名前に変更して、エラー時のメッセージにML番号やチケット番号を追加しています。

nobu: r48186 2014-10-29 14:44:33 +0900

Kernel#load で読み込むファイル名のエンコーディングが、ファイルシステムエンコーディングに変換されていなかったため、非 ASCII 文字を含むファイルパスの時にエンコーディングが異なるとファイルが見付からないで LoadError になっていた不具合を修正しています。 [ruby-list:49994]

nobu: r48187 2014-10-29 20:41:03 +0900

parse.y で struct parser_params の未使用になっていたメンバ cur_mid を削除しています。 だいぶ前から使われていなかったみたいです。

nobu: r48188 2014-10-29 21:13:26 +0900

メソッドの省略可能引数デフォルト値の式で引数自体を参照している時にこれを警告するようにしています。 チケットはデフォルト値では引数と同名のメソッドがあったらそっちを呼んで欲しいというようなものでしたが、この位置では引数が見えるのが仕様ということにしていて、しかし

def m(foo = foo)
end

のような定義では無意味なので警告するようにしています。[ruby-core:65990] [Bug #10314]

なお

def m(foo = 0, bar = foo)
  [foo, bar]
end

のように別の引数デフォルト値で参照するのはOKなので警告は出さないようになっています。

2014-10-28 ruby-trunk-changes r48169 - r48175

[][]ruby-trunk-changes r48169 - r48175

今日は Homebrewapple-gcc42 をコンパイラとして優先利用しないようにする変更や、--dump オプションをつけた時に -r による require を抑制する変更などがありました。

nobu: r48169 2014-10-28 11:53:24 +0900

拡張ライブラリ ripper で組み込みの ID を管理するテーブルの token と offset は int の範囲まで不要なのでさらに unsigned short にしてサイズ削減を図っています。

svn: r48170 2014-10-28 11:53:38 +0900

version.h の日付更新。

naruse: r48174 2014-10-28 14:52:07 +0900

古い Mac OS XHomebrew などで入れた apple-gcc4.2 のコンパイラビルドできないので、configure で gcc-4.2 を優先してチェックしないようにしています。

nobu: r48175 2014-10-28 16:22:43 +0900

ruby に --dump=xxx オプションや -y (--dump=yydebug) をつけた時に -r オプションで指定されたファイルを require しないようにしています。 [ruby-dev:48712] [Bug #10435]

2014-10-27 ruby-trunk-changes r48147 - r48168

[][]ruby-trunk-changes r48147 - r48168

今日は LazySweep を OFF にしてビルドしていた時の GC の不具合や Method オブジェクトから Proc 化して生成した Binding の receiver の不具合修正、そして標準添付ライブラリ rexml の脆弱性修正がありました。これに伴い 2.1.4, 2.0.0-594, 1.9.3-p550 の全安定版のリリースがありました。

https://www.ruby-lang.org/ja/news/2014/10/27/ruby-2-1-4-released/

https://www.ruby-lang.org/ja/news/2014/10/27/ruby-2-0-0-p594-is-released/

https://www.ruby-lang.org/ja/news/2014/10/27/ruby-1-9-3-p550-is-released/

利用している Ruby の更新をお願いします。

normal: r48147 2014-10-27 11:33:51 +0900

test/ruby/test_process.rb の fork のタイミング依存の現象のテストで fork した子プロセスとの通信に使う読み込みのバッファ文字列を事前に用意したり、子プロセスGC.disable したりと GC 負荷を下げるようにしています。メモリがすくない環境で時々失敗するのを改善しようとしているそうです。

svn: r48148 2014-10-27 11:34:04 +0900

version.h の日付更新。

nobu: r48150 2014-10-27 13:40:13 +0900

gc_sweep_rest() で LazySweep を off にしてコンパイルされていると sweep されない不具合を修正しています。 [ruby-dev:48706] [Bug #10431]

nobu: r48151 2014-10-27 14:53:22 +0900

拡張ライブラリ ripper のテストで二項演算子パースのテストを演算子毎のテストメソッドを定義するようにしています。

nobu: r48152 2014-10-27 15:16:16 +0900

ID2SYM() の最適化gcc 拡張が利用できる時は rb_id2sym() をマクロとして定義して、引数が定数の時でかつ static symbol の時は関数呼び出しをしないように呼び元で展開するようにしています。

nobu: r48153 2014-10-27 15:23:09 +0900

parse.y で ripper 用の二項演算子の ID を rb_intern() で生成していたのを ID2SYM() を使って生成するようにしています。またこれに関連して "::" の Symbol を組み込みで生成しておくようにしています。

nobu: r48154 2014-10-27 15:25:59 +0900

r48153 の続き。 "&&" と "||" の演算子の ID も組込みで定義しておくようにしています。

nobu: r48155 2014-10-27 15:38:09 +0900

ext/ripper/tools/generate.rb というツールがあって、これ何をしているのかよく知らないのですが、C のソースを吐くみたいです。多分ビルド時にソースの自動生成で使ってるんですね。で短いコードを生成するようにしているそうです。

nobu: r48156 2014-10-27 15:50:49 +0900

拡張ライブラリ ripper の ext/ripper/eventids2.c で ID の変数群を構造体のメンバにまとめています。サイズの削減のためとあるけどはて。これで減るのかな…?

ko1: r48157 2014-10-27 16:02:03 +0900

GC_ENABLE_INCREMENTAL_MARK の定義で条件コンパイルしていた関数マクロ is_incremental_marking() と will_be_incremental_marking() を #if GC_ENABLE_INCREMENTAL_MARK で分岐するのではなくて GC_ENABLE_INCREMENTAL_MARK && ... のような形で展開するようにしています。

ko1: r48158 2014-10-27 16:29:32 +0900

super の呼び出しにブロックを渡すと親クラスのメソッドにそのブロックが渡されることを確認するテストを追加しています。

nobu: r48159 2014-10-27 17:12:52 +0900

proc.c の proc_binding() で proc->block.iseq をローカル変数に代入しておいて使いまわすようにリファクタリングしています。んー、RB_TYPE_P() とかのマクロに渡しているから複数回使われるように展開されるからですかね。

nobu: r48160 2014-10-27 17:17:26 +0900

Method オブジェクトから to_proc で Proc オブジェクト化したものの binding で取得した Binding オブジェクトの receiver が Method オブジェクトになっていた不具合を修正しています。 [ruby-core:65917] [Bug #10432]

usa: r48161 2014-10-27 20:18:02 +0900

標準添付ライブラリ rexml にパラメータエンティティの展開を行わせる XMLパースさせると大量にメモリを消費するので、展開できるサイズに制限を加えるようにしています。 これにより DoS 攻撃が可能となるため脆弱性とみなして、この修正を含む ruby 2.1.4、2.0.0-p594、1.9.3-p550 がリリースされています。 https://www.ruby-lang.org/ja/news/2014/10/27/rexml-dos-cve-2014-8080/

kazu: r48168 2014-10-27 22:04:57 +0900

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

2014-10-26 ruby-trunk-changes r48139 - r48146

[][]ruby-trunk-changes r48139 - r48146

今日は拡張ライブラリ ripper の Ripper.sexp が構文エラーを検出していなかったのを、エラー時は nil を返すようにする修正がありました。

suke: r48139 2014-10-26 07:46:15 +0900

拡張ライブラリ win32ole に WIN32OLE_VARIANT オブジェクトから実際に VARIANT 型を取り出すユーティリティ関数 ole_variant2variant() を追加してこれを利用するようにしています。

svn: r48140 2014-10-26 07:46:24 +0900

version.h の日付更新。

akr: r48141 2014-10-26 08:20:08 +0900

r48136 で追加したテストのテストメソッド名を改名しています。

duerst: r48142 2014-10-26 11:24:28 +0900

string.c のコメントの英文法の修正。

nobu: r48143 2014-10-26 12:22:19 +0900

r48142 で ChangeLogsvn/gitコンフリクト時のマークが入っていたので削っています。

nobu: r48144 2014-10-26 12:24:18 +0900

拡張ライブラリ ripper で構文エラーになる文を Ripper.sexp で処理した時にエラーにならずに何か(おかしな)結果が返ってきていた不具合を修正しています。本当だ、Ripper.sexp では構文エラーが検出されない…。知らなかった、というか全く気がつかなかった。この変更により構文エラーが検出された時は nil を返すようにしています。 [ruby-dev:48678] [Bug #10405]

duerst: r48145 2014-10-26 12:26:31 +0900

template/insns.inc.tmpl、template/insns_info.inc.tmpl、template/known_errors.inc.tmpl、template/minsns.inc.tmpl などの自動生成ファイル用のテンプレートにコメントで生成元のツールを書いているところでファイルパスが古くなっていたのを修正しています。

duerst: r48146 2014-10-26 15:53:34 +0900

r48145 のぶんの ChangeLog エントリを追加しています。