hotspot/src/share/vm/classfile/verifier.cpp
static void* verify_byte_codes_fn() {
{- -------------------------------------------
(1) (この関数では, 初回の呼び出し時に
結果を _verify_byte_codes_fn 大域変数にキャッシュしている.
二度目以降は, キャッシュした結果を返す)
---------------------------------------- -}
{- -------------------------------------------
(1) まだキャッシュしていなければ (= 初回の呼び出し時であれば)
libjava 内から VerifyClassCodesForMajorVersion() 関数を指すポインタを取得し,
_verify_byte_codes_fn 大域変数に設定する.
もし, VerifyClassCodesForMajorVersion() が見つからなければ,
VerifyClassCodes() 関数を指すポインタを取得し,
_verify_byte_codes_fn 大域変数に設定する.
(なお, どちらを設定したか分かるように,
VerifyClassCodes() の場合は _is_new_verify_byte_codes_fn 大域変数を false にする)
---------------------------------------- -}
if (_verify_byte_codes_fn == NULL) {
void *lib_handle = os::native_java_library();
void *func = os::dll_lookup(lib_handle, "VerifyClassCodesForMajorVersion");
OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
if (func == NULL) {
OrderAccess::release_store(&_is_new_verify_byte_codes_fn, false);
func = os::dll_lookup(lib_handle, "VerifyClassCodes");
OrderAccess::release_store_ptr(&_verify_byte_codes_fn, func);
}
}
{- -------------------------------------------
(1) _verify_byte_codes_fn の値をリターン
---------------------------------------- -}
return (void*)_verify_byte_codes_fn;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.