Top


定義場所(file name)

hotspot/src/share/vm/oops/instanceKlass.cpp

名前(function name)

klassOop instanceKlass::array_klass_impl(instanceKlassHandle this_oop, bool or_null, int n, TRAPS) {

本体部(body)

  {- -------------------------------------------
  (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.