Shiika/if式のコンパイル
Void、Neverの存在下だとけっこう面倒
仕様案
if式は値をもつ
else節がない場合は、else Void end とみなす
then節とelse節の最後の式の型が同じとき、if式の値もその型とする
違う場合
片方がNeverの場合、もう片方の型とする。eg: NeverとIntならInt
code:rb
if foo
return # Never
else
1 # Int
end
そうでなく片方がVoidの場合、Voidとする。eg: VoidとIntならVoid
このとき、Voidを挿入することで型を合わせる
code:rb
if foo
puts "ok" # Void
else
x += 2 # Int
# ここにVoidを挿入
end
そうでない場合、2つの型の最も近い共通の祖先の型とする。eg: クラスExpressionとサブクラスAdditiveExpressionがあるとき、以下のifの型はExpressionとしたい
code:ruby
if foo
AdditiveExpression.new
else
Expression.new
end
コード生成
NeverもVoidもない場合
必要に応じてbitcastするだけ
NeverはないがVoidがある場合
Voidにbitcastする
Neverがある場合
通常、then/else節の最後はmerge blockにジャンプするが、Neverの場合はジャンプしない(phiがおかしくなるため)
特に、Never-Neverの場合はphi自体を生成しない
できました