(#Under Construction)
dynamic dispatch 処理は, それぞれ以下の関数が生成するコード内で行われる.
呼び出し先のメソッドに final 修飾子が付いている場合, sparc 版では Bytecodes::_fast_invokevfinal への書き換えを行う (See: here for details). そのため, 二回目以降の呼び出しは少し速くなる.
(なお, x86 版では書き換えは行わない)
* 1 回目 TemplateTable::invokevirtual() が生成したコード -> * final が付いている場合 -> TemplateTable::invokevfinal_helper() が生成したコード -> InterpreterMacroAssembler::call_from_interpreter() が生成したコード -> (実際の呼び出し先にジャンプ) * final が付いていない場合 -> TemplateTable::generate_vtable_call() が生成したコード -> InterpreterMacroAssembler::call_from_interpreter() が生成したコード -> (同上) * 2 回目 (書き換え後) TemplateTable::_fast_invokevirtual() が生成したコード -> TemplateTable::invokevfinal_helper() が生成したコード -> (同上)
TemplateTable::invokevirtual() が生成したコード -> TemplateTable::prepare_invoke() が生成したコード -> TemplateTable::invokevirtual_helper() が生成したコード -> InterpreterMacroAssembler::jump_from_interpreted() が生成したコード -> InterpreterMacroAssembler::prepare_to_jump_from_interpreted() が生成したコード -> (実際の呼び出し先にジャンプ)
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#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.