これらは, メソッド中の各バイトコード命令の情報にアクセスするためのユーティリティ・クラス.
これらは, バイトコード情報を用いた作業中に使用されるユーティリティ・クラス.
例えば, bytecode 中から指定したオペランドを取り出すメソッド(Bytecode::get_index_u1(), Bytecode::get_index_u2(), etc)や, 指定の bytecode の命令長を取得するメソッド(Bytecode::instruction_size()) 等が用意されている.
また, Bytecode クラスのサブクラス (Bytecode_lookupswitch, Bytecode_tableswitch, Bytecode_member_ref, etc) では, それぞれの命令のオペランドに特化した取得メソッドが提供されている.
例: lookupswitch 命令の場合 (デフォルトのオフセット, ペア数, n 番目のペア, 等の情報を取得するメソッドが用意されている)
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Attributes
int default_offset() const { return get_Java_u4_at(aligned_offset(1 + 0*jintSize)); }
int number_of_pairs() const { return get_Java_u4_at(aligned_offset(1 + 1*jintSize)); }
LookupswitchPair pair_at(int i) const {
assert(0 <= i && i < number_of_pairs(), "pair index out of bounds");
return LookupswitchPair(aligned_addr_at(1 + (1 + i)*2*jintSize));
}
メソッド中の各バイトコード命令の情報にアクセスするためのユーティリティ・クラス(StackObjクラス)の基底クラス.
なお, このクラスは abstract class ではない (ただし StackObj クラスというよりは ValueObj クラスに近い使われ方をしている).
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// The base class for different kinds of bytecode abstractions.
// Provides the primitive operations to manipulate code relative
// to the bcp.
class Bytecode: public StackObj {
使う際には, 操作対象としたい bytecode 命令の bcp をコンストラクタに指定してインスタンスを生成する模様 (bcp の指定には, methodOop と address を使用).
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
Bytecode(methodOop method, address bcp): _bcp(bcp), _code(Bytecodes::code_at(method, addr_at(0))) {
assert(method != NULL, "this form requires a valid methodOop");
}
以下の箇所で(のみ)生成されている.
See: here for details
lookupswitch 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
class Bytecode_lookupswitch: public Bytecode {
See: here for details
lookupswitch 命令中の match-offset pair オペランドを表すクラス. 1つの LookupswitchPair オブジェクトが 1つの match-offset pair (1 組の match-offset からなる 8byte の情報) に対応する.
(match-offset pair の情報を取得するための LookupswitchPair::match() メソッド, 及び LookupswitchPair::offset() メソッドを備える)
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Abstractions for lookupswitch bytecode
class LookupswitchPair VALUE_OBJ_CLASS_SPEC {
Bytecode_lookupswitch::pair_at() で生成される (他に生成箇所はあるか?? #TODO).
See: here for details
tableswitch 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
class Bytecode_tableswitch: public Bytecode {
See: here for details
メソッド呼び出し用のバイトコード, およびフィールドアクセス用のバイトコードを表す Bytecode クラスの基底クラス.
なお, このクラス自体は abstract class であり, 実際に使われるのはサブクラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Common code for decoding invokes and field references.
class Bytecode_member_ref: public Bytecode {
See: here for details
メソッド呼び出しに関するバイトコード命令 (invoke{virtual|static|interface|special}) 用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Abstraction for invoke_{virtual, static, interface, special}
class Bytecode_invoke: public Bytecode_member_ref {
See: here for details
フィールドアクセスに関するバイトコード命令 ((put|get}{field|static}) 用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Abstraction for all field accesses (put/get field/static)
class Bytecode_field: public Bytecode_member_ref {
See: here for details
checkcast 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Abstraction for checkcast
class Bytecode_checkcast: public Bytecode {
See: here for details
instanceof 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Abstraction for instanceof
class Bytecode_instanceof: public Bytecode {
See: here for details
new 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
class Bytecode_new: public Bytecode {
See: here for details
multianewarray 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
class Bytecode_multianewarray: public Bytecode {
See: here for details
anewarray 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
class Bytecode_anewarray: public Bytecode {
See: here for details
ldc, ldc_w 及び ldc2_w 命令用の Bytecode クラス.
((cite: hotspot/src/share/vm/interpreter/bytecode.hpp))
// Abstraction for ldc, ldc_w and ldc2_w
class Bytecode_loadconstant: public Bytecode {
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.