JIT コンパイル対象になった native method の場合, method entry 部での処理には SharedRuntime::generate_native_wrapper() で生成されたコードが使われる (See: here for details).
zero(shark) を使う場合は, 実際の処理内容は上記の関数から呼び出される SharkNativeWrapper::initialize() が生成している.
(See: here for details) -> SharedRuntime::generate_native_wrapper() が生成したコード -> (1) "unverified entry point" から入ってきた場合は Inline Caching 用の型検査を行う. (型が違っていた場合は, SharedRuntime::get_ic_miss_stub() に格納されているスタブにジャンプ) (1) stack overflow のチェックを行う (stack banging コード) -> AbstractAssembler::generate_stack_overflow_check() が生成したコード (1) スタック上に新しいフレームを確保する (1) 引数をネイティブメソッドの calling convention に合わせて移動させる (1) staic method の場合は, クラスオブジェクトを引数としてセットする (1) synchronized method の場合はロックを取得する -> MacroAssembler::compiler_lock_object() が生成したコード -> SharedRuntime::complete_monitor_locking_C() (<= fast-path が失敗した場合) (1) native メソッドの呼び出しを行う -> (native メソッドの処理が実行される) (1) ネイティブメソッドの返値を Java VM 内の calling convention に合わせて移動させる (1) もし Safepoint 停止が開始されていた場合は, ここで block する. -> JavaThread::check_special_condition_for_native_trans() (1) スタック上の yellow page が disabled になっていたら, 元に戻す. -> SharedRuntime::reguard_yellow_pages() (1) synchronized method の場合はロックを解放する -> MacroAssembler::compiler_unlock_object() が生成したコード -> SharedRuntime::complete_monitor_unlocking_C() (<= fast-path が失敗した場合) (1) 例外が起きていれば伝搬させる. この場合は以降の処理は行わない. -> StubRoutines::forward_exception_entry() が指しているコード (= StubGenerator::generate_forward_exception() が生成したコード) -> (See: here for details) (1) 呼び出し元にリターン
(See: here for details) -> SharedRuntime::generate_native_wrapper() が生成したコード -> (1) "unverified entry point" から入ってきた場合は Inline Caching 用の型検査を行う. (型が違っていた場合は, SharedRuntime::get_ic_miss_stub() に格納されているスタブにジャンプ) (1) stack overflow のチェックを行う (stack banging コード) -> MacroAssembler::bang_stack_with_offset() が生成したコード (1) スタック上に新しいフレームを確保する (1) 引数をネイティブメソッドの calling convention に合わせて移動させる (1) staic method の場合は, クラスオブジェクトを引数としてセットする (1) synchronized method の場合はロックを取得する -> SharedRuntime::complete_monitor_locking_C() (<= fast-path が失敗した場合) (1) native メソッドの呼び出しを行う -> (native メソッドの処理が実行される) (1) ネイティブメソッドの返値を Java VM 内の calling convention に合わせて移動させる (1) もし Safepoint 停止が開始されていた場合は, ここで block する. -> JavaThread::check_special_condition_for_native_trans() (1) スタック上の yellow page が disabled になっていたら, 元に戻す. -> SharedRuntime::reguard_yellow_pages() (1) synchronized method の場合はロックを解放する -> SharedRuntime::complete_monitor_unlocking_C() (<= fast-path が失敗した場合) (1) スタックフレームを破棄する (1) 例外が起きていれば伝搬させる. この場合は以降の処理は行わない. -> StubRoutines::forward_exception_entry() が指しているコード (= StubGenerator::generate_forward_exception() が生成したコード) -> (See: here for details) (1) 呼び出し元にリターン
(See: here for details) -> SharkNativeWrapper::initialize() が生成したコード ->
See: here for details
See: here for details
(#Under Construction) See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.