hotspot/src/share/vm/interpreter/templateInterpreter.cpp
void TemplateInterpreterGenerator::set_entry_points(Bytecodes::Code code) {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
CodeletMark cm(_masm, Bytecodes::name(code), code);
// initialize entry points
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(_unimplemented_bytecode != NULL, "should have been generated before");
assert(_illegal_bytecode_sequence != NULL, "should have been generated before");
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
address bep = _illegal_bytecode_sequence;
address cep = _illegal_bytecode_sequence;
address sep = _illegal_bytecode_sequence;
address aep = _illegal_bytecode_sequence;
address iep = _illegal_bytecode_sequence;
address lep = _illegal_bytecode_sequence;
address fep = _illegal_bytecode_sequence;
address dep = _illegal_bytecode_sequence;
address vep = _unimplemented_bytecode;
address wep = _unimplemented_bytecode;
{- -------------------------------------------
(1) wide prefix 付きではないバイトコードであれば,
TemplateInterpreterGenerator::set_short_entry_points() によって,
対応するコードを生成し, 各 TOS 状態用のエントリポイントアドレスを取得する.
---------------------------------------- -}
// code for short & wide version of bytecode
if (Bytecodes::is_defined(code)) {
Template* t = TemplateTable::template_for(code);
assert(t->is_valid(), "just checking");
set_short_entry_points(t, bep, cep, sep, aep, iep, lep, fep, dep, vep);
}
{- -------------------------------------------
(1) wide prefix 付きのバイトコードであれば,
TemplateInterpreterGenerator::set_wide_entry_point() によって,
対応するコードを生成し, エントリポイントアドレスを取得する.
---------------------------------------- -}
if (Bytecodes::wide_is_defined(code)) {
Template* t = TemplateTable::template_for_wide(code);
assert(t->is_valid(), "just checking");
set_wide_entry_point(t, wep);
}
{- -------------------------------------------
(1) 取得したエントリポイントを, dispatch table 内の該当するエントリにセットする.
(= Interpreter::_normal_table 及び Interpreter::_wentry_point[code] にセット).
---------------------------------------- -}
// set entry points
EntryPoint entry(bep, cep, sep, aep, iep, lep, fep, dep, vep);
Interpreter::_normal_table.set_entry(code, entry);
Interpreter::_wentry_point[code] = wep;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.