hotspot/src/share/vm/classfile/classFileParser.cpp
typeArrayHandle ClassFileParser::sort_methods(objArrayHandle methods,
objArrayHandle methods_annotations,
objArrayHandle methods_parameter_annotations,
objArrayHandle methods_default_annotations,
TRAPS) {
{- -------------------------------------------
(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.