これらは, Template Interpreter 用のクラス (#ifndef CC_INTERP 時にしか定義されない).
Template Interpreter が使用するコードレットの生成を担当する.
((cite: hotspot/src/share/vm/interpreter/templateTable.hpp))
#ifndef CC_INTERP
// All the necessary definitions used for (bytecode) template generation. Instead of
// spreading the implementation functionality for each bytecode in the interpreter
// and the snippet generator, a template is assigned to each bytecode which can be
// used to generate the bytecode's implementation if needed.
Template Interpreter 用のクラス (#ifndef CC_INTERP 時にしか定義されない). このクラスが, Template Interpreter における実際の各bytecodeでの挙動を定めている (C++ Interpreter における BytecodeInterpreter クラスに相当). (See: here, here and here for details)
より具体的に言うと, Template Interpreter 用のコードレットの生成処理を行うクラス (より正確には, そのための機能を納めた名前空間(AllStatic クラス))
((cite: hotspot/src/share/vm/interpreter/templateTable.hpp))
// The TemplateTable defines all Templates and provides accessor functions
// to get the template for a given bytecode.
class TemplateTable: AllStatic {
各バイトコード用のマシン語列を生成するメソッドが定義されている (e.g. TemplateTable::aload(), TemplateTable::invokevirtual(), TemplateTable::getfield(), etc).
(なお, これらのメソッドの中身は cpu/ ディレクトリ下で実装されている)
See: here for details
Template Interpreter 用のクラス (#ifndef CC_INTERP 時にしか定義されない).
TemplateTable クラス内で使用される補助クラス. 各コードレットの生成方法についての情報を格納している. 1つの Template オブジェクトが 1つのコードレットに担当する.
((cite: hotspot/src/share/vm/interpreter/templateTable.hpp))
// A Template describes the properties of a code template for a given bytecode
// and provides a generator to generate the code template.
class Template VALUE_OBJ_CLASS_SPEC {
以下の箇所に(のみ)格納されている.
(正確には, このフィールドは Template の配列を格納するフィールド. この中に, wide prefix 無しのバイトコードに対応する全ての Template オブジェクトが格納されている. 配列長は Bytecodes::number_of_codes)
(正確には, このフィールドは Template の配列を格納するフィールド. この中に, wide prefix 有りのバイトコードに対応する全ての Template オブジェクトが格納されている. 配列長は Bytecodes::number_of_codes)
(上記の配列フィールドは全て, ポインタ型ではなく実体なので, 配列用のメモリ領域は初期段階で自動的に確保される)
そのメモリ領域中に個別の Template オブジェクトを書き込む作業は Template::initialize() 内で(のみ)行われている.
内部的には, 以下のフィールドを保持している.
これらにコードレットの情報(コードレットに入るときの TOS 状態/出るときの TOS 状態, 対応するマシン語列を生成する生成関数の情報, 等)を格納している.
((cite: hotspot/src/share/vm/interpreter/templateTable.hpp))
int _flags; // describes interpreter template properties (bcp unknown)
TosState _tos_in; // tos cache state before template execution
TosState _tos_out; // tos cache state after template execution
generator _gen; // template code generator
int _arg; // argument for template code generator
(なお, Template クラス自体はコード生成は行わない. Template クラスはコードを生成するための関数等の情報を記録しているだけで, 実際の生成処理はここに記録されている関数 (= TemplateTable のメソッド) が行う. (See: Template::generate()))
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.