Interpreter 自体の初期化処理は, HotSpot の起動時に呼び出される Interpreter::initialize() の中で行われる. (See: here for details). Template Interpreter 使用時には Interpreter マクロ定数は TemplateInterpreter に #define されているので, 実際に呼び出されるのは TemplateInterpreter::initialize() になる.
TemplateInterpreter::initialize() 内では TemplateInterpreter の構築処理が行われる. 実際の構築処理のほとんどは InterpreterGenerator のコンストラクタ内に実装されている.
InterpreterGenerator のコンストラクタ内の処理は cpu/ ごとに定義されている. ただし, どの定義も (スーパークラスとして CppInterpreterGenerator か TemplateInterpreterGenerator のコンストラクタを呼んだ後) TemplateInterpreterGenerator::generate_all() を呼び出すだけになっている. (なぜ share/ 以下で共通化していない? #TODO)
なお, TemplateInterpreter が使用する TemplateTable の初期化処理 (TemplateTable::initialize()) については, TemplateInterpreter の初期化処理 (TemplateInterpreter::initialize()) から呼び出されているほか, init_globals() 内で呼ばれる templateTable_init() からも呼び出されている.
とはいえ, 一度でいいと思うので templateTable_init() の処理は要らない気がするが...?? #TODO.
(See: here for details) -> TemplateInterpreter::initialize() -> (1) 基底クラスの初期化メソッドを呼び出して, InvocationCounter 等の初期化を行う. -> AbstractInterpreter::initialize() -> InvocationCounter::reinitialize() -> InvocationCounter::def() (2) 各バイトコードに対応する Template オブジェクトを生成する (なお, ここでは Template オブジェクトを作るだけ. これらの Template オブジェクトによって実際にコードが生成されるのはもう少し先) -> TemplateTable::initialize() -> TemplateTable::def() -> Template::initialize() -> TemplateTable::pd_initialize() (3) 実際にインタープリタを構築する -> InterpreterGenerator::InterpreterGenerator() -> TemplateInterpreterGenerator::generate_all() (1) ネイティブメソッド用の generic (slow) signature handler の生成 -> AbstractInterpreterGenerator::generate_all() -> AbstractInterpreterGenerator::generate_slow_signature_handler() -> (See: here for details) (1) 実行時エラー用のコード (TOS 状態がおかしい時などに使用するコード) を生成 -> TemplateInterpreterGenerator::generate_error_exit() (1) デバッグ用のバイトコードトレースコードを生成 (#ifndef PRODUCT にのみ生成) -> TemplateInterpreterGenerator::generate_trace_code() (1) return entry 用のコードを生成 -> TemplateInterpreterGenerator::generate_return_entry_for() -> (See: here for details) (1) JVMTI の ForceEarlyReturn 処理用のコードレットを生成 -> TemplateInterpreterGenerator::generate_earlyret_entry_for() -> (See: here for details) (1) Deoptimization 処理用の deopt entry を生成 -> TemplateInterpreterGenerator::generate_deopt_entry_for() -> (See: Deoptimization) (1) ネイティブメソッド用の result handler を作成 -> TemplateInterpreterGenerator::generate_result_handler_for() -> (See: here for details) (1) 各種 invoke 命令 (invokevirtual, invokeinterface etc) 用の return entry を取得する -> Interpreter::return_entry() (1) ??#TODO の生成 -> TemplateInterpreterGenerator::generate_continuation_for() (1) Template Interpreter を Safepoint 停止させるためのコードを生成 -> TemplateInterpreterGenerator::generate_safept_entry_for() (1) 例外発生時の例外送出処理やスタックの巻き戻し処理コードの生成 -> TemplateInterpreterGenerator::generate_throw_exception() -> (See: here for details) -> TemplateInterpreterGenerator::generate_${例外名}_handler() -> (See: here for details) (1) メソッドのエントリ部処理用コードの生成 -> AbstractInterpreterGenerator::generate_method_entry() -> (See: here for details) (1) 各バイトコードに対応するコードの生成 -> TemplateInterpreterGenerator::set_entry_points_for_all_bytes() -> (See: here for details) (1) Safepoint 停止用の dispatch table(TemplateInterpreter::_safept_table) の生成 -> TemplateInterpreterGenerator::set_safepoints_for_all_bytes()
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
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
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
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.