yarv2llvmの作り直しの検討 MethodBehaviorクラス
yarv2llvmを作成していて、メソッド呼出毎にさまざまにコンパイルの仕方を変える必要があることがわかりました。
例えば、eachは多くの場合インライン化する必要があるし、String#packは第1引数のテンプレートを見て型推論を行う必要があるし、newはエスケープ解析の結果でどこにアロケートするか変えないといけないわけです。
現状のyarv2llvmはこの辺をアドホックにテーブルを作って対応していたのですが、メソッドごとの振る舞いをちゃんとクラスにまとめたほうがいいなと気付きました。
- 振る舞いの異なるメソッドごとに用意する
- MethodBehaviorクラスは次のような動作をおこなうメソッドを用意する
- 初期トラバース
- 型推論
- コード生成
- MethodBehaviorDefaultクラスを用意し、普通のメソッドはそれを利用する。また、他のクラスは、MethodBehaviorDefaultを継承するようにする
追記
いっそのこと、これらのオブジェクトをノードにするASTを作ったほうがいいと気付いた。MethodBehaviorという名前はSendNodeHogehogeとかとい名前になる。他にも変数参照などのノードも作る。ASTを作成後、型推論のトラバースを型が収束するまで繰り返し、コード生成をトラバースする。