Top


定義場所(file name)

hotspot/src/share/vm/runtime/compilationPolicy.cpp

説明(description)

// Returns true if m is allowed to be compiled

名前(function name)

bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) {

本体部(body)

  {- -------------------------------------------
  (1) 以下の条件のどれかに当てはまる場合は, false をリターン.
      そうでなければ true をリターン.

      * 対象のメソッドが abstract method の場合
      * DontCompileHugeMethods オプションが指定されており,
        かつ対象のメソッドのバイトコード数が HugeMethodLimit を超えている場合
      * 対象のメソッドに対して, AbstractInterpreter::can_be_compiled() が false を返す場合
        (この判定はプラットフォームによって異なるが, x86 上では数学関数がコンパイル禁止になっている.
        ただしコメントによると, 製品用のビルド時にはそもそも数学関数の InvocationCounter が増加しないので, これはデバッグビルド時用の条件, とのこと)
      * 対象のメソッドの methodOopDesc::is_not_compilable() が true を返す場合.
        ただし, 引数の comp_level の値に応じて少し内容が変わる.
        * comp_level が CompLevel_all (= デフォルト引数値) の場合:
          CompLevel_simple 及び CompLevel_full_optimization のどちらかで true を返せば false.
        * それ以外の場合
          引数で指定された comp_level で true を返せば false.
      ---------------------------------------- -}

      if (m->is_abstract()) return false;
      if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false;

      // Math intrinsics should never be compiled as this can lead to
      // monotonicity problems because the interpreter will prefer the
      // compiled code to the intrinsic version.  This can't happen in
      // production because the invocation counter can't be incremented
      // but we shouldn't expose the system to this problem in testing
      // modes.
      if (!AbstractInterpreter::can_be_compiled(m)) {
        return false;
      }
      if (comp_level == CompLevel_all) {
        return !m->is_not_compilable(CompLevel_simple) && !m->is_not_compilable(CompLevel_full_optimization);
      } else {
        return !m->is_not_compilable(comp_level);
      }
    }

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.