Top


定義場所(file name)

hotspot/src/share/vm/classfile/verifier.cpp

名前(function name)

void ClassVerifier::verify_class(TRAPS) {

本体部(body)

  {- -------------------------------------------
  (1) (トレース出力)
      ---------------------------------------- -}

      if (_verify_verbose) {
        tty->print_cr("Verifying class %s with new format",
          _klass->external_name());
      }

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      objArrayHandle methods(THREAD, _klass->methods());
      int num_methods = methods->length();

  {- -------------------------------------------
  (1) verify 対象のクラスの全てのメソッドに対して
      ClassVerifier::verify_method() を呼び出し, 
      verification を行う.

      (ただし, verify 処理中の再帰的な処理により, 
       このクラスの verification が完了してしまうことがある.
       そのため, 既に verification が完了してしまっていれば 
        (= ClassVerifier::was_recursively_verified() が true であれば)
       その時点で終了してリターンする)

      (また, 対象のメソッドがネイティブメソッドだったり abstract メソッドだった場合は
       (検証のしようがないので) 何もしない)
      ---------------------------------------- -}

      for (int index = 0; index < num_methods; index++) {
        // Check for recursive re-verification before each method.
        if (was_recursively_verified())  return;

        methodOop m = (methodOop)methods->obj_at(index);
        if (m->is_native() || m->is_abstract()) {
          // If m is native or abstract, skip it.  It is checked in class file
          // parser that methods do not override a final method.
          continue;
        }
        verify_method(methodHandle(THREAD, m), CHECK_VERIFY(this));
      }

  {- -------------------------------------------
  (1) (トレース出力)
      ---------------------------------------- -}

      if (_verify_verbose || TraceClassInitialization) {
        if (was_recursively_verified())
          tty->print_cr("Recursive verification detected for: %s",
              _klass->external_name());
      }
    }

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