hotspot/src/share/vm/prims/jvmtiImpl.cpp
void GrowableCache::recache() {
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
int len = _elements->length();
{- -------------------------------------------
(1) _cache フィールドのメモリを開放し, 再度現在の長さ(+1)で確保し直す.
---------------------------------------- -}
FREE_C_HEAP_ARRAY(address, _cache);
_cache = NEW_C_HEAP_ARRAY(address,len+1);
{- -------------------------------------------
(1) _elements 中の各要素に対して
GrowableElement::getCacheValue() (をサブクラスがオーバーライドしたもの) を呼び出し,
その結果を _cache 内に詰めていく.
(なお, getCacheValue() の返値として NULL を返す要素があった場合,
GrowableCache::remove() を呼んでその要素を除去している (このパスはあり得なさそうだが...).
_cache の値は GrowableCache::remove() 内で呼び出される GrowableCache::recache() によって
セットされるので, 呼び出し後には何もせずにリターン.)
---------------------------------------- -}
for (int i=0; i<len; i++) {
_cache[i] = _elements->at(i)->getCacheValue();
//
// The cache entry has gone bad. Without a valid frame pointer
// value, the entry is useless so we simply delete it in product
// mode. The call to remove() will rebuild the cache again
// without the bad entry.
//
if (_cache[i] == NULL) {
assert(false, "cannot recache NULL elements");
remove(i);
return;
}
}
{- -------------------------------------------
(1) _cache の最後には NULL を詰めておく.
---------------------------------------- -}
_cache[len] = NULL;
{- -------------------------------------------
(1) (_cache のアドレスを変更したので)
_listener_fun フィールドに格納されているコールバックを呼び出しておく.
---------------------------------------- -}
_listener_fun(_this_obj,_cache);
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.