hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
IRT_ENTRY(void, InterpreterRuntime::prepare_native_call(JavaThread* thread, methodOopDesc* method))
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
methodHandle m(thread, method);
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(m->is_native(), "sanity check");
{- -------------------------------------------
(1) もしまだ呼び出し先の関数とのダイナミックリンクが終わっていなければ
(= methodOopDesc::has_native_function() が false を返す場合は),
NativeLookup::lookup() でリンクしておく.
(See: [here](no3059err.html) for details)
---------------------------------------- -}
// lookup native function entry point if it doesn't exist
bool in_base_library;
if (!m->has_native_function()) {
NativeLookup::lookup(m, in_base_library, CHECK);
}
{- -------------------------------------------
(1) SignatureHandlerLibrary::add() を呼び出し,
(まだ生成されていなければ)このメソッド用の signature handler を生成しておく.
---------------------------------------- -}
// make sure signature handler is installed
SignatureHandlerLibrary::add(m);
{- -------------------------------------------
(1) (なおコメントによると, インタープリタのコードは signature handler を先にチェックし,
その後 native entry point 等をチェックするので,
マルチプロセッサ環境のことを考えると, 値をセットする時には逆に
signature handler を最後にセットするようにしないといけない, とのこと.)
---------------------------------------- -}
// The interpreter entry point checks the signature handler first,
// before trying to fetch the native entry point and klass mirror.
// We must set the signature handler last, so that multiple processors
// preparing the same method will be sure to see non-null entry & mirror.
IRT_END
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.