hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp
address TemplateInterpreterGenerator::generate_exception_handler_common(
const char* name, const char* message, bool pass_oop) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(!pass_oop || message == NULL, "either oop or message but not both");
{- -------------------------------------------
(1) (ここからが生成するコードの始まり)
---------------------------------------- -}
address entry = __ pc();
{- -------------------------------------------
(1) コード生成: (ただし, 引数により, 例外オブジェクトに埋め込むメッセージとして「TOS に存在している
オブジェクトのクラス名」を使うよう指定されている場合にのみ生成する)
「TOS にあるオブジェクトを c_rarg2 レジスタに移しておく.」
---------------------------------------- -}
if (pass_oop) {
// object is at TOS
__ pop(c_rarg2);
}
{- -------------------------------------------
(1) コード生成:
「オペランドスタック("expression stack")を空にする.」
---------------------------------------- -}
// expression stack must be empty before entering the VM if an
// exception happened
__ empty_expression_stack();
{- -------------------------------------------
(1) コード生成:
例外オブジェクトを作るためのコードを生成する.
生成するコードには, 引数に応じて以下の2通りがある.
* 引数により, 例外オブジェクトに埋め込むメッセージとして「TOS に存在しているオブジェクトのクラス名」を使うように指定されている場合
「InterpreterRuntime::create_klass_exception() を呼んで例外オブジェクトを生成する.」
(なお, これは TemplateInterpreterGenerator::generate_klass_exception_handler() から呼ばれた場合のパス.
See: TemplateInterpreterGenerator::generate_klass_exception_handler())
* 引数により, 例外オブジェクトに埋め込むメッセージが明示的に指定されている場合
「InterpreterRuntime::create_exception() を呼んで例外オブジェクトを生成する.」
(なお, これは TemplateInterpreterGenerator::generate_exception_handler() から呼ばれた場合のパス.
See: TemplateInterpreterGenerator::generate_exception_handler())
---------------------------------------- -}
// setup parameters
__ lea(c_rarg1, ExternalAddress((address)name));
if (pass_oop) {
__ call_VM(rax, CAST_FROM_FN_PTR(address,
InterpreterRuntime::
create_klass_exception),
c_rarg1, c_rarg2);
} else {
// kind of lame ExternalAddress can't take NULL because
// external_word_Relocation will assert.
if (message != NULL) {
__ lea(c_rarg2, ExternalAddress((address)message));
} else {
__ movptr(c_rarg2, NULL_WORD);
}
__ call_VM(rax,
CAST_FROM_FN_PTR(address, InterpreterRuntime::create_exception),
c_rarg1, c_rarg2);
}
{- -------------------------------------------
(1) コード生成:
「Interpreter::throw_exception_entry() が指しているアドレスにジャンプする.」
---------------------------------------- -}
// throw exception
__ jump(ExternalAddress(Interpreter::throw_exception_entry()));
{- -------------------------------------------
(1) 以上で生成したコードの先頭アドレスをリターン.
---------------------------------------- -}
return entry;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.