ruby-trunk-changes r52699 - r52716

今日は主に AST から ISeq へのコンパイル時の最適化の強化やエラー処理の強化? 修正?、標準添付ライブラリ cmath の `!` つきメソッドの deprecated 化などがありました。

kazu: r52699 2015-11-21 21:17:50 +0900

r52636、r52688、r52694 の ChangeLog エントリの typo 修正。

kazu: r52700 2015-11-21 21:18:10 +0900

r52627 の configure の --with-ruby-pc の help メッセージ修正での typo 修正。

ngoto: r52701 2015-11-22 01:19:06 +0900

Solaris 10 にて拡張ライブラリ socket の socket option の SO_TIMESTAMP を使ったテストが失敗することがあるそうで Socket::SO_TIMESTAMP が未定義だったらスキップするようにしています。 [ruby-dev:49377] [Bug #11728]

svn: r52702 2015-11-22 01:19:21 +0900

version.h の日付更新。

ngoto: r52703 2015-11-22 01:37:12 +0900

configure で Solaris 環境で -D_XOPEN_SOURCE=500,600,700 などのオプションを可能であれば付加するようにしています。 socket 関連の機能を有効にするためだそうです。

nobu: r52704 2015-11-22 15:10:41 +0900

compile.c の iseq_set_sequence() で異常な命令列に対してエラーを返すようにして(というかこれまでも 0 を返していたけど COMPILE_NG というマクロ定数を使うようにした)、iseq_setup() でちゃんと iseq_set_sequence() のエラーチェックをするようにしています。

nobu: r52705 2015-11-22 15:29:41 +0900

命令列をダンプするデバッグ用関数 dump_disasm_list() で最後に fflush(3) で出力を flush しておくようにしています。

nobu: r52706 2015-11-22 15:32:23 +0900

compile.c の COMPILE_ERROR() というマクロで break 文を入れていたのをやめて、iseq_set_sequence() でエラー時に rb_compile_error() を読んで th->errinfo をセットしていたのを COMPILE_ERROR() を使って iseq->compile_data->err_info に例外オブジェクトをセットして COMPILE_NG を返すように変更しています。 コミットログによると cleanup_iseq_build() で compile_data->err_info がセットされていたら例外が発生するそうなので、例外発生を遅延させているのか、iseq_compile_each() をざっくりみた感じだと、これまでちゃんと例外になってなかったのを例外になるようにしたのかも。
[追記]なかださん曰く後者(例外になってなかった)とのこと。[/追記]

nobu: r52707 2015-11-22 15:32:32 +0900

と思ったら今度は compile.c で rb_bug() を使って異常終了させていたところを rb_compile_bug() を呼ぶように変更しています。エラー時のファイルパスと行番号を表示するようにしているようです。

nobu: r52708 2015-11-22 15:32:38 +0900

compile.c で label を管理する st_table を T_DATA 型のオブジェクトに wrap することで例外発生時のメモリリークを避けるようにしています。

nobu: r52709 2015-11-22 15:42:14 +0900

template/fake.rb.in に =begin ... =end のコメントを書いてこの中に shell としてのコードを埋め込むようにしています。バックスラッシュによる行継続を利用して shell スクリプトとしても実行できるようにしているようですね。

nobu: r52710 2015-11-22 16:37:13 +0900

iseq_peephole_optimize() で if の直前に真になることが確実な値を push する命令があったらただの jump 命令にする最適化で、putXXX + dup + if は putXXX + jump にするようにするように dup 命令があったらもうひとつ命令を遡ってチェックするようにしています。

nobu: r52711 2015-11-22 16:53:37 +0900

iseq_peephole_optimize() に VM の命令列の jump や leave の後の決して到達しないコードを削る最適化を remove_unreachable_chunk() という関数に定義して追加しています。 またこれにより parse.y でやっていた if や &&, || でのリテラルなど真偽値が確定していた時の最適化はやめて compile.c での VM 命令列にしてからの最適化にまかせるようにしています。

nobu: r52712 2015-11-22 17:22:05 +0900

r52707 の compile.c での rb_compile_bug() を利用するようにする変更で1箇所エラー位置の指定に失敗していたところがあったので修正しています。

ngoto: r52713 2015-11-22 18:01:04 +0900

r52703 で Solaris での configure で -D_XOPEN_SOURCE を指定するようにする変更で AC_TRY_COMPILE() だけでなく AC_TRY_CPP() でのチェックも行うようにしています。コミットログによると -std=iso9899:1999 などのオプションは preprocessor の実行時や拡張ライブラリのビルド時に使われないことがあるので、そちらでの組み合わせもテストする必要があるということでしょうか。

hsbt: r52714 2015-11-22 19:36:56 +0900

拡張ライブラリ openssl の rdoc 用コメントで OS X での OpenSSL を HomeBrew でインストールした場合のオプション指定方法の brew コマンドの使いかたを修正しています。 https://github.com/ruby/ruby/pull/1107

ngoto: r52715 2015-11-22 22:09:41 +0900

r52469 で変更して r52471 で revert された、標準添付ライブラリ cmath の `!` がつくメソッドの depreceted 化(警告を出す)を再適用しています。またこの時 Math を直接参照して委譲するのではなく、ロード時点での Math を RealMath という定数に代入しておいてこれに委譲するようにしています。 cmath.rb で Math に CMath を代入して再定義してしまうという荒技が行われているため、Math に委譲するつもりが無限再帰になってしまっていたので RubySpec のテストが失敗するを回避しているようです。 [ruby-core:68528] [Feature #10974]

odaira: r52716 2015-11-22 22:41:08 +0900

gc.c の rb_raw_obj_info() で USE_RGENGC が 0 に定義され RGenGC が無効化された時にビルドエラーになっていたのを修正しています。