ruby-trunk-changes r61855 - r61875

今日は主に parse.y のリファクタリングがありました。

mame: r61855 2018-01-15 23:01:16 +0900

メソッド呼び出しを obj::meth のように "::" の記法でした時に引数のかっことの間に空白が入り {...} のブロックを渡した時の syntax のテストを追加しています。

mame: r61856 2018-01-16 00:04:57 +0900

parse.y でメソッド呼び出しのアクションで fixpos() でノードの位置情報を調整していたのを new_command_qcall() を関数として定義しなおしてその引数で受けとってその中で fixpos() するようにリファクタリングしています。

svn: r61857 2018-01-16 00:04:58 +0900

version.h の日付更新。

mame: r61858 2018-01-16 01:12:34 +0900

parse.y で本体の parser と ripper でアクションを分けなくてもいいところのコメントを削除しています。

yui-knk: r61859 2018-01-16 08:43:17 +0900

rb_ast_t とその中身の NODE のツリー構造についてのテスト用の構造体を追加して、内部的な構造のテストを test-all に追加しています。

svn: r61860 2018-01-16 08:43:18 +0900

r61859 の新規追加ファイルの svn property 設定。

mame: r61861 2018-01-16 10:32:58 +0900

parse.y の %i や %I による Symbol の配列のリテラル用の規則のアクションから処理を symbol_append() という関数に切り出すリファクタリング

mame: r61862 2018-01-16 10:43:25 +0900

正規表現リテラル内の式の埋め込みで literal_concat0() がエラーになると new_regexp() が NULL を返すことがあり、その場合 SEGV していた不具合を修正しています。 おそらく r61849 のあたりで NULL になりえない NODE* のチェックを削ったところで、実は NULL になる可能性がある箇所があったということだと思います。 NULL チェックを復活させるのではなくて、new_regexp() で NODE_NIL を作って返すようにして対応しています。

mame: r61863 2018-01-16 11:00:16 +0900

parse.y でリテラルトークンやノードで bison が返す位置情報をアクション部でセットしていたものを set_yylval_str() マクロの中で NODE を作る時にセットしておくようにして共通化しています。これでリテラル群のアクション部が消えた。

mame: r61864 2018-01-16 11:27:58 +0900

backref ノードの位置情報もアクション部でセットしていたのを parse_gvar() の中で token を返す時にセットしておくようにしています。

shyouhei: r61865 2018-01-16 12:09:53 +0900

ポインタの alignment にそろうように指定するマクロ aligned_ptr() の定義に __builtin_assume_aligned() を使う時の第2引数が sizeof(uintptr_t *) になっていたので sizeof(uintptr_t) に修正しています。
まあしかし uintptr_t はポインタ型と同じサイズの整数という意味だと思うので結果的には同じだったのでしょうね。

nobu: r61866 2018-01-16 12:16:15 +0900

parse.y の tokadd_memchar() を parser_tokadd_memchar() への wrapper マクロとして定義して、暗黙に struct parser_params の引数を補うようにしていたのをやめて、tokadd_memchar() を関数として定義して呼び元で明示的に引数 p を渡して直接呼ぶようにしています。xxx_gen() の削除と同じ方針の変更ですね。

nobu: r61867 2018-01-16 12:16:17 +0900

parse.y に PARSER_ARG というマクロもあって、関数の先頭に暗黙の引数 struct parser_params *p を追加するために関数の引数の先頭に置いてましたが、これも削除して直接書くようにしています。
こんなのがあったのか。完全に謎のおまじない状態で直接書いたほうがなんぼかまし

mame: r61868 2018-01-16 14:27:20 +0900

parse.y の while, until, for 文などのルールでインラインのアクションで COND_PUSH(), COND_POP() で挟んでいるところを、独立した expr_value_do というノードに切り出して1箇所にまとめるリファクタリング

ngoto: r61869 2018-01-16 14:49:01 +0900

RUBY_ALIGNAS() や RUBY_ALIGNOF() のマクロ定義でコンパイラ拡張が使えない時の定義で引数の名前と展開時の名前が間違っていたのを修正しています。 SolarisFujitsu C Compiler および Oracle Solaris Studio でのビルドの修正です。
RUBY_ALIGNAS() ではコメントアウトした状態で展開しているけどいいのかな、と一瞬思ったけどこれは修飾子的に使うマクロ(つまり ALIGNAS(type_a) type_b var みたいに宣言する)なのでこれでいいのか。

normal: r61870 2018-01-16 15:36:05 +0900

struct vtm の定義で bit field に使うために bits8_t と bits16_t という型を定義していたのを、単に unsigned int を利用するようにしています。

mame: r61871 2018-01-16 16:24:53 +0900

NODE_FOR という種類の NODE は for 文と for で複数の変数への代入の文と役割の異なるところで流用されていたので、後者のために専用の NODE_FOR_MASGN という NODE タイプを新たに導入して、compile.c の compile_for() は後者の NODE_FOR_MASGN() のコンパイル用にしています(NODE_FOR は NODE_ITER と同じコンパイル処理で済むので)。こうなると今度は NODE_FOR は NODE_ITER を使ってもいいのでは、というくらい似た処理になりますね。

nobu: r61872 2018-01-16 17:05:57 +0900

parse.y の top_compstmt と compstmt というノードのアクションの void_stmts() という関数を ripper 用にも定義してアクション部の分岐(というか ripper 用コードのコメント埋め込み)をやめています。

nobu: r61873 2018-01-16 17:21:40 +0900

parse.y の program ノードで本体 parser と ripper で local_push() の引数の数値だけが異なるので、分岐をやめて ifndef_ripper() というマクロを利用するように書きかえています。

shyouhei: r61874 2018-01-16 17:35:33 +0900

C の文字列リテラルは C89 の規格だと 509文字を超えると保証されていないので、prelude.c.tmpl の展開などで頑張っていましたが、あきらめて -Wno-overlength-strings というオプションを付けて全体的に長い C の文字列リテラルはサポートされている前提にすることにしたようです。このため部分的に無視するために loadpath.c で使っていた #pragma も削除しています。
CRuby のビルドに必要な条件について https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/Assumptions でまとめるようにしたようです。

shyouhei: r61875 2018-01-16 18:21:07 +0900

r61805 で node.c の node_buffer_elem_t で構造体の末尾の配列のサイズを FLEX_ARY_LEN を使って可能なら省略するようにしていましたが、ISO C section 6.7.2.1 にこのような可変長の配列を持つ構造体は他の構造体のメンバーや配列の要素には使えないとあって、node_buffer_elem_t は struct node_buffer_struct のメンバーとしても使われているので省略は不可だったようです。