(#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.