hotspot/src/share/vm/runtime/rframe.cpp
RFrame* RFrame::caller() {
{- -------------------------------------------
(1) 既に _caller フィールドに値がキャッシュされていれば, それをリターン.
---------------------------------------- -}
if (_caller != noCallerYet) return (_caller == noCaller) ? NULL : _caller; // already computed caller
{- -------------------------------------------
(1) (以下は, まだ caller を計算したことがないので, 今回計算する場合のパス)
---------------------------------------- -}
// caller not yet computed; do it now
{- -------------------------------------------
(1) 条件に応じて以下のどれかをリターンする
(ついでに結果を _caller フィールドにキャッシュ)
* このフレームが, スタック中で一番最初の java frame であれば,
(呼び出し元に当たるメソッドはないので) NULL をリターン.
* 先頭の java frame でなければ, new_RFrame() を呼んで
呼び出し元のフレームを示す RFrame オブジェクトを生成し, リターン.
(なお, チェックを高速にするためか,
まず is_first_java_frame() で簡単にチェックし,
その後 real_sender() を使ってちゃんとチェックしている模様)
---------------------------------------- -}
if (_fr.is_first_java_frame()) {
_caller = (RFrame*)noCaller;
return NULL;
}
RegisterMap map(_thread, false);
frame sender = _fr.real_sender(&map);
if (sender.is_java_frame()) {
_caller = new_RFrame(sender, thread(), this);
return _caller;
}
// Real caller is not java related
_caller = (RFrame*)noCaller;
return NULL;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.