Top


定義場所(file name)

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

名前(function name)

typeArrayHandle ClassFileParser::sort_methods(objArrayHandle methods,
                                              objArrayHandle methods_annotations,
                                              objArrayHandle methods_parameter_annotations,
                                              objArrayHandle methods_default_annotations,
                                              TRAPS) {

本体部(body)

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

      typeArrayHandle nullHandle;
      int length = methods()->length();

  {- -------------------------------------------
  (1) 以下のどちらかが成り立つ場合には, 
      ソートする前の順序を覚えておく必要があるので, 
      各 methodOop 内の vtable_index フィールドにオリジナルの順序を記録しておく.

      * JvmtiExport::can_maintain_original_method_order() が true.
      * DumpSharedSpaces オプションが指定されている.
      ---------------------------------------- -}

      // If JVMTI original method ordering or sharing is enabled we have to
      // remember the original class file ordering.
      // We temporarily use the vtable_index field in the methodOop to store the
      // class file index, so we can read in after calling qsort.
      // Put the method ordering in the shared archive.
      if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
        for (int index = 0; index < length; index++) {
          methodOop m = methodOop(methods->obj_at(index));
          assert(!m->valid_vtable_index(), "vtable index should not be set");
          m->set_vtable_index(index);
        }
      }

  {- -------------------------------------------
  (1) methodOopDesc::sort_methods() を呼んで実際のソート処理を行う.
      ---------------------------------------- -}

      // Sort method array by ascending method name (for faster lookups & vtable construction)
      // Note that the ordering is not alphabetical, see Symbol::fast_compare
      methodOopDesc::sort_methods(methods(),
                                  methods_annotations(),
                                  methods_parameter_annotations(),
                                  methods_default_annotations());

  {- -------------------------------------------
  (1) リターンする.

      (なお, 以下のどちらかが成り立つ場合には, 
       ソートする前の順序を覚えておく必要があるので
       オリジナルの順序を表す int 配列 (typeArrayHandle) を作ってリターンする.

       そうでない場合には, そういった情報は必要ないので, 
       空の int 配列 (typeArrayHandle)をリターンする.

       * JvmtiExport::can_maintain_original_method_order() が true.
       * DumpSharedSpaces オプションが指定されている.                    )
      ---------------------------------------- -}

      // If JVMTI original method ordering or sharing is enabled construct int
      // array remembering the original ordering
      if (JvmtiExport::can_maintain_original_method_order() || DumpSharedSpaces) {
        typeArrayOop new_ordering = oopFactory::new_permanent_intArray(length, CHECK_(nullHandle));
        typeArrayHandle method_ordering(THREAD, new_ordering);
        for (int index = 0; index < length; index++) {
          methodOop m = methodOop(methods->obj_at(index));
          int old_index = m->vtable_index();
          assert(old_index >= 0 && old_index < length, "invalid method index");
          method_ordering->int_at_put(index, old_index);
          m->set_vtable_index(methodOopDesc::invalid_vtable_index);
        }
        return method_ordering;
      } else {
        return typeArrayHandle(THREAD, Universe::the_empty_int_array());
      }
    }

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