JIT Compiler から Symbol オブジェクトにアクセスするための一時オブジェクト(ResourceObjクラス). 1つの ciSymbol オブジェクトが 1つの Symbol オブジェクトに対応する.
(なお, ciSymbol オブジェクトを生成すると対応する Symbol オブジェクトの reference count がインクリメントされる. このため使用中に削除されることはない)
((cite: hotspot/src/share/vm/ci/ciSymbol.hpp))
// ciSymbol
//
// This class represents a Symbol* in the HotSpot virtual
// machine.
class ciSymbol : public ResourceObj {
以下の箇所に格納されている (#TODO 他の箇所).
vmSymbols 内の全ての Symbol オブジェクトに対応する ciSymbol を納めたフィールド.
(正確には, このフィールドは ciSymbol の配列を格納するフィールド. この中に, vmSymbols 内の全ての Symbol に対応する ciSymbol オブジェクトが格納されている)
なお, このフィールドは現在は以下のパスで(のみ)参照されている.
ciEnv::get_symbol() -> ciObjectFactory::get_symbol() -> ciObjectFactory::vm_symbol_at()
生成した ciSymbol を記録しておくためのフィールド (なお, 記録しているのはインクリメントした reference count を最後に戻す必要があるため).
(正確には, このフィールドは ciSymbol の GrowableArray を格納するフィールド. この中に, ciObjectFactory::get_symbol() で生成した全ての ciSymbol オブジェクトが格納されている)
以下の箇所で(のみ)生成されている.
(ciObjectFactory::_shared_ci_symbols フィールドの初期化用)
(ファクトリメソッド)
コンストラクタ内で, 対応する Symbol オブジェクトの reference count がインクリメントされる.
((cite: hotspot/src/share/vm/ci/ciSymbol.cpp))
// ------------------------------------------------------------------
// ciSymbol::ciSymbol
//
// Preallocated symbol variant. Used with symbols from vmSymbols.
ciSymbol::ciSymbol(Symbol* s, vmSymbols::SID sid)
: _symbol(s), _sid(sid)
{
assert(_symbol != NULL, "adding null symbol");
_symbol->increment_refcount(); // increment ref count
assert(sid_ok(), "must be in vmSymbols");
}
// Normal case for non-famous symbols.
ciSymbol::ciSymbol(Symbol* s)
: _symbol(s), _sid(vmSymbols::NO_SID)
{
assert(_symbol != NULL, "adding null symbol");
_symbol->increment_refcount(); // increment ref count
assert(sid_ok(), "must not be in vmSymbols");
}
なお, reference count を元に戻す処理は, 現在は以下のパスで(のみ)行われている.
ciEnv::~ciEnv() -> ciObjectFactory::remove_symbols()
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.