hotspot/src/share/vm/interpreter/rewriter.cpp
void Rewriter::relocate_and_link(instanceKlassHandle this_oop,
objArrayHandle methods, TRAPS) {
{- -------------------------------------------
(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.