ruby-trunk-changes r61578 - r61596

今日も古いコンパイラ対策などがありました。

nobu: r61578 2018-01-03 22:58:27 +0900

AST を VM 命令列にコンパイル中にデバッグやエラー時に disassemble する時に label の表示に VM スタックのその時点での深さも表示するようにしています。

nobu: r61584 2018-01-04 08:05:02 +0900

AST を VM 命令列にコンパイルする時に利用する LINK_ELEMENT という構造体の type という enum に ISEQ_ELEMENT_ANCHOR を追加して、初期化時にこれを埋め草として利用するようにしています。

svn: r61585 2018-01-04 08:05:03 +0900

version.h の日付更新。

nobu: r61586 2018-01-04 09:26:50 +0900

test/-ext-/iseq_load/test_iseq_load.rb でスクリプトをヒアドキュメントで書いてるところを begin; と end; というラベルを利用してエディタがインデントを保持できるようにする手法の導入と、ISeq.compile に path, realpath, lineno の引数を指定してコンパイルするようにしています。

nobu: r61587 2018-01-04 09:26:51 +0900

cmpile.c の ADD_CATCH_TABLE() で追加するブロック終端と rescue 時のジャンプ先の label を LABEL_UNREMOVABLE() ではなく LABEL_REF() で追加するようにして、最適化で削除可能にしています。

nobu: r61588 2018-01-04 09:44:40 +0900

Symbol#to_proc の rdoc 用コメントの typo 修正。 https://github.com/ruby/ruby/pull/1785

nobu: r61589 2018-01-04 10:30:20 +0900

template/insns_info.inc.tmpl で insn_name_info を各命令の名前のサイズの char の配列のメンバーとして持つ構造体として定義するようにして、文字列リテラルのサイズ制限を回避するようにしています。

nobu: r61590 2018-01-04 10:46:01 +0900

template/insns_info.inc.tmpl でテーブルの定義から static を外して rb_vm_ という prefix を追加して外部からも参照できるようにしている? 外部からというか compile.c からも #include されているので、そっちで同じ定数を別に作ってメモリを無駄に使わないようにしているのかと思います。そのためテーブルの定義は iseq.c から include された時だけ行うように preprocessor の分岐を追加しています。

mame: r61591 2018-01-04 13:44:16 +0900

iseq.c の rb_iseq_new_with_opt() で引数の node が T_IMEMO 型オブジェクトの imemo_func の可能性があったので、範囲情報の取得時にそれを考慮するようにしています。imemo_func ってなんだったっけなぁ…。

mame: r61592 2018-01-04 16:07:49 +0900

NODE* が T_IMEMO 型の imemo_func の時の分岐が compile.c や iseq.c に散見されていたので、ifunc 専用の関数 rb_iseq_compile_ifunc(), new_child_iseq_ifunc(), rb_iseq_new_ifunc() などを定義して、こちらを呼び出すようにリファクタリングしています。これにより r61591 の対応は不要になったので revert しています。

shyouhei: r61593 2018-01-04 16:51:16 +0900

re.c の VALUE_MAX という定数の定義で整数リテラルの UL および ULL という suffix を使っていましたが、ULL は C99 以降で使えるものだったのでリテラルの利用はあきらめて ~0 のような bit 演算子で求める数値を作るようにしています。

shyouhei: r61594 2018-01-04 16:51:17 +0900

string.c の NONASCII_MASK という、非ASCII文字を効率的に検出するため 1 byte ごとの最上位ビットのみ立ってる定数を定義しているところでやはり ULL という suffix が利用されていたのと、ポインタ型が 8 bytes の時に long long が 8 bytes であるという前提があったので、古いコンパイラでは ビット演算を利用して組み立てるようにしています。またポインタのサイズのチェックは SIZEOF_VOIDP ではなくて SIZEOF_UINTPTR_T を使うようにしています。新しいコンパイラでも UL や ULL を直に書くのではなくて UINT64_C() などのマクロがあったので、それを利用するようにしています。こんなマクロがあったのか。

shyouhei: r61595 2018-01-04 16:51:18 +0900

util.c で HAVE_LONG_LONG が偽の時は NO_LONG_LONG というマクロを定義するようにしています。コメントで long long が使えない環境では NO_LONG_LONG を定義することと書かれてて、実際 ULLong の定義で参照されています。

shyouhei: r61596 2018-01-04 16:51:19 +0900

loadpath.c で clang と gcc でそれぞれ長い文字列リテラルの警告を無視する #pragma を追加しています。