Top


定義場所(file name)

hotspot/src/share/vm/interpreter/rewriter.cpp

名前(function name)

void Rewriter::relocate_and_link(instanceKlassHandle this_oop,
                                 objArrayHandle methods, TRAPS) {

本体部(body)

  {- -------------------------------------------
  (1) 処理対象の全てのメソッドに対して 
      jsr バイトコードに関する再配置処理と, 
      各メソッドにエントリポイントを設定する処理を行う.
      ---------------------------------------- -}

      int len = methods->length();
      for (int i = len-1; i >= 0; i--) {

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

        methodHandle m(THREAD, (methodOop)methods->obj_at(i));

    {- -------------------------------------------
  (1.1) Rewriter::rewrite_jsrs() を呼び出し, 
        jsr バイトコードに関する再配置を行う.
        ---------------------------------------- -}

        if (m->has_jsrs()) {
          m = rewrite_jsrs(m, CHECK);
          // Method might have gotten rewritten.
          methods->obj_at_put(i, m());
        }

    {- -------------------------------------------
  (1.1) methodOopDesc::link_method() を呼び出し, 
        対象のメソッドのエントリポイントを設定する.
        (これにより, 対象メソッドはインタープリタ/JIT生成コードから呼び出せるようになる)
        ---------------------------------------- -}

        // Set up method entry points for compiler and interpreter    .
        m->link_method(m, CHECK);

    {- -------------------------------------------
  (1.1) (デバッグ用の処理) (#ifdef ASSERT 時にのみ実行)
        ---------------------------------------- -}

        // This is for JVMTI and unrelated to relocator but the last thing we do
    #ifdef ASSERT
        if (StressMethodComparator) {
          static int nmc = 0;
          for (int j = i; j >= 0 && j >= i-4; j--) {
            if ((++nmc % 1000) == 0)  tty->print_cr("Have run MethodComparator %d times...", nmc);
            bool z = MethodComparator::methods_EMCP(m(),
                       (methodOop)methods->obj_at(j));
            if (j == i && !z) {
              tty->print("MethodComparator FAIL: "); m->print(); m->print_codes();
              assert(z, "method must compare equal to itself");
            }
          }
        }
    #endif //ASSERT
      }
    }

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