Crystalと例外
TechCrystal言語における例外の実装を調査する。
前提知識
- Crystalの処理系はCrystal自身で書かれている
- CrystalはC-FFIが言語機能として組み込まれている(Lib)
- たとえばLLVMの関数はlib_llvm.crでCrystalレベルから呼べるようバインディングされている
- オーバーロードがある
def foo()
とdef foo(a)
とdef foo(a, b)
が同時に存在したりするのでコードリーディング時は要注意
Personality function
win32、arm、wasmでない場合 https://github.com/crystal-lang/crystal/blob/5761bbb7aa5e79f4de24837d6007a03a673990f2/src/raise.cr#L185-L199
# :nodoc:
fun __crystal_personality(version : Int32, actions : LibUnwind::Action, exception_class : UInt64, exception_object : LibUnwind::Exception*, context : Void*) : LibUnwind::ReasonCode
start = LibUnwind.get_region_start(context)
ip = LibUnwind.get_ip(context)
lsd = LibUnwind.get_language_specific_data(context)
leb = LEBReader.new(lsd)
reason = traverse_eh_table(leb, start, ip, actions) do |unwind_ip|
LibUnwind.set_gr(context, LibUnwind::EH_REGISTER_0, exception_object.address)
LibUnwind.set_gr(context, LibUnwind::EH_REGISTER_1, exception_object.value.exception_type_id)
LibUnwind.set_ip(context, unwind_ip)
end
return reason if reason
return LibUnwind::ReasonCode::CONTINUE_UNWIND
end