例外処理に使用するシグナルが生じた場合, 各 OS 用のシグナルハンドラ内では, SharedRuntime::continuation_for_implicit_exception() によって適切な戻りアドレスを決定している
(戻りアドレスは, 例えば Interpreter の適切な throw_entry() や StubRoutines の適切な throw_entry, 等)
最終的には, シグナルハンドラ終了後にそのアドレスに遷移することで例外ハンドラの処理にフォールバックする.
(See: here for details) -> シグナルハンドラ (JVM_handle_linux_signal() or JVM_handle_solaris_signal() or topLevelExceptionFilter()) -> SharedRuntime::continuation_for_implicit_exception() -> シグナルハンドラ終了後, SharedRuntime::continuation_for_implicit_exception() で取得したアドレスへとジャンプする. なお, 以下のようなアドレスが取得される. * Interpreter 実行のコード中の場合: ※ * NullPointerException の場合 TemplateInterpreter::throw_NullPointerException_entry() (= TemplateInterpreter::_throw_NullPointerException_entry が指しているコード) (See: here for details) * ArithmeticException の場合 TemplateInterpreter::throw_ArithmeticException_entry() (= TemplateInterpreter::_throw_ArithmeticException_entry が指しているコード) (See: here for details) * StackOverflowError の場合 TemplateInterpreter::throw_StackOverflowError_entry() (= TemplateInterpreter::_throw_StackOverflowError_entry が指しているコード) (See: here for details) * Interpreter 実行のコードではない場合: #TODO
(※) ただし, C++ Interpreter の場合には signal handler 経由での例外処理は行われないので, Template Interpreter の場合のみ.
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.