hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp
void TemplateTable::_return(TosState state) {
{- -------------------------------------------
(1) (assert) (See: TemplateTable::transition())
---------------------------------------- -}
transition(state, state);
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(_desc->calls_vm(),
"inconsistent calls_vm information"); // call in remove_activation
{- -------------------------------------------
(1) コード生成: (ただし, return_register_finalizer バイトコード用のテンプレートの場合のみ.
その他の *return バイトコードの場合には, 以下のコードは生成しない)
「クラスの access flags 中に JVM_ACC_HAS_FINALIZER ビットが立っているかどうかを調べる.
もし立っていれば, InterpreterRuntime::register_finalizer() を呼び出して Finalizer の登録処理を行っておく.
(ビットが立っていなければ, 呼び出しは省略する)」
(なお, return_register_finalizer は rewrite 処理によって生成されるバイトコード. (See: [here](no3059AfB.html) for details))
---------------------------------------- -}
if (_desc->bytecode() == Bytecodes::_return_register_finalizer) {
assert(state == vtos, "only valid state");
__ movptr(c_rarg1, aaddress(0));
__ load_klass(rdi, c_rarg1);
__ movl(rdi, Address(rdi, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc)));
__ testl(rdi, JVM_ACC_HAS_FINALIZER);
Label skip_register_finalizer;
__ jcc(Assembler::zero, skip_register_finalizer);
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::register_finalizer), c_rarg1);
__ bind(skip_register_finalizer);
}
{- -------------------------------------------
(1) コード生成:
「InterpreterMacroAssembler::remove_activation() が生成するコードで
スタックフレームを破棄する.
synchronized method であればロックの解除も行う.
(なお, この生成コードによってリターンアドレスが r13 にロードされる)」
---------------------------------------- -}
__ remove_activation(state, r13);
{- -------------------------------------------
(1) コード生成:
「r13 に取得したリターンアドレスにジャンプする」
---------------------------------------- -}
__ jmp(r13);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.