hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
void TemplateTable::invokeinterface_object_method(Register RklassOop,
Register Rcall,
Register Rret,
Register Rflags) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Register Rscratch = G4_scratch;
Register Rindex = Lscratch;
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert_different_registers(Rscratch, Rindex, Rret);
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Label notFinal;
{- -------------------------------------------
(1) コード生成:
「呼び出し対象のメソッドに final 修飾子が付いているかどうかを確認.
付いていなければ notFinal ラベルに分岐.」
---------------------------------------- -}
// Check for vfinal
__ set((1 << ConstantPoolCacheEntry::vfinalMethod), Rscratch);
__ btst(Rflags, Rscratch);
__ br(Assembler::zero, false, Assembler::pt, notFinal);
__ delayed()->nop();
{- -------------------------------------------
(1) (以下は, final 修飾子が付いていた場合のコード生成)
---------------------------------------- -}
{- -------------------------------------------
(1.1) コード生成:
「method data pointer (mdp) の値を更新しておく」
---------------------------------------- -}
__ profile_final_call(O4);
{- -------------------------------------------
(1.1) コード生成:
「実際の呼び出し処理を行う」
---------------------------------------- -}
// do the call - the index (f2) contains the methodOop
assert_different_registers(G5_method, Gargs, Rcall);
__ mov(Rindex, G5_method);
__ call_from_interpreter(Rcall, Gargs, Rret);
{- -------------------------------------------
(1) (ここまでが, final 修飾子が付いていた場合)
---------------------------------------- -}
{- -------------------------------------------
(1) (以下は, final 修飾子が付いていなかった場合のコード生成)
---------------------------------------- -}
__ bind(notFinal);
{- -------------------------------------------
(1.1) コード生成:
「method data pointer (mdp) の値を更新しておく」
---------------------------------------- -}
__ profile_virtual_call(RklassOop, O4);
{- -------------------------------------------
(1.1) コード生成:
「実際の呼び出し処理を行う」
---------------------------------------- -}
generate_vtable_call(RklassOop, Rindex, Rret);
{- -------------------------------------------
(1) (ここまでが, final 修飾子が付いていなかった場合)
---------------------------------------- -}
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.