hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
// Quicken instance-of and check-cast bytecodes
IRT_ENTRY(void, InterpreterRuntime::quicken_io_cc(JavaThread* thread))
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
// Force resolving; quicken the bytecode
int which = get_index_u2(thread, Bytecodes::_checkcast);
constantPoolOop cpool = method(thread)->constants();
{- -------------------------------------------
(1) (コメントによると,
ここに来るのは (quicken されていないのを確認して) quicken しにくる時だけのはず.
ただ, マルチスレッドなので並行して他のスレッドが quicken を行っている可能性はあり,
そのためここに来た時点では quicken されているかもしれない.
とのこと)
---------------------------------------- -}
// We'd expect to assert that we're only here to quicken bytecodes, but in a multithreaded
// program we might have seen an unquick'd bytecode in the interpreter but have another
// thread quicken the bytecode before we get here.
// assert( cpool->tag_at(which).is_unresolved_klass(), "should only come here to quicken bytecodes" );
{- -------------------------------------------
(1) constantPoolOopDesc::klass_at() を呼んで, 対象のクラス(klassOop)を取得する.
(この際, 対象クラスが constantPoolOopDesc 中でまだ解決されてなければ解決も行われる)
---------------------------------------- -}
klassOop klass = cpool->klass_at(which, CHECK);
{- -------------------------------------------
(1) (取得した klassOop を返値として返したいので)
引数で指定されたスレッドの vm_result フィールドに結果を格納しておく.
---------------------------------------- -}
thread->set_vm_result(klass);
IRT_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.