hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp
void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
Register Rtemp = G4_scratch;
{- -------------------------------------------
(1) コード生成: (verify)
---------------------------------------- -}
__ verify_oop(G5_method);
{- -------------------------------------------
(1) コード生成:
「receiver が NULL でないことを確認する.
NULL の場合は NullPointerException (See: [here](no30592Qc.html) for details)」
---------------------------------------- -}
// Load receiver from stack slot
__ lduh(G5_method, in_bytes(methodOopDesc::size_of_parameters_offset()), G4_scratch);
__ load_receiver(G4_scratch, O0);
// receiver NULL check
__ null_check(O0);
{- -------------------------------------------
(1) コード生成:
「method data pointer (mdp) の値を更新しておく」
---------------------------------------- -}
__ profile_final_call(O4);
{- -------------------------------------------
(1) コード生成:
「対応する return entry のアドレスを取得して Rret に入れる.
(ここでは, 3byte先のバイトコードにdispatchする return entry を取得)」
---------------------------------------- -}
// get return address
AddressLiteral table(Interpreter::return_3_addrs_by_index_table());
__ set(table, Rtemp);
__ srl(Rret, ConstantPoolCacheEntry::tosBits, Rret); // get return type
// Make sure we don't need to mask Rret for tosBits after the above shift
ConstantPoolCacheEntry::verify_tosBits();
__ sll(Rret, LogBytesPerWord, Rret);
__ ld_ptr(Rtemp, Rret, Rret); // get return address
{- -------------------------------------------
(1) コード生成:
「実際の呼び出し処理を行う」
---------------------------------------- -}
// do the call
__ call_from_interpreter(Rscratch, Gargs, Rret);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.