Top


定義場所(file name)

hotspot/src/share/vm/interpreter/interpreterRuntime.cpp

名前(function name)

IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide))

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      // access constant pool
      constantPoolOop pool = method(thread)->constants();
      int index = wide ? get_index_u2(thread, Bytecodes::_ldc_w) : get_index_u1(thread, Bytecodes::_ldc);
      constantTag tag = pool->tag_at(index);

  {- -------------------------------------------
  (1) ロード対象がクラスオブジェクトの場合, 
      constantPoolOopDesc::klass_at() で対象のクラス(klassOop)を取得し, そこから
      対応する mirror オブジェクト(クラスオブジェクト)を取得
      (結果は, 返値として返したいので, 引数で指定されたスレッドの vm_result フィールドに結果を格納)

      (なお, 対象クラスが constantPoolOopDesc 中でまだ解決されてなければ, 
       constantPoolOopDesc::klass_at() 時に解決も行われる)
      ---------------------------------------- -}

      if (tag.is_unresolved_klass() || tag.is_klass()) {
        klassOop klass = pool->klass_at(index, CHECK);
        oop java_class = klass->java_mirror();
        thread->set_vm_result(java_class);

  {- -------------------------------------------
  (1) ロード対象が文字列オブジェクトの場合, 
      constantPoolOopDesc::string_at() で対象の文字列オブジェクトを取得.
      (結果は, 返値として返したいので, 引数で指定されたスレッドの vm_result フィールドに結果を格納)

      (なお, 対象文字列が constantPoolOopDesc 中でまだ解決されてなければ, 
       constantPoolOopDesc::string_at() 時に解決も行われる)
      ---------------------------------------- -}

      } else {
    #ifdef ASSERT
        // If we entered this runtime routine, we believed the tag contained
        // an unresolved string, an unresolved class or a resolved class.
        // However, another thread could have resolved the unresolved string
        // or class by the time we go there.
        assert(tag.is_unresolved_string()|| tag.is_string(), "expected string");
    #endif
        oop s_oop = pool->string_at(index, CHECK);
        thread->set_vm_result(s_oop);
      }
    IRT_END

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.