hotspot/src/share/vm/oops/instanceKlass.cpp
klassOop instanceKlass::array_klass_impl(instanceKlassHandle this_oop, bool or_null, int n, TRAPS) {
{- -------------------------------------------
(1) もし, 対象クラス(this_oop 引数)の配列クラスがまだ生成されていなければ
(= instanceKlass::array_klasses() が NULL であれば),
以下の if ブロック内で配列クラスを生成する.
(ただし, or_null 引数が true の場合は, 作成せずここで NULL をリターンするだけ)
(なお, 一度生成したら instanceKlass::set_array_klasses() で結果をメモイズするため,
各クラスに付き最初の1回のみ配列クラスが作成される)
---------------------------------------- -}
if (this_oop->array_klasses() == NULL) {
if (or_null) return NULL;
ResourceMark rm;
JavaThread *jt = (JavaThread *)THREAD;
{- -------------------------------------------
(1.1) (以下が作成処理.
ロックを取ったあと objArrayKlassKlass::allocate_objArray_klass() で生成する.
なお, ロックを取った後には DCL idiom でのチェックも行っている)
---------------------------------------- -}
{
// Atomic creation of array_klasses
MutexLocker mc(Compile_lock, THREAD); // for vtables
MutexLocker ma(MultiArray_lock, THREAD);
// Check if update has already taken place
if (this_oop->array_klasses() == NULL) {
objArrayKlassKlass* oakk =
(objArrayKlassKlass*)Universe::objArrayKlassKlassObj()->klass_part();
klassOop k = oakk->allocate_objArray_klass(1, this_oop, CHECK_NULL);
this_oop->set_array_klasses(k);
}
}
}
{- -------------------------------------------
(1) 配列クラスを表す objArrayKlass に対して Klass::array_klass() を呼び出すことで,
指定された次元数に対応する arrayKlass を取得する.
その結果をリターン.
(なお, or_null 引数が true の場合は,
Klass::array_klass() の代わりに Klass::array_klass_or_null() を使用)
---------------------------------------- -}
// _this will always be set at this point
objArrayKlass* oak = (objArrayKlass*)this_oop->array_klasses()->klass_part();
if (or_null) {
return oak->array_klass_or_null(n);
}
return oak->array_klass(n, CHECK_NULL);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.