Top


定義場所(file name)

hotspot/src/share/vm/runtime/rframe.cpp

名前(function name)

RFrame* RFrame::caller() {

本体部(body)

  {- -------------------------------------------
  (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.