hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide))
{- -------------------------------------------
(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.