Top


定義場所(file name)

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

名前(function name)

klassOop typeArrayKlass::array_klass_impl(typeArrayKlassHandle h_this, bool or_null, int n, TRAPS) {

本体部(body)

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