hotspot/src/share/vm/oops/constantPoolOop.cpp
oop constantPoolOopDesc::string_at_impl(constantPoolHandle this_oop, int which, TRAPS) {
{- -------------------------------------------
(1) (変数宣言など)
(str 局所変数は, 返値を格納する変数)
---------------------------------------- -}
oop str = NULL;
{- -------------------------------------------
(1) 返値とする文字列オブジェクトを取得する.
取得方法は, Constant Pool 内の対象箇所が resolve 済みかどうかに応じて 2通り.
* まだ resolve 済みではない場合:
StringTable::intern() で文字列オブジェクトを取得.
(なおこの場合は, constantPoolOopDesc::string_at_put() を呼んで
Constant Pool の該当箇所に取得した文字列オブジェクトをセットする処理も行っている.
(次回以降に解決の必要性をなくすため))
(なお, この処理は ... を取得して排他した状態で行う)
(なお, 排他する前に, 並行して他のスレッドに解決される可能性があるため,
ロックを取った後でもう一度確認も行っている.)
* 既に resolve 済みの場合:
Constant Pool 内に記録されている解決結果を使用するだけ. (CPSlot::get_oop() で取得)
---------------------------------------- -}
CPSlot entry = this_oop->slot_at(which);
if (entry.is_metadata()) {
ObjectLocker ol(this_oop, THREAD);
if (this_oop->tag_at(which).is_unresolved_string()) {
// Intern string
Symbol* sym = this_oop->unresolved_string_at(which);
str = StringTable::intern(sym, CHECK_(constantPoolOop(NULL)));
this_oop->string_at_put(which, str);
} else {
// Another thread beat us and interned string, read string from constant pool
str = this_oop->resolved_string_at(which);
}
} else {
str = entry.get_oop();
}
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(java_lang_String::is_instance(str), "must be string");
{- -------------------------------------------
(1) 結果をリターン
---------------------------------------- -}
return str;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.