Top


定義場所(file name)

hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp

名前(function name)

void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {

本体部(body)

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