今日は主に parse.y のリファクタリング続きや、memory alignment についてコンパイラのサポートが可能なら使うようにする変更などがありました。
mame: r61815 2018-01-14 22:51:35 +0900
parse.y でポインタの変数名などに p という名前を使っていたのを ptr とか paren とかもうすこし長い名前をつけるようにしています。暗黙の引数 struct parser_params * に p を使いたいから、とのこと。
mame: r61816 2018-01-14 22:51:38 +0900
r61815 の続き(というかこっちが本命)でマクロで遮蔽している暗黙の引数 struct parser_params の引数名を p に変更しています。
mame: r61817 2018-01-14 22:51:41 +0900
r61815 および r61816 の続き、というかこれがやりたかったことみたいですが、parse.y でマクロで暗黙的に struct parser_params のメンバーにグローバル変数のようにアクセスするためのマクロを廃止して、明示的に p のメンバーへのアクセスにするようにしています。おおー。
mame: r61818 2018-01-14 22:51:44 +0900
さらに r61817 の続きで parse.y で第1引数に struct parser_params を受けとる xxx_gen() という関数群の _gen という prefix を削除して、関数マクロ経由でなく呼び元で明示的に p を渡すようにしています。おおー。
mame: r61819 2018-01-14 23:09:41 +0900
parse.y の #ifdef OLD_YACC というマクロで分岐された YYMAXDEPTH という定数の定義を削除しています。既に configure にチェックがないのでこのマクロが定義されることもないので不要でした。
nobu: r61820 2018-01-14 23:14:51 +0900
ripper で不要になっていたので parse.y の rb_discard_node() という関数の定義を #ifndef RIPPER で囲んでいます。
mame: r61821 2018-01-14 23:17:25 +0900
parse.y の FIXME というマクロ定義は使われていなかったので削除しています。
nobu: r61822 2018-01-14 23:28:10 +0900
parse.y の struct parser_params のメンバー yydebug を debug に改名して、yydebug() というマクロを p->debug とメンバーのアクセスとして定義しなおしています。 static link する拡張ライブラリのリンクエラー予防とのこと。
mame: r61823 2018-01-14 23:44:46 +0900
heredoc_dedent() という parser_heredoc_dedent() の呼び出しを wrap しているだけのマクロを削除して、関数のほうの名前を heredoc_dedent() に改名しています。
mame: r61824 2018-01-15 09:45:26 +0900
tool/ytab.sed で古い bison の出力を sed で置換して対応していたやつでも parser を p に変数名の変更をしています。
svn: r61825 2018-01-15 09:45:26 +0900
version.h の日付更新。
nobu: r61826 2018-01-15 11:23:24 +0900
r61824 の続きで tool/ytab.sed で 変数名 p の置換しすぎないように修正しています。
shyouhei: r61827 2018-01-15 11:35:16 +0900
メモリアライメントを指定するコンパイラ拡張を RUBY_ALIGNAS() というマクロで定義して使うようにしています。 char * を VALUE のアライメントに揃える制限を加える必要があるところなどがあるようです。
shyouhei: r61828 2018-01-15 11:35:17 +0900
r61827 の続き。 C11/C++11 の alignof() というある型の alignment を取得する機能が利用可能なら RUBY_ALIGNOF() というマクロで定義するようにしています。
shyouhei: r61829 2018-01-15 11:35:18 +0900
__builtin_assume_aligned() というコンパイラ拡張があれば reinterpret_cast() というマクロに定義するようにして、ポインタを任意の型にキャストして deference する時に使うようにしています。
shyouhei: r61830 2018-01-15 11:35:19 +0900
__builtin_alloca_with_align() というコンパイラのビルトイン関数が使えたら alloca() のかわりに ALLOCA_N() の定義にこれを利用するようにしています。
shyouhei: r61831 2018-01-15 11:35:20 +0900
関数からかえってこないことを指定する NORETURN() マクロを C++ の noreturn という記法や _Noreturn という……これはなんだろ、修飾子なのかな、も可能なら使うようにしています。
nobu: r61832 2018-01-15 11:39:32 +0900
tool/ytab.sed で古い bison で yydestruct() も置換するようにしています。
shyouhei: r61833 2018-01-15 11:59:18 +0900
r61827 の RUBY_ALIGNAS() マクロで __declspec(align()) を使う場合は引数に sizeof() を渡すことができないそうなので、sizeof(VALUE) を SIZEOF_VALUE で置き換えるようにしています。
shyouhei: r61834 2018-01-15 13:36:08 +0900
r61827 で configure.ac に余計な差分が含まれてしまっていたそうで、そこだけ削除しています。
shyouhei: r61835 2018-01-15 13:36:09 +0900
struct RString の RSTRING_PTR() のポインタを VALUE の alignment にそろえるようにするのはあきらめるようにしています。 malloc(3) などでヒープからかくほ する場合は大丈夫なんでしょうけど、rb_setup_fake_str() などで C の文字列リテラルによる静的領域の文字列ポインタを入れることがあって、その alignment が保証できないのでその代入が問題になる、とかそういうことみたいです。なるほどー。。。
shyouhei: r61836 2018-01-15 13:36:09 +0900
r61830 で利用するようにした __builtin_allloca_with_align() は GCC 4.8.5 以前では検出はできるけど実際には使えない? 不具合がある? みたいなので、GCC_VERSION_BEFORE() でチェックして undef して利用しないようにしています。
mame: r61837 2018-01-15 14:17:18 +0900
parse.y の規則部に C のブロックを埋め込むところ(ここもアクションっていうのかな?)が単にコメントアウトされた文しか残ってないものとかがあったので、削除しています。ずいぶん昔にコメントアウトされたものなのでもういらないだろ、とのこと。
nobu: r61838 2018-01-15 14:27:11 +0900
tool/ruby_vm/models/attribute.rb で生成する C の関数の宣言で引数が空の時に void を明示的に書くようにしています。
shyouhei: r61839 2018-01-15 14:51:46 +0900
r61830 および r61836 の __builtin_alloca_with_align() の利用について、GCC 4.9.4 以前でも不具合があるみたいなので、4.9.5 からのみ利用するようにしています。
mame: r61840 2018-01-15 15:25:41 +0900
parse.y の規則で { ... } のように波かっこでくくられたブロックを begin_block という独立したノードとして切り出しています。
mame: r61841 2018-01-15 15:25:42 +0900
parse.y の添字(インデックス)つき代入文のアクションで obj[42, &blk] ||= foo bar のように、 メソッドにブロックを渡しつつ右辺値にかっこのないメソッド呼び出し?がある時に、右辺値が引数に追加されない不具合があったみたいなのを修正しています。うーん、確かになかなかこんな呼び出しはしなさそう。というか ||= でブロックを渡す時はこういう書きかたをするのか…。
mame: r61842 2018-01-15 15:25:43 +0900
parse.y のインデックスつき、演算子つきの代入(つまり obj[index] ||= val みたいなのですね)のルールが右辺値の種類によって複数あるので、その共通の処理を new_ary_op_assign() という関数に切り出すリファクタリング。
shyouhei: r61843 2018-01-15 15:47:56 +0900
ALLOCA_N() の定義に __builtin_alloca_with_align() を使う時に alignment の指定を sizeof(type) ではなく RUBY_ALIGNOF(type) の整数倍で確保するようにしています。 win32ole に ALLOCA_N(struct myCPINFOEX, 1) のような指定があったので、構造体サイズで alignment とる必要はないので、必要な alignment を取得してそれを使うようにしています。
nobu: r61844 2018-01-15 16:01:08 +0900
拡張ライブラリ socket の ext/socket/raddrinfo.c で #ifndef GETADDRINFO_EMU で括る範囲を間違えてて parse_numeric_port() の定義も GETADDRINFO_EMU がない時のみ定義するようになっていたのを修正しています。
shyouhei: r61845 2018-01-15 16:30:43 +0900
r61827 で RUBY_ALIGNAS() を導入した時に VALUE の alignment に制限した char * の型として ruby_aligned_char という型を定義していましたが、もう struct RString::ptr をあきらめたりしてもう 1箇所でした使ってないので、 typedef は削除して残り 1箇所の struct ibf_load では直接 RUBY_ALIGNAS() を使って宣言するようにしています。
shyouhei: r61846 2018-01-15 16:32:48 +0900
r61845 で RUBY_ALIGNAS() の引数に sizeof(VALUE) を渡してしまっていましたが、r61833 で修正したように sizeof() が渡せない環境があるので SIZEOF_VALUE 定数を使うように修正しています。
mame: r61847 2018-01-15 16:39:47 +0900
parse.y の引数リストについての規則群のアクションで NODE_ARRAY に要素を追加する処理が重複していたので arg_append() という関数に切り出すリファクタリング。
mame: r61848 2018-01-15 16:54:24 +0900
parse.y の begin ... end の規則で bodystmt を使っている規則のアクションで body_stmt のノードが NULL の場合のチェックをしていましたが、bodystmt は NULL を返さない(という前提で書いてるところが他にもある)のでチェックを削っています。
mame: r61849 2018-01-15 17:54:24 +0900
r61848 の続きで bodystmt 自体のアクション部でも不要な NULL チェックがあったり、他にも NULL になり得ない規則のアクションで $$ の NULL チェックしているところが散見されたので、不要な分岐を削除しています。
mame: r61850 2018-01-15 17:54:25 +0900
rest 引数やブロック引数の識別子が local 変数でない時の yyerror() の呼び出しというのがありましたが、このチェックも不要だそうなので削除しています。
hsbt: r61851 2018-01-15 19:09:00 +0900
win32/win32.c のコメントの typo 修正。
nobu: r61853 2018-01-15 21:25:24 +0900
Windows 環境での console の出力のテストで、拡張ライブラリを利用して COMMON_LVB_REVERSE_VIDEO という定数を参照できるようにして、エスケープシーケンスのテストで利用するようにしています。出力の反転をしている環境でエラーになってた? みたいですね。