hotspot/src/share/vm/prims/nativeLookup.cpp
// Check if there are any JVM TI prefixes which have been applied to the native method name.
// If any are found, remove them before attemping the look up of the
// native implementation again.
// See SetNativeMethodPrefix in the JVM TI Spec for more details.
address NativeLookup::lookup_entry_prefixed(methodHandle method, bool& in_base_library, TRAPS) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
ResourceMark rm(THREAD);
{- -------------------------------------------
(1) JVMTI の SetNativeMethodPrefix(or SetNativeMethodPrefies) で指定された全ての prefix に関して iterate し,
prefix 分を除外したメソッド名を計算する.
---------------------------------------- -}
int prefix_count;
char** prefixes = JvmtiExport::get_all_native_method_prefixes(&prefix_count);
char* in_name = method->name()->as_C_string();
char* wrapper_name = in_name;
// last applied prefix will be first -- go backwards
for (int i = prefix_count-1; i >= 0; i--) {
char* prefix = prefixes[i];
size_t prefix_len = strlen(prefix);
{- -------------------------------------------
(1.1) もしメソッド名の先頭部分が prefix と一致したら, その部分はメソッド名から削除する (メソッド名を指すポインタをその分だけ進ませる)
---------------------------------------- -}
if (strncmp(prefix, wrapper_name, prefix_len) == 0) {
// has this prefix remove it
wrapper_name += prefix_len;
}
}
{- -------------------------------------------
(1) もし prefix 除去によってメソッド名が変わっていれば,
対応する wrapper method の methodOop を(それが存在していれば)取得し,
NativeLookup::lookup_entry() でその wrapper method に対するリンク先を探索する.
そのまま探索結果をリターン.
---------------------------------------- -}
if (wrapper_name != in_name) {
// we have a name for a wrapping method
int wrapper_name_len = (int)strlen(wrapper_name);
TempNewSymbol wrapper_symbol = SymbolTable::probe(wrapper_name, wrapper_name_len);
if (wrapper_symbol != NULL) {
KlassHandle kh(method->method_holder());
methodOop wrapper_method = Klass::cast(kh())->lookup_method(wrapper_symbol,
method->signature());
if (wrapper_method != NULL && !wrapper_method->is_native()) {
// we found a wrapper method, use its native entry
method->set_is_prefixed_native();
return lookup_entry(wrapper_method, in_base_library, THREAD);
}
}
}
{- -------------------------------------------
(1) prefix 除去が行われずメソッド名が変わっていなかった場合や,
prefix 除去は行われたが除去後のメソッド名に対応する methodOop が見つからなかった場合は,
NULL をリターンする.
---------------------------------------- -}
return NULL;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.