hotspot/src/share/vm/oops/typeArrayKlass.cpp
klassOop typeArrayKlass::array_klass_impl(typeArrayKlassHandle h_this, bool or_null, int n, TRAPS) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
int dimension = h_this->dimension();
assert(dimension <= n, "check order of chain");
{- -------------------------------------------
(1) まず, リターンすべき配列クラスの次元数を
h_this 引数の配列クラスの次元数と比較する.
もし一致すれば, h_this 引数をリターンするだけでいい (この場合はここで終了).
---------------------------------------- -}
if (dimension == n)
return h_this();
{- -------------------------------------------
(1) (ここに来るのは, h_this 引数のクラスでは次元数が足りない場合.
この場合, h_this より1つ高次元の配列クラスに処理を移譲することになる)
---------------------------------------- -}
{- -------------------------------------------
(1) (変数宣言など)
(h_ak は, h_this より1つ高次元の配列クラス(まだクラスが作成されてなければ null handle))
---------------------------------------- -}
objArrayKlassHandle h_ak(THREAD, h_this->higher_dimension());
{- -------------------------------------------
(1) もし, h_this より1つ高次元の配列クラスがまだ作成されていなければ,
以下の if ブロック内で生成する.
(ただし, or_null 引数が true の場合は, 作成せずここで NULL をリターンするだけ)
(なお, 一度生成したら arrayKlass::set_higher_dimension() で結果をメモイズするため,
各次元数に付き最初の1回のみ配列クラスが作成される)
---------------------------------------- -}
if (h_ak.is_null()) {
if (or_null) return NULL;
ResourceMark rm;
JavaThread *jt = (JavaThread *)THREAD;
{- -------------------------------------------
(1.1) (以下が作成処理.
ロックを取ったあと objArrayKlassKlass::allocate_objArray_klass() で生成する.
なお, ロックを取った後には DCL idiom でのチェックも行っている)
---------------------------------------- -}
{
MutexLocker mc(Compile_lock, THREAD); // for vtables
// Atomic create higher dimension and link into list
MutexLocker mu(MultiArray_lock, THREAD);
h_ak = objArrayKlassHandle(THREAD, h_this->higher_dimension());
if (h_ak.is_null()) {
klassOop oak = objArrayKlassKlass::cast(
Universe::objArrayKlassKlassObj())->allocate_objArray_klass(
dimension + 1, h_this, CHECK_NULL);
h_ak = objArrayKlassHandle(THREAD, oak);
h_ak->set_lower_dimension(h_this());
OrderAccess::storestore();
h_this->set_higher_dimension(h_ak());
assert(h_ak->oop_is_objArray(), "incorrect initialization of objArrayKlass");
}
}
} else {
CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
}
{- -------------------------------------------
(1) h_this より1つ高次元の配列クラスに対して
Klass::array_klass() を呼び出すことで,
指定された次元数に対応する arrayKlass を取得する.
その結果をリターン.
(なお, or_null 引数が true の場合は,
Klass::array_klass() の代わりに Klass::array_klass_or_null() を使用)
---------------------------------------- -}
if (or_null) {
return h_ak->array_klass_or_null(n);
}
return h_ak->array_klass(n, CHECK_NULL);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.