一般的なメソッドの場合, エントリ部では以下のような処理が行われる.
呼び出し元フレームへのローカル変数領域の挿入
(JVM のメソッド呼び出し(invoke*)では, 引数は呼び出し元のフレームのオペランドスタックに乗っている. さらに, 引数とローカル変数は(?load/?storeで)連続的にアクセスできる仕様になっている. そこで, 呼び出し元のオペランドスタックの現在使用点の直下にローカル変数領域を確保する)
呼び出し先フレームの作成
レジスタの設定(Lbcp, Lmethod, Llocals, Lmonitors, Lesp, LcpoolCache)
局所変数領域の初期化
JIT コンパイル閾値の確認
スタック溢れの検査 (SP の 1 ページ先にアクセスして確認)
(synchronized なら) モニタの取得
メソッドの最初のバイトコードに対応する codelet にジャンプして実行開始
InterpreterGenerator::generate_normal_entry() が生成したコード -> (1) スタック上に新しいフレームを確保する -> TemplateInterpreterGenerator::generate_fixed_frame() が生成したコード (1) JIT コンパイラを使う場合は, invocation counter 値を増加させて値をチェックする -> InterpreterGenerator::generate_counter_incr() が生成したコード (1) stack overflow をチェックする (stack banging コード) -> AbstractInterpreterGenerator::bang_stack_shadow_pages() が生成したコード (1) synchronized method の場合はロックを取得する -> InterpreterGenerator::lock_method() が生成したコード -> (See: here for details) (1) メソッドの最初のバイトコードに対応するテンプレートへとジャンプする -> InterpreterMacroAssembler::dispatch_next() が生成するコード
InterpreterGenerator::generate_normal_entry() が生成したコード -> (1) stack overflow のチェックを行う. -> InterpreterGenerator::generate_stack_overflow_check() が生成したコード (1) スタック上に新しいフレームを確保する -> TemplateInterpreterGenerator::generate_fixed_frame() が生成したコード (1) JIT コンパイラを使う場合は, invocation counter 値を増加させて値をチェックする -> InterpreterGenerator::generate_counter_incr() が生成したコード (1) stack overflow をチェックする (stack banging コード) -> AbstractInterpreterGenerator::bang_stack_shadow_pages() が生成したコード (1) synchronized method の場合はロックを取得する -> InterpreterGenerator::lock_method() が生成したコード -> (See: here for details) (1) メソッドの最初のバイトコードに対応するテンプレートへとジャンプする -> InterpreterMacroAssembler::dispatch_next() が生成するコード
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
(#Under Construction)
(See: here for details)
(See: here for details)
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
(See: here for details)
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.