この記事は「AOT技術 Advent Calendar 2017」の6日目です。
というか、今のところこのカテゴリに私しかエントリーしてないので、漏れた日を埋めていこうかな、ぐらいの感じです。
YouTube: Playlist: Making archive IL2C
GitHub: IL2C step-by-step design project
ネタをひねり出すのもアレなので、今まで蓄積したMaking archive IL2Cのダイジェストをやっていこうかと思います。
(イメージをクリックするとYouTubeが開きます)
#6-16 (milestone2)
前回の方針で、引き続きコードを変更し、テストも修正します。 milestone2到達です。
ようやく、フロー解析にまつわる大変更が終わってホッとしました。ぶっ壊れてヤル気が折れなくて良かった… この回の終盤に、今後の方針を再確認しています。
#6-17
プリミティブ型でまだやっていない、ByteとかShortを扱えるようにしようとしたのですが、その前にあまりにわかりにくいDecodeContextにまつわるメンバー名を、リファクタリングで修正しました。また、ラベル番号がILのインデックスという状況をどうにかしたくて、後から連番でfixupするように変更しました。
*** ニャーン ***
#6-18
そう言えば、実際にifで分岐したコードでブランチ命令のテストをしていない、ということで、先にそのテストをしました。すると…
if文の判定条件に従って、評価スタックにtrue又はfalseの値がpushされるのですが、その後ブランチ命令で結果によって分岐する際に驚愕の事実が。
- 評価スタックにはあらゆる型の値を保持できる
- しかし、以下の値は、int32の値として保持される:
Byte, SByte, Int16, UInt16, UInt32, Boolean - 数値の扱いは対称性がない:
Int64はそのまま、UInt64はInt64、SingleはDoubleとして保持 - その他の値型はそのままの値で保持
- その他のOR型・マネージド参照・ポインタはそのままの値で保持
一見わかりにくそうなのですが、実はこれ、CやC#の符号拡張に似てる感じがします。そして、これまでの実装では型を真面目に扱っていたため、例えば、boolの値を評価スタックにBoolean型で保持するというように、型の追跡を行っていたので、条件ブランチ命令のPop(brfalse)でハマりました。