Top


定義場所(file name)

hotspot/src/share/vm/prims/jvmtiEnv.cpp

名前(function name)

jvmtiError
JvmtiEnv::NotifyFramePop(JavaThread* java_thread, jint depth) {

本体部(body)

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      ResourceMark rm;
      uint32_t debug_bits = 0;

  {- -------------------------------------------
  (1) 
      ---------------------------------------- -}

      JvmtiThreadState *state = JvmtiThreadState::state_for(java_thread);
      if (state == NULL) {
        return JVMTI_ERROR_THREAD_NOT_ALIVE;
      }

      if (!JvmtiEnv::is_thread_fully_suspended(java_thread, true, &debug_bits)) {
          return JVMTI_ERROR_THREAD_NOT_SUSPENDED;
      }

      if (TraceJVMTICalls) {
        JvmtiSuspendControl::print();
      }

      vframe *vf = vframeFor(java_thread, depth);
      if (vf == NULL) {
        return JVMTI_ERROR_NO_MORE_FRAMES;
      }

      if (!vf->is_java_frame() || ((javaVFrame*) vf)->method()->is_native()) {
        return JVMTI_ERROR_OPAQUE_FRAME;
      }

  {- -------------------------------------------
  (1) (assert)
      ---------------------------------------- -}

      assert(vf->frame_pointer() != NULL, "frame pointer mustn't be NULL");

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      int frame_number = state->count_frames() - depth;

  {- -------------------------------------------
  (1) JvmtiEnvThreadState::set_frame_pop() を呼んで, 指定された frame 番号(frame_number)を記録する.
      ---------------------------------------- -}

      state->env_thread_state(this)->set_frame_pop(frame_number);

  {- -------------------------------------------
  (1) リターン
      ---------------------------------------- -}

      return JVMTI_ERROR_NONE;
    } /* end NotifyFramePop */

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.